UNPKG

3.02 kBtext/coffeescriptView Raw
1_ = require 'underscore'
2dotty = require 'dotty'
3fs = require 'fs'
4Readable = require 'readable-stream'
5sinon = require 'sinon'
6Understream = require 'understream'
7_.mixin require('underscore.string').exports()
8
9module.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