1 | _ = require 'underscore'
|
2 | dotty = require 'dotty'
|
3 | fs = require 'fs'
|
4 | Readable = require 'readable-stream'
|
5 | sinon = require 'sinon'
|
6 | Understream = require 'understream'
|
7 | _.mixin require('underscore.string').exports()
|
8 |
|
9 | module.exports = (api_key, data_dir) ->
|
10 | throw new Error "Must provide api_key" unless api_key?
|
11 | throw new Error "Must provide data_dir" unless data_dir?
|
12 |
|
13 | clever = require("./index") api_key, "localhost"
|
14 |
|
15 | trequire = (fp) ->
|
16 | val = null
|
17 | if fs.existsSync("#{fp}.coffee") or fs.existsSync("#{fp}.js") or fs.existsSync("#{fp}.json")
|
18 | try
|
19 | val = require(fp)
|
20 | catch err
|
21 | throw new Error "Error loading file at #{fp}: #{err}"
|
22 | return val or []
|
23 |
|
24 | clever.db =
|
25 | districts: trequire("#{data_dir}/districts")
|
26 | districtproperties: trequire("#{data_dir}/districtproperties")
|
27 | students: trequire("#{data_dir}/students")
|
28 | studentproperties: trequire("#{data_dir}/studentproperties")
|
29 | teachers: trequire("#{data_dir}/teachers")
|
30 | teacherproperties: trequire("#{data_dir}/teacherproperties")
|
31 | schools: trequire("#{data_dir}/schools")
|
32 | schoolproperties: trequire("#{data_dir}/schoolproperties")
|
33 |
|
34 | sandbox = sinon.sandbox.create()
|
35 |
|
36 | apply_query = (undersomething, conditions, resource) ->
|
37 | return undersomething.filter (obj) ->
|
38 | for key, val of conditions
|
39 | return false unless obj[key] is val
|
40 | return true
|
41 | .map (obj) ->
|
42 | if obj._shadow? then _.extend({}, obj, obj._shadow) else obj
|
43 | .map (raw_json) ->
|
44 | Klass = clever[_(resource).chain().capitalize().rtrim('s').value()]
|
45 | return new Klass raw_json
|
46 |
|
47 | sandbox.stub clever.Query.prototype, 'exec', (cb) ->
|
48 | resource = _.strRightBack(@_url, '/')
|
49 | s = apply_query _(clever.db[resource]).chain(), @_conditions, resource
|
50 | cb null, s.value()
|
51 |
|
52 | sandbox.stub clever.Query.prototype, 'stream', ->
|
53 | resource = _.strRightBack(@_url, '/')
|
54 | s = apply_query new Understream(clever.db[resource]), @_conditions, resource
|
55 | return s.stream()
|
56 |
|
57 | sandbox.stub clever.Resource.prototype, 'properties', (obj, cb) ->
|
58 | if arguments.length is 1
|
59 | cb = obj
|
60 | obj = undefined
|
61 | else if arguments.length isnt 2
|
62 | throw new Error("expected 1 or 2 arguments to properties")
|
63 | resource = @constructor.name.toLowerCase() + 's'
|
64 | resource_singular = _(resource).rtrim('s')
|
65 | id = @_properties.id
|
66 | clever_resource = _(clever.db[resource]).findWhere({id:id})
|
67 | return cb(new Error("404")) unless clever_resource?
|
68 | prop_obj = _(clever.db["#{resource_singular}properties"])
|
69 | .findWhere(_.object [[resource_singular, id]])
|
70 | if not prop_obj
|
71 | prop_obj = _.object [[resource_singular, id], ['data', {}]]
|
72 | clever.db["#{resource_singular}properties"].push prop_obj
|
73 | if obj
|
74 | dotty.put prop_obj.data, k, v for k, v of obj
|
75 | if obj.google_apps?.username?
|
76 | clever_resource._shadow ?= {}
|
77 | clever_resource._shadow.email = obj.google_apps.username
|
78 | return cb null, prop_obj.data
|
79 |
|
80 | clever
|