scribe-js 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG +1 -0
- data/Gemfile +8 -0
- data/Gemfile.lock +93 -0
- data/LICENSE +21 -0
- data/Manifest +26 -0
- data/README.rdoc +0 -0
- data/Rakefile +37 -0
- data/assets/scripts/coffee/scribe/datastore.coffee +73 -0
- data/assets/scripts/coffee/scribe/factory/entity_factory.coffee +14 -0
- data/assets/scripts/coffee/scribe/factory/entity_mapper.coffee +21 -0
- data/assets/scripts/coffee/scribe/factory/reference_property.coffee +9 -0
- data/assets/scripts/coffee/scribe/repositories/entity_metadata.coffee +28 -0
- data/assets/scripts/coffee/scribe/repositories/entity_repository.coffee +64 -0
- data/bin/scribe.js +12 -0
- data/config/assets.rb +7 -0
- data/lib/scribe.rb +1 -0
- data/lib/scribe/symbols.rb +17 -0
- data/scribe-js.gemspec +36 -0
- data/spec/jasmine.yml +44 -0
- data/spec/runner.html +65 -0
- data/spec/support/classes.coffee +86 -0
- data/spec/support/helpers.coffee +22 -0
- data/spec/support/mocks.coffee +0 -0
- data/spec/support/objects.coffee +0 -0
- data/spec/support/requirements.coffee +0 -0
- data/spec/tests/datastore_spec.coffee +90 -0
- metadata +115 -0
data/CHANGELOG
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
v0.0.1 new library
|
data/Gemfile
ADDED
data/Gemfile.lock
ADDED
@@ -0,0 +1,93 @@
|
|
1
|
+
GIT
|
2
|
+
remote: git://github.com/jpeace/keystone.git
|
3
|
+
revision: 3680c30328bf3b93af7c7f1b1bad685cbaec35dd
|
4
|
+
specs:
|
5
|
+
keystone (0.0.1)
|
6
|
+
closure-compiler
|
7
|
+
coffee-script
|
8
|
+
sass
|
9
|
+
sinatra
|
10
|
+
|
11
|
+
GEM
|
12
|
+
remote: http://rubygems.org/
|
13
|
+
specs:
|
14
|
+
allison (2.0.3)
|
15
|
+
childprocess (0.3.9)
|
16
|
+
ffi (~> 1.0, >= 1.0.11)
|
17
|
+
closure-compiler (1.1.8)
|
18
|
+
coffee-script (2.2.0)
|
19
|
+
coffee-script-source
|
20
|
+
execjs
|
21
|
+
coffee-script-source (1.6.2)
|
22
|
+
diff-lcs (1.2.4)
|
23
|
+
echoe (4.6.3)
|
24
|
+
allison (>= 2.0.3)
|
25
|
+
gemcutter (>= 0.7.0)
|
26
|
+
rake (>= 0.9.2)
|
27
|
+
rdoc (>= 3.6.1)
|
28
|
+
rubyforge (>= 2.0.4)
|
29
|
+
execjs (1.4.0)
|
30
|
+
multi_json (~> 1.0)
|
31
|
+
ffi (1.8.1)
|
32
|
+
gemcutter (0.7.1)
|
33
|
+
hike (1.2.2)
|
34
|
+
jasmine (1.3.2)
|
35
|
+
jasmine-core (~> 1.3.1)
|
36
|
+
rack (~> 1.0)
|
37
|
+
rspec (>= 1.3.1)
|
38
|
+
selenium-webdriver (>= 0.1.3)
|
39
|
+
jasmine-core (1.3.1)
|
40
|
+
jasmine-headless-webkit (0.8.4)
|
41
|
+
coffee-script
|
42
|
+
jasmine-core (~> 1.1)
|
43
|
+
multi_json
|
44
|
+
rainbow
|
45
|
+
sprockets (~> 2)
|
46
|
+
json (1.7.7)
|
47
|
+
json_pure (1.7.7)
|
48
|
+
multi_json (1.7.2)
|
49
|
+
rack (1.5.2)
|
50
|
+
rack-protection (1.5.0)
|
51
|
+
rack
|
52
|
+
rainbow (1.1.4)
|
53
|
+
rake (10.0.4)
|
54
|
+
rdoc (4.0.1)
|
55
|
+
json (~> 1.4)
|
56
|
+
rspec (2.13.0)
|
57
|
+
rspec-core (~> 2.13.0)
|
58
|
+
rspec-expectations (~> 2.13.0)
|
59
|
+
rspec-mocks (~> 2.13.0)
|
60
|
+
rspec-core (2.13.1)
|
61
|
+
rspec-expectations (2.13.0)
|
62
|
+
diff-lcs (>= 1.1.3, < 2.0)
|
63
|
+
rspec-mocks (2.13.1)
|
64
|
+
rubyforge (2.0.4)
|
65
|
+
json_pure (>= 1.1.7)
|
66
|
+
rubyzip (0.9.9)
|
67
|
+
sass (3.2.8)
|
68
|
+
selenium-webdriver (2.32.1)
|
69
|
+
childprocess (>= 0.2.5)
|
70
|
+
multi_json (~> 1.0)
|
71
|
+
rubyzip
|
72
|
+
websocket (~> 1.0.4)
|
73
|
+
sinatra (1.4.2)
|
74
|
+
rack (~> 1.5, >= 1.5.2)
|
75
|
+
rack-protection (~> 1.4)
|
76
|
+
tilt (~> 1.3, >= 1.3.4)
|
77
|
+
sprockets (2.9.3)
|
78
|
+
hike (~> 1.2)
|
79
|
+
multi_json (~> 1.0)
|
80
|
+
rack (~> 1.0)
|
81
|
+
tilt (~> 1.1, != 1.3.0)
|
82
|
+
tilt (1.3.7)
|
83
|
+
websocket (1.0.7)
|
84
|
+
|
85
|
+
PLATFORMS
|
86
|
+
ruby
|
87
|
+
|
88
|
+
DEPENDENCIES
|
89
|
+
echoe
|
90
|
+
jasmine
|
91
|
+
jasmine-headless-webkit
|
92
|
+
keystone!
|
93
|
+
rake
|
data/LICENSE
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
The MIT License (MIT)
|
2
|
+
|
3
|
+
Copyright (c) 2013 Tim Shelburne
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
7
|
+
in the Software without restriction, including without limitation the rights
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
10
|
+
furnished to do so, subject to the following conditions:
|
11
|
+
|
12
|
+
The above copyright notice and this permission notice shall be included in
|
13
|
+
all copies or substantial portions of the Software.
|
14
|
+
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
21
|
+
THE SOFTWARE.
|
data/Manifest
ADDED
@@ -0,0 +1,26 @@
|
|
1
|
+
CHANGELOG
|
2
|
+
Gemfile
|
3
|
+
Gemfile.lock
|
4
|
+
LICENSE
|
5
|
+
Manifest
|
6
|
+
README.rdoc
|
7
|
+
Rakefile
|
8
|
+
assets/scripts/coffee/scribe/datastore.coffee
|
9
|
+
assets/scripts/coffee/scribe/factory/entity_factory.coffee
|
10
|
+
assets/scripts/coffee/scribe/factory/entity_mapper.coffee
|
11
|
+
assets/scripts/coffee/scribe/factory/reference_property.coffee
|
12
|
+
assets/scripts/coffee/scribe/repositories/entity_metadata.coffee
|
13
|
+
assets/scripts/coffee/scribe/repositories/entity_repository.coffee
|
14
|
+
bin/scribe.js
|
15
|
+
config/assets.rb
|
16
|
+
lib/scribe.rb
|
17
|
+
lib/scribe/symbols.rb
|
18
|
+
scribe-js.gemspec
|
19
|
+
spec/jasmine.yml
|
20
|
+
spec/runner.html
|
21
|
+
spec/support/classes.coffee
|
22
|
+
spec/support/helpers.coffee
|
23
|
+
spec/support/mocks.coffee
|
24
|
+
spec/support/objects.coffee
|
25
|
+
spec/support/requirements.coffee
|
26
|
+
spec/tests/datastore_spec.coffee
|
data/README.rdoc
ADDED
File without changes
|
data/Rakefile
ADDED
@@ -0,0 +1,37 @@
|
|
1
|
+
$: << File.expand_path("#{File.dirname(__FILE__)}/lib")
|
2
|
+
|
3
|
+
require 'scribe'
|
4
|
+
|
5
|
+
require 'rake'
|
6
|
+
require 'jasmine-headless-webkit'
|
7
|
+
require 'keystone'
|
8
|
+
require 'echoe'
|
9
|
+
|
10
|
+
Echoe.new("scribe-js") do |p|
|
11
|
+
p.author = "Tim Shelburne"
|
12
|
+
p.email = "shelburt02@gmail.com"
|
13
|
+
p.url = "https://github.com/tshelburne/scribe-js"
|
14
|
+
|
15
|
+
p.ignore_pattern = FileList[".gitignore"]
|
16
|
+
p.development_dependencies = [ "jasmine", "jasmine-headless-webkit" ]
|
17
|
+
end
|
18
|
+
|
19
|
+
desc "Default"
|
20
|
+
task default: :'test:jasmine'
|
21
|
+
|
22
|
+
namespace :test do
|
23
|
+
|
24
|
+
desc "Run Jasmine tests"
|
25
|
+
Jasmine::Headless::Task.new(jasmine: :assets) do |t|
|
26
|
+
t.colors = true
|
27
|
+
t.keep_on_error = true
|
28
|
+
t.jasmine_config = './spec/jasmine.yml'
|
29
|
+
end
|
30
|
+
|
31
|
+
end
|
32
|
+
|
33
|
+
desc "Build assets"
|
34
|
+
Keystone::RakeTask.new :assets do |t|
|
35
|
+
t.config_file = "config/assets.rb"
|
36
|
+
t.output_path = 'bin'
|
37
|
+
end
|
@@ -0,0 +1,73 @@
|
|
1
|
+
EntityRepository = require "scribe/repositories/entity_repository"
|
2
|
+
EntityFactory = require "scribe/factory/entity_factory"
|
3
|
+
|
4
|
+
#
|
5
|
+
# @author - Tim Shelburne <tim@musiconelive.com>
|
6
|
+
#
|
7
|
+
# a container for all entities within the domain
|
8
|
+
#
|
9
|
+
class DataStore
|
10
|
+
constructor: (@entityFactory)->
|
11
|
+
@repos = []
|
12
|
+
|
13
|
+
@default: (mappers)->
|
14
|
+
new @(new EntityFactory(mappers))
|
15
|
+
|
16
|
+
buildEntity: (entityType, entityConfig, buildReferences = true)->
|
17
|
+
@getRepository(entityType).add(@entityFactory.build(entityType, entityConfig))
|
18
|
+
|
19
|
+
@rebuildReferences() if buildReferences
|
20
|
+
|
21
|
+
buildEntities: (entityType, entityConfigs, buildReferences = true)->
|
22
|
+
for config in entityConfigs
|
23
|
+
@buildEntity entityType, config, false
|
24
|
+
|
25
|
+
@rebuildReferences() if buildReferences
|
26
|
+
|
27
|
+
rebuildReferences: ->
|
28
|
+
for repo in @repos # loop through all repositories
|
29
|
+
if (repo.numEntities() > 0 and repo.hasReferences()) # check that entities in this repository have reference properties
|
30
|
+
allEntities = repo.findAll()
|
31
|
+
for entity in allEntities # loop through all entities in this repository
|
32
|
+
if not entity.hydrated # if the entity isn't hydrated, build references and collections
|
33
|
+
# handle hydrating the individual references
|
34
|
+
referencesBuilt = 0
|
35
|
+
for propName in repo.metadata.references
|
36
|
+
referenceProperty = entity[propName]
|
37
|
+
refRefo = @getRepository(referenceProperty.entityType)
|
38
|
+
entityReference = if refRefo? then refRefo.find(referenceProperty.entityId) else null
|
39
|
+
if entityReference?
|
40
|
+
referencesBuilt++
|
41
|
+
entity[propName] = entityReference
|
42
|
+
|
43
|
+
# handle hydrating reference collections
|
44
|
+
collectionsBuilt = 0
|
45
|
+
for collectionPropName in repo.metadata.referenceCollections
|
46
|
+
|
47
|
+
collectionReferencesBuilt = 0
|
48
|
+
for refIndex, referenceProperty of entity[collectionPropName]
|
49
|
+
collRefRepo = @getRepository(referenceProperty.entityType)
|
50
|
+
entityReference = if collRefRepo? then collRefRepo.find(referenceProperty.entityId) else null
|
51
|
+
if entityReference?
|
52
|
+
collectionReferencesBuilt++
|
53
|
+
entity[collectionPropName][refIndex] = entityReference
|
54
|
+
if collectionReferencesBuilt == entity[collectionPropName].length
|
55
|
+
collectionsBuilt++
|
56
|
+
|
57
|
+
# check whether all references for this entity were built
|
58
|
+
if referencesBuilt == repo.numReferenceProperties() and collectionsBuilt == repo.numReferenceCollections()
|
59
|
+
entity.hydrated = true
|
60
|
+
|
61
|
+
getRepository: (entityType)->
|
62
|
+
for repo in @repos
|
63
|
+
if repo.canHandle entityType
|
64
|
+
return repo
|
65
|
+
|
66
|
+
newRepo = new EntityRepository(entityType)
|
67
|
+
@repos.push newRepo
|
68
|
+
return newRepo
|
69
|
+
|
70
|
+
find: (entityType, id)->
|
71
|
+
@getRepository(entityType).find(id)
|
72
|
+
|
73
|
+
return DataStore
|
@@ -0,0 +1,14 @@
|
|
1
|
+
#
|
2
|
+
# @author - Tim Shelburne <tim@musiconelive.com>
|
3
|
+
#
|
4
|
+
# a class responsible for building entities of various types
|
5
|
+
#
|
6
|
+
class EntityFactory
|
7
|
+
constructor: (@mappers)->
|
8
|
+
|
9
|
+
build: (type, config)->
|
10
|
+
for mapper in @mappers
|
11
|
+
return mapper.handle(config) if mapper.canHandle(type)
|
12
|
+
return null
|
13
|
+
|
14
|
+
return EntityFactory
|
@@ -0,0 +1,21 @@
|
|
1
|
+
#
|
2
|
+
# @author - Tim Shelburne <tim@musiconelive.com>
|
3
|
+
#
|
4
|
+
# the base data mapper
|
5
|
+
#
|
6
|
+
class EntityMapper
|
7
|
+
constructor: ()->
|
8
|
+
@type = null
|
9
|
+
|
10
|
+
canHandle: (type)->
|
11
|
+
type is @type
|
12
|
+
|
13
|
+
handle: (config)->
|
14
|
+
entity = @buildEntity(config)
|
15
|
+
entity.entityType = @type
|
16
|
+
entity
|
17
|
+
|
18
|
+
buildEntity: (config)->
|
19
|
+
alert "You must override the buildEntity() function to create a data mapper."
|
20
|
+
|
21
|
+
return EntityMapper
|
@@ -0,0 +1,28 @@
|
|
1
|
+
#
|
2
|
+
# @author - Tim Shelburne <tim@musiconelive.com>
|
3
|
+
#
|
4
|
+
# a class to contain metadata about a given entity
|
5
|
+
#
|
6
|
+
class EntityMetadata
|
7
|
+
|
8
|
+
constructor: (entity)->
|
9
|
+
@type = entity.entityType
|
10
|
+
@properties = []
|
11
|
+
@references = []
|
12
|
+
@referenceCollections = []
|
13
|
+
|
14
|
+
for prop, value of entity
|
15
|
+
if value instanceof Array and value.length > 0 and @isReference(value[0])
|
16
|
+
@referenceCollections.push(prop)
|
17
|
+
else if @isReference(value)
|
18
|
+
@references.push(prop)
|
19
|
+
else
|
20
|
+
@properties.push prop
|
21
|
+
|
22
|
+
isReference: (value)->
|
23
|
+
value.hasOwnProperty("entityType") and value.hasOwnProperty("entityId")
|
24
|
+
|
25
|
+
hasReferences: ->
|
26
|
+
@references.length > 0 or @referenceCollections.length > 0
|
27
|
+
|
28
|
+
return EntityMetadata
|
@@ -0,0 +1,64 @@
|
|
1
|
+
EntityMetadata = require "scribe/repositories/entity_metadata"
|
2
|
+
|
3
|
+
#
|
4
|
+
# @author - Tim Shelburne <tim@musiconelive.com>
|
5
|
+
#
|
6
|
+
# contains all entities of a given type
|
7
|
+
#
|
8
|
+
class EntityRepository
|
9
|
+
|
10
|
+
constructor: (@type)->
|
11
|
+
@entityList = []
|
12
|
+
@metadata = null
|
13
|
+
|
14
|
+
canHandle: (type)->
|
15
|
+
@type == type
|
16
|
+
|
17
|
+
hasReferences: ->
|
18
|
+
@metadata.hasReferences()
|
19
|
+
|
20
|
+
add: (entity)->
|
21
|
+
unless @metadata?
|
22
|
+
@metadata = new EntityMetadata(entity)
|
23
|
+
@entityList.push entity
|
24
|
+
|
25
|
+
remove: (entity)->
|
26
|
+
@entityList.splice @entityList.indexOf(entity), 1
|
27
|
+
|
28
|
+
find: (id)->
|
29
|
+
for entity in @entityList
|
30
|
+
return entity if entity.id == id
|
31
|
+
null
|
32
|
+
|
33
|
+
findAll: ->
|
34
|
+
@entityList
|
35
|
+
|
36
|
+
findBy: (criteria)->
|
37
|
+
results = []
|
38
|
+
for entity in @entityList
|
39
|
+
if @isMatch(entity, criteria)
|
40
|
+
results.push entity
|
41
|
+
results
|
42
|
+
|
43
|
+
findOneBy: (criteria)->
|
44
|
+
for entity in @entityList
|
45
|
+
if @isMatch(entity, criteria)
|
46
|
+
return entity
|
47
|
+
null
|
48
|
+
|
49
|
+
isMatch: (entity, criteria)->
|
50
|
+
match = true
|
51
|
+
for prop, value of criteria
|
52
|
+
match = if match then entity[prop] == criteria[prop] else false
|
53
|
+
match
|
54
|
+
|
55
|
+
numEntities: ->
|
56
|
+
@entityList.length
|
57
|
+
|
58
|
+
numReferenceProperties: ->
|
59
|
+
@metadata.references.length
|
60
|
+
|
61
|
+
numReferenceCollections: ->
|
62
|
+
@metadata.referenceCollections.length
|
63
|
+
|
64
|
+
return EntityRepository
|
data/bin/scribe.js
ADDED
@@ -0,0 +1,12 @@
|
|
1
|
+
(function(){var a=window.modules||[],b=null;a.scribe__datastore=function(){if(null===b){var a,c;c=require("scribe/repositories/entity_repository");a=require("scribe/factory/entity_factory");var f=function(e){this.entityFactory=e;this.repos=[]};f["default"]=function(e){return new this(new a(e))};f.prototype.buildEntity=function(e,z,c){null==c&&(c=!0);this.getRepository(e).add(this.entityFactory.build(e,z));if(c)return this.rebuildReferences()};f.prototype.buildEntities=function(e,c,f){var b,a,d;null==
|
2
|
+
f&&(f=!0);a=0;for(d=c.length;a<d;a++)b=c[a],this.buildEntity(e,b,!1);if(f)return this.rebuildReferences()};f.prototype.rebuildReferences=function(){var e,c,f,b,a,d,n,u,v,w,p,x,j,h,y,l,m;l=this.repos;m=[];h=0;for(y=l.length;h<y;h++)j=l[h],0<j.numEntities()&&j.hasReferences()?(e=j.findAll(),m.push(function(){var h,k,m,s,q,l,r;r=[];h=0;for(m=e.length;h<m;h++)if(d=e[h],d.hydrated)r.push(void 0);else{x=0;q=j.metadata.references;k=0;for(s=q.length;k<s;k++)u=q[k],p=d[u],w=this.getRepository(p.entityType),
|
3
|
+
n=null!=w?w.find(p.entityId):null,null!=n&&(x++,d[u]=n);a=0;q=j.metadata.referenceCollections;k=0;for(s=q.length;k<s;k++){f=q[k];b=0;l=d[f];for(v in l)p=l[v],c=this.getRepository(p.entityType),n=null!=c?c.find(p.entityId):null,null!=n&&(b++,d[f][v]=n);b===d[f].length&&a++}x===j.numReferenceProperties()&&a===j.numReferenceCollections()?r.push(d.hydrated=!0):r.push(void 0)}return r}.call(this))):m.push(void 0);return m};f.prototype.getRepository=function(e){var f,b,a,d;d=this.repos;b=0;for(a=d.length;b<
|
4
|
+
a;b++)if(f=d[b],f.canHandle(e))return f;e=new c(e);this.repos.push(e);return e};f.prototype.find=function(c,f){return this.getRepository(c).find(f)};b=f}return b};window.modules=a})();(function(){var a=window.modules||[],b=null;a.scribe__factory__entity_factory=function(){if(null===b){var a=function(c){this.mappers=c};a.prototype.build=function(c,f){var b,a,d,g;g=this.mappers;a=0;for(d=g.length;a<d;a++)if(b=g[a],b.canHandle(c))return b.handle(f);return null};b=a}return b};window.modules=a})();
|
5
|
+
(function(){var a=window.modules||[],b=null;a.scribe__factory__entity_mapper=function(){if(null===b){var a=function(){this.type=null};a.prototype.canHandle=function(c){return c===this.type};a.prototype.handle=function(c){c=this.buildEntity(c);c.entityType=this.type;return c};a.prototype.buildEntity=function(){return alert("You must override the buildEntity() function to create a data mapper.")};b=a}return b};window.modules=a})();
|
6
|
+
(function(){var a=window.modules||[],b=null;a.scribe__factory__reference_property=function(){null===b&&(b=function(a,c){this.entityType=a;this.entityId=c});return b};window.modules=a})();
|
7
|
+
(function(){var a=window.modules||[],b=null;a.scribe__repositories__entity_metadata=function(){if(null===b){var a=function(a){var b,e;this.type=a.entityType;this.properties=[];this.references=[];this.referenceCollections=[];for(b in a)e=a[b],e instanceof Array&&0<e.length&&this.isReference(e[0])?this.referenceCollections.push(b):this.isReference(e)?this.references.push(b):this.properties.push(b)};a.prototype.isReference=function(a){return a.hasOwnProperty("entityType")&&a.hasOwnProperty("entityId")};
|
8
|
+
a.prototype.hasReferences=function(){return 0<this.references.length||0<this.referenceCollections.length};b=a}return b};window.modules=a})();
|
9
|
+
(function(){var a=window.modules||[],b=null;a.scribe__repositories__entity_repository=function(){if(null===b){var a;a=require("scribe/repositories/entity_metadata");var c=function(a){this.type=a;this.entityList=[];this.metadata=null};c.prototype.canHandle=function(a){return this.type===a};c.prototype.hasReferences=function(){return this.metadata.hasReferences()};c.prototype.add=function(b){null==this.metadata&&(this.metadata=new a(b));return this.entityList.push(b)};c.prototype.remove=function(a){return this.entityList.splice(this.entityList.indexOf(a),
|
10
|
+
1)};c.prototype.find=function(a){var b,c,d,g;g=this.entityList;c=0;for(d=g.length;c<d;c++)if(b=g[c],b.id===a)return b;return null};c.prototype.findAll=function(){return this.entityList};c.prototype.findBy=function(a){var b,c,d,g,t;c=[];t=this.entityList;d=0;for(g=t.length;d<g;d++)b=t[d],this.isMatch(b,a)&&c.push(b);return c};c.prototype.findOneBy=function(a){var b,c,d,g;g=this.entityList;c=0;for(d=g.length;c<d;c++)if(b=g[c],this.isMatch(b,a))return b;return null};c.prototype.isMatch=function(a,b){var c,
|
11
|
+
d;c=!0;for(d in b)c=c?a[d]===b[d]:!1;return c};c.prototype.numEntities=function(){return this.entityList.length};c.prototype.numReferenceProperties=function(){return this.metadata.references.length};c.prototype.numReferenceCollections=function(){return this.metadata.referenceCollections.length};b=c}return b};window.modules=a})();(function(){var a=window.modules||[];window.require=function(b){b=b.replace(/\//g,"__");-1===b.indexOf("__")&&(b="__"+b);return null===a[b]?null:a[b]()}})();
|
12
|
+
|
data/config/assets.rb
ADDED
data/lib/scribe.rb
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
require "scribe/symbols"
|
@@ -0,0 +1,17 @@
|
|
1
|
+
require "keystone"
|
2
|
+
|
3
|
+
module Scribe
|
4
|
+
|
5
|
+
def self.pipeline
|
6
|
+
@@pipeline ||= ::Keystone.bootstrap("#{root_path}/config/assets.rb")
|
7
|
+
end
|
8
|
+
|
9
|
+
def self.keystone_compiler
|
10
|
+
@@keystone_compiler ||= pipeline.compiler("scribe.js")
|
11
|
+
end
|
12
|
+
|
13
|
+
def self.root_path
|
14
|
+
File.expand_path("#{File.dirname(__FILE__)}/../../")
|
15
|
+
end
|
16
|
+
|
17
|
+
end
|
data/scribe-js.gemspec
ADDED
@@ -0,0 +1,36 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
|
3
|
+
Gem::Specification.new do |s|
|
4
|
+
s.name = "scribe-js"
|
5
|
+
s.version = "0.0.1"
|
6
|
+
|
7
|
+
s.required_rubygems_version = Gem::Requirement.new(">= 1.2") if s.respond_to? :required_rubygems_version=
|
8
|
+
s.authors = ["Tim Shelburne"]
|
9
|
+
s.date = "2013-05-01"
|
10
|
+
s.description = ""
|
11
|
+
s.email = "shelburt02@gmail.com"
|
12
|
+
s.executables = ["scribe.js"]
|
13
|
+
s.extra_rdoc_files = ["CHANGELOG", "LICENSE", "README.rdoc", "bin/scribe.js", "lib/scribe.rb", "lib/scribe/symbols.rb"]
|
14
|
+
s.files = ["CHANGELOG", "Gemfile", "Gemfile.lock", "LICENSE", "Manifest", "README.rdoc", "Rakefile", "assets/scripts/coffee/scribe/datastore.coffee", "assets/scripts/coffee/scribe/factory/entity_factory.coffee", "assets/scripts/coffee/scribe/factory/entity_mapper.coffee", "assets/scripts/coffee/scribe/factory/reference_property.coffee", "assets/scripts/coffee/scribe/repositories/entity_metadata.coffee", "assets/scripts/coffee/scribe/repositories/entity_repository.coffee", "bin/scribe.js", "config/assets.rb", "lib/scribe.rb", "lib/scribe/symbols.rb", "scribe-js.gemspec", "spec/jasmine.yml", "spec/runner.html", "spec/support/classes.coffee", "spec/support/helpers.coffee", "spec/support/mocks.coffee", "spec/support/objects.coffee", "spec/support/requirements.coffee", "spec/tests/datastore_spec.coffee"]
|
15
|
+
s.homepage = "https://github.com/tshelburne/scribe-js"
|
16
|
+
s.rdoc_options = ["--line-numbers", "--inline-source", "--title", "Scribe-js", "--main", "README.rdoc"]
|
17
|
+
s.require_paths = ["lib"]
|
18
|
+
s.rubyforge_project = "scribe-js"
|
19
|
+
s.rubygems_version = "1.8.24"
|
20
|
+
s.summary = ""
|
21
|
+
|
22
|
+
if s.respond_to? :specification_version then
|
23
|
+
s.specification_version = 3
|
24
|
+
|
25
|
+
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
|
26
|
+
s.add_development_dependency(%q<jasmine>, [">= 0"])
|
27
|
+
s.add_development_dependency(%q<jasmine-headless-webkit>, [">= 0"])
|
28
|
+
else
|
29
|
+
s.add_dependency(%q<jasmine>, [">= 0"])
|
30
|
+
s.add_dependency(%q<jasmine-headless-webkit>, [">= 0"])
|
31
|
+
end
|
32
|
+
else
|
33
|
+
s.add_dependency(%q<jasmine>, [">= 0"])
|
34
|
+
s.add_dependency(%q<jasmine-headless-webkit>, [">= 0"])
|
35
|
+
end
|
36
|
+
end
|
data/spec/jasmine.yml
ADDED
@@ -0,0 +1,44 @@
|
|
1
|
+
runner_output: "spec/runner.html"
|
2
|
+
|
3
|
+
# src_files
|
4
|
+
#
|
5
|
+
# Return an array of filepaths relative to src_dir to include before jasmine specs.
|
6
|
+
# Default: []
|
7
|
+
src_files:
|
8
|
+
- bin/*.js
|
9
|
+
|
10
|
+
# stylesheets
|
11
|
+
#
|
12
|
+
# Return an array of stylesheet filepaths relative to src_dir to include before jasmine specs.
|
13
|
+
# Default: []
|
14
|
+
stylesheets:
|
15
|
+
|
16
|
+
# helpers
|
17
|
+
#
|
18
|
+
# Return an array of filepaths relative to spec_dir to include before jasmine specs.
|
19
|
+
# Default: ["helpers/**/*.js"]
|
20
|
+
helpers:
|
21
|
+
- support/requirements.coffee
|
22
|
+
- support/helpers.coffee
|
23
|
+
- support/objects.coffee
|
24
|
+
- support/classes.coffee
|
25
|
+
- support/mocks.coffee
|
26
|
+
|
27
|
+
# spec_files
|
28
|
+
#
|
29
|
+
# Return an array of filepaths relative to spec_dir to include.
|
30
|
+
# Default: ["**/*[sS]pec.js"]
|
31
|
+
spec_files:
|
32
|
+
- ./**/*_spec.coffee
|
33
|
+
|
34
|
+
# src_dir
|
35
|
+
#
|
36
|
+
# Source directory path. Your src_files must be returned relative to this path. Will use root if left blank.
|
37
|
+
# Default: project root
|
38
|
+
src_dir:
|
39
|
+
|
40
|
+
# spec_dir
|
41
|
+
#
|
42
|
+
# Spec directory path. Your spec_files must be returned relative to this path.
|
43
|
+
# Default: spec/javascripts
|
44
|
+
spec_dir: spec
|
data/spec/runner.html
ADDED
@@ -0,0 +1,65 @@
|
|
1
|
+
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
|
2
|
+
<html>
|
3
|
+
<head>
|
4
|
+
<meta content="text/html;charset=UTF-8" http-equiv="Content-Type"/>
|
5
|
+
<title>Jasmine Test Runner - Generated by jasmine-headless-webkit</title>
|
6
|
+
<script type="text/javascript" src="/Users/tshelburne/Sites/dontlook/jslib/scribe/vendor/ruby/1.9.1/gems/jasmine-headless-webkit-0.8.4/vendor/assets/javascripts/prolog.js"></script>
|
7
|
+
<script type="text/javascript" src="/Users/tshelburne/Sites/dontlook/jslib/scribe/vendor/ruby/1.9.1/gems/jasmine-core-1.3.1/lib/jasmine-core/jasmine.js"></script>
|
8
|
+
<script type="text/javascript" src="/Users/tshelburne/Sites/dontlook/jslib/scribe/vendor/ruby/1.9.1/gems/jasmine-core-1.3.1/lib/jasmine-core/jasmine-html.js"></script>
|
9
|
+
<link rel="stylesheet" href="/Users/tshelburne/Sites/dontlook/jslib/scribe/vendor/ruby/1.9.1/gems/jasmine-core-1.3.1/lib/jasmine-core/jasmine.css" type="text/css" />
|
10
|
+
<script type="text/javascript" src="/Users/tshelburne/Sites/dontlook/jslib/scribe/vendor/ruby/1.9.1/gems/jasmine-headless-webkit-0.8.4/vendor/assets/javascripts/jasmine-extensions.js"></script>
|
11
|
+
<script type="text/javascript" src="/Users/tshelburne/Sites/dontlook/jslib/scribe/vendor/ruby/1.9.1/gems/jasmine-headless-webkit-0.8.4/vendor/assets/javascripts/intense.js"></script>
|
12
|
+
<script type="text/javascript" src="/Users/tshelburne/Sites/dontlook/jslib/scribe/vendor/ruby/1.9.1/gems/jasmine-headless-webkit-0.8.4/vendor/assets/javascripts/headless_reporter_result.js"></script>
|
13
|
+
<script type="text/javascript" src="/Users/tshelburne/Sites/dontlook/jslib/scribe/vendor/ruby/1.9.1/gems/jasmine-headless-webkit-0.8.4/vendor/assets/javascripts/jasmine.HeadlessConsoleReporter.js"></script>
|
14
|
+
<script type="text/javascript" src="/Users/tshelburne/Sites/dontlook/jslib/scribe/vendor/ruby/1.9.1/gems/jasmine-headless-webkit-0.8.4/vendor/assets/javascripts/jsDump.js"></script>
|
15
|
+
<script type="text/javascript" src="/Users/tshelburne/Sites/dontlook/jslib/scribe/vendor/ruby/1.9.1/gems/jasmine-headless-webkit-0.8.4/vendor/assets/javascripts/beautify-html.js"></script>
|
16
|
+
<script type="text/javascript" src="/Users/tshelburne/Sites/dontlook/jslib/scribe/bin/scribe.js"></script>
|
17
|
+
<script type="text/javascript" src="/Users/tshelburne/Sites/dontlook/jslib/scribe/.jhw-cache/coffee_script/Users/tshelburne/Sites/dontlook/jslib/scribe/spec/support/requirements.coffee.js"></script>
|
18
|
+
<script type="text/javascript">window.CSTF['requirements.coffee.js'] = '/Users/tshelburne/Sites/dontlook/jslib/scribe/spec/support/requirements.coffee';</script>
|
19
|
+
<script type="text/javascript" src="/Users/tshelburne/Sites/dontlook/jslib/scribe/.jhw-cache/coffee_script/Users/tshelburne/Sites/dontlook/jslib/scribe/spec/support/helpers.coffee.js"></script>
|
20
|
+
<script type="text/javascript">window.CSTF['helpers.coffee.js'] = '/Users/tshelburne/Sites/dontlook/jslib/scribe/spec/support/helpers.coffee';</script>
|
21
|
+
<script type="text/javascript" src="/Users/tshelburne/Sites/dontlook/jslib/scribe/.jhw-cache/coffee_script/Users/tshelburne/Sites/dontlook/jslib/scribe/spec/support/objects.coffee.js"></script>
|
22
|
+
<script type="text/javascript">window.CSTF['objects.coffee.js'] = '/Users/tshelburne/Sites/dontlook/jslib/scribe/spec/support/objects.coffee';</script>
|
23
|
+
<script type="text/javascript" src="/Users/tshelburne/Sites/dontlook/jslib/scribe/.jhw-cache/coffee_script/Users/tshelburne/Sites/dontlook/jslib/scribe/spec/support/classes.coffee.js"></script>
|
24
|
+
<script type="text/javascript">window.CSTF['classes.coffee.js'] = '/Users/tshelburne/Sites/dontlook/jslib/scribe/spec/support/classes.coffee';</script>
|
25
|
+
<script type="text/javascript" src="/Users/tshelburne/Sites/dontlook/jslib/scribe/.jhw-cache/coffee_script/Users/tshelburne/Sites/dontlook/jslib/scribe/spec/support/mocks.coffee.js"></script>
|
26
|
+
<script type="text/javascript">window.CSTF['mocks.coffee.js'] = '/Users/tshelburne/Sites/dontlook/jslib/scribe/spec/support/mocks.coffee';</script>
|
27
|
+
<script type="text/javascript" src="/Users/tshelburne/Sites/dontlook/jslib/scribe/.jhw-cache/coffee_script/Users/tshelburne/Sites/dontlook/jslib/scribe/spec/tests/datastore_spec.coffee.js"></script>
|
28
|
+
<script type="text/javascript">window.CSTF['datastore_spec.coffee.js'] = '/Users/tshelburne/Sites/dontlook/jslib/scribe/spec/tests/datastore_spec.coffee';</script>
|
29
|
+
<script type="text/javascript">
|
30
|
+
if (window.JHW) { HeadlessReporterResult.specLineNumbers = {"/Users/tshelburne/Sites/dontlook/jslib/scribe/spec/tests/datastore_spec.coffee":{"DataStore":[4],"can generate a repository":[10],"can return a repository":[15],"when using EntityFactory":[19],"can build an entity":[49],"can build multiple entities":[57],"can build entity references":[63],"can build entity reference collections":[76],"can find an entity":[86]}}; }
|
31
|
+
</script>
|
32
|
+
</head>
|
33
|
+
<body>
|
34
|
+
<script type="text/javascript">
|
35
|
+
jasmine.getEnv().console = {
|
36
|
+
log: function(msg) { JHW.stdout.puts(msg) }
|
37
|
+
}
|
38
|
+
|
39
|
+
window._onload = window.onload;
|
40
|
+
|
41
|
+
window.onload = function() {
|
42
|
+
if (window._onload && (window._onload != window.onload)) {
|
43
|
+
window._onload();
|
44
|
+
}
|
45
|
+
|
46
|
+
if (window.JHW) {
|
47
|
+
jasmine.getEnv().addReporter(new jasmine.HeadlessConsoleReporter());
|
48
|
+
} else {
|
49
|
+
types = [ 'HtmlReporter', 'TrivialReporter' ];
|
50
|
+
|
51
|
+
for (var i = 0, j = types.length; i < j; ++i) {
|
52
|
+
var type = jasmine[types[i]]
|
53
|
+
if (type) {
|
54
|
+
jasmine.getEnv().addReporter(new type());
|
55
|
+
break;
|
56
|
+
}
|
57
|
+
}
|
58
|
+
}
|
59
|
+
|
60
|
+
jasmine.getEnv().execute();
|
61
|
+
}
|
62
|
+
</script>
|
63
|
+
</body>
|
64
|
+
</html>
|
65
|
+
|
@@ -0,0 +1,86 @@
|
|
1
|
+
#
|
2
|
+
# ENTITIES
|
3
|
+
#
|
4
|
+
class ReferenceEntityOne
|
5
|
+
constructor:(@id)->
|
6
|
+
@propOne
|
7
|
+
@hydrated = true
|
8
|
+
|
9
|
+
|
10
|
+
class ReferenceEntityTwo
|
11
|
+
constructor:(@id)->
|
12
|
+
@propOne
|
13
|
+
@propTwo
|
14
|
+
@hydrated = true
|
15
|
+
|
16
|
+
|
17
|
+
class ParentEntity
|
18
|
+
constructor:(@id)->
|
19
|
+
@propOne
|
20
|
+
@referenceOne
|
21
|
+
@referenceTwo
|
22
|
+
@hydrated = false
|
23
|
+
|
24
|
+
|
25
|
+
class CollectionParentEntity
|
26
|
+
constructor:(@id)->
|
27
|
+
@propOne
|
28
|
+
@referenceOne
|
29
|
+
@referenceTwo
|
30
|
+
@referenceCollection = []
|
31
|
+
@hydrated = false
|
32
|
+
|
33
|
+
|
34
|
+
#
|
35
|
+
# MAPPERS
|
36
|
+
#
|
37
|
+
EntityMapper = require "scribe/factory/entity_mapper"
|
38
|
+
ReferenceProperty = require "scribe/factory/reference_property"
|
39
|
+
|
40
|
+
globalize class ReferenceEntityOneMapper extends EntityMapper
|
41
|
+
constructor: ->
|
42
|
+
@type = "referenceOne"
|
43
|
+
|
44
|
+
buildEntity:(config)->
|
45
|
+
entity = new ReferenceEntityOne(config.id)
|
46
|
+
entity.propOne = config.propOne
|
47
|
+
entity
|
48
|
+
|
49
|
+
|
50
|
+
globalize class ReferenceEntityTwoMapper extends EntityMapper
|
51
|
+
constructor:(type)->
|
52
|
+
@type = "referenceTwo"
|
53
|
+
|
54
|
+
buildEntity:(config)->
|
55
|
+
entity = new ReferenceEntityTwo(config.id)
|
56
|
+
entity.propOne = config.propOne
|
57
|
+
entity.propTwo = config.propTwo
|
58
|
+
entity
|
59
|
+
|
60
|
+
|
61
|
+
globalize class ParentEntityMapper extends EntityMapper
|
62
|
+
constructor:(type)->
|
63
|
+
@type = "parent"
|
64
|
+
|
65
|
+
buildEntity:(config)->
|
66
|
+
entity = new ParentEntity(config.id)
|
67
|
+
entity.propOne = config.propOne
|
68
|
+
entity.referenceOne = new ReferenceProperty("referenceOne", config.referenceOne)
|
69
|
+
entity.referenceTwo = new ReferenceProperty("referenceTwo", config.referenceTwo)
|
70
|
+
entity
|
71
|
+
|
72
|
+
|
73
|
+
globalize class CollectionParentEntityMapper extends EntityMapper
|
74
|
+
constructor:(type)->
|
75
|
+
@type = "collectionParent"
|
76
|
+
|
77
|
+
buildEntity:(config)->
|
78
|
+
entity = new CollectionParentEntity(config.id)
|
79
|
+
entity.propOne = config.propOne
|
80
|
+
entity.referenceOne = new ReferenceProperty("referenceOne", config.referenceOne)
|
81
|
+
entity.referenceTwo = new ReferenceProperty("referenceTwo", config.referenceTwo)
|
82
|
+
|
83
|
+
for refId in config.referenceCollection
|
84
|
+
entity.referenceCollection.push(new ReferenceProperty("referenceOne", refId))
|
85
|
+
|
86
|
+
entity
|
@@ -0,0 +1,22 @@
|
|
1
|
+
(exports ? this).globalize = (fxn, name=null)=>
|
2
|
+
functionName = if name is null then fxn.name else name
|
3
|
+
(exports ? this)[functionName] = fxn
|
4
|
+
|
5
|
+
|
6
|
+
# MOCKING #
|
7
|
+
(exports ? this).mocks = {}
|
8
|
+
|
9
|
+
(exports ? this).addMock = (name, obj)=>
|
10
|
+
(exports ? this).mocks[name] = obj
|
11
|
+
|
12
|
+
|
13
|
+
# RUNTIME PATCHING #
|
14
|
+
(exports ? this).patches = {}
|
15
|
+
|
16
|
+
(exports ? this).patch = (method, patch)=>
|
17
|
+
(exports ? this).patches[method.name] = method
|
18
|
+
method = patch
|
19
|
+
|
20
|
+
(exports ? this).restore = (method)=>
|
21
|
+
method = (exports ? this).patches[method.name]
|
22
|
+
delete (exports ? this).patches[method.name]
|
File without changes
|
File without changes
|
File without changes
|
@@ -0,0 +1,90 @@
|
|
1
|
+
DataStore = require "scribe/datastore"
|
2
|
+
EntityFactory = require "scribe/factory/entity_factory"
|
3
|
+
|
4
|
+
describe "DataStore", ->
|
5
|
+
datastore = null
|
6
|
+
|
7
|
+
beforeEach ->
|
8
|
+
datastore = new DataStore(new EntityFactory())
|
9
|
+
|
10
|
+
it "can generate a repository", ->
|
11
|
+
expect(datastore.repos).toEqual []
|
12
|
+
datastore.getRepository "NewEntity"
|
13
|
+
expect(datastore.repos.length).toEqual 1
|
14
|
+
|
15
|
+
it "can return a repository", ->
|
16
|
+
repo = datastore.getRepository "NewEntity"
|
17
|
+
expect(repo).not.toBeNull()
|
18
|
+
|
19
|
+
describe "when using EntityFactory", ->
|
20
|
+
datastore = null
|
21
|
+
|
22
|
+
entityFactory = new EntityFactory([
|
23
|
+
new ReferenceEntityOneMapper(),
|
24
|
+
new ReferenceEntityTwoMapper(),
|
25
|
+
new ParentEntityMapper(),
|
26
|
+
new CollectionParentEntityMapper()
|
27
|
+
])
|
28
|
+
|
29
|
+
datastoreConfig =
|
30
|
+
referenceOne: [
|
31
|
+
{ id:"1", propOne:"valueOne" },
|
32
|
+
{ id:"2", propOne:"valueTwo" }
|
33
|
+
]
|
34
|
+
referenceTwo: [
|
35
|
+
{ id:"3", propOne:"valueOne", propTwo:"valueTwo" }
|
36
|
+
]
|
37
|
+
parent: [
|
38
|
+
{ id:"4", propOne:"valueOne", referenceOne:"1", referenceTwo:"3" }
|
39
|
+
]
|
40
|
+
collectionParent: [
|
41
|
+
{ id:"5", propOne:"valueOne", referenceOne:"1", referenceTwo:"3", referenceCollection: [ "1", "2" ] }
|
42
|
+
]
|
43
|
+
|
44
|
+
beforeEach ->
|
45
|
+
datastore = new DataStore(entityFactory)
|
46
|
+
|
47
|
+
afterEach ->
|
48
|
+
|
49
|
+
it "can build an entity", ->
|
50
|
+
datastore.buildEntity("referenceOne", datastoreConfig.referenceOne[0], false)
|
51
|
+
repo = datastore.getRepository "referenceOne"
|
52
|
+
expect(repo).not.toBeNull()
|
53
|
+
expect(repo.findAll().length).toEqual 1
|
54
|
+
expect(repo.find("1")).not.toBeNull()
|
55
|
+
expect(repo.find("1").propOne).toEqual "valueOne"
|
56
|
+
|
57
|
+
it "can build multiple entities", ->
|
58
|
+
datastore.buildEntities("referenceOne", datastoreConfig.referenceOne, false)
|
59
|
+
repo = datastore.getRepository "referenceOne"
|
60
|
+
expect(repo).not.toBeNull()
|
61
|
+
expect(repo.entityList.length).toEqual 2
|
62
|
+
|
63
|
+
it "can build entity references", ->
|
64
|
+
datastore.buildEntities("referenceOne", datastoreConfig.referenceOne, false)
|
65
|
+
datastore.buildEntities("referenceTwo", datastoreConfig.referenceTwo, false)
|
66
|
+
datastore.buildEntities("parent", datastoreConfig.parent)
|
67
|
+
repo = datastore.getRepository "parent"
|
68
|
+
expect(repo).not.toBeNull()
|
69
|
+
expect(repo.numReferenceProperties()).toEqual 2
|
70
|
+
entity = repo.find("4")
|
71
|
+
expect(entity).not.toBeNull()
|
72
|
+
expect(entity.referenceOne).not.toBeNull()
|
73
|
+
expect(entity.referenceOne.propOne).toEqual "valueOne"
|
74
|
+
expect(entity.referenceTwo.propTwo).toEqual "valueTwo"
|
75
|
+
|
76
|
+
it "can build entity reference collections", ->
|
77
|
+
datastore.buildEntities("referenceOne", datastoreConfig.referenceOne, false)
|
78
|
+
datastore.buildEntities("referenceTwo", datastoreConfig.referenceTwo, false)
|
79
|
+
datastore.buildEntities("collectionParent", datastoreConfig.collectionParent)
|
80
|
+
entity = datastore.getRepository("collectionParent").find("5")
|
81
|
+
expect(entity.referenceCollection).not.toEqual []
|
82
|
+
for ref in entity.referenceCollection
|
83
|
+
expect(ref).toBeDefined()
|
84
|
+
expect(ref.propOne).toBeDefined()
|
85
|
+
|
86
|
+
it "can find an entity", ->
|
87
|
+
datastore.buildEntities("referenceOne", datastoreConfig.referenceOne, false)
|
88
|
+
entity = datastore.find("referenceOne", "1")
|
89
|
+
expect(entity).not.toEqual null
|
90
|
+
expect(entity.propOne).toEqual "valueOne"
|
metadata
ADDED
@@ -0,0 +1,115 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: scribe-js
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Tim Shelburne
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2013-05-01 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: jasmine
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
18
|
+
requirements:
|
19
|
+
- - ! '>='
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: '0'
|
22
|
+
type: :development
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ! '>='
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: '0'
|
30
|
+
- !ruby/object:Gem::Dependency
|
31
|
+
name: jasmine-headless-webkit
|
32
|
+
requirement: !ruby/object:Gem::Requirement
|
33
|
+
none: false
|
34
|
+
requirements:
|
35
|
+
- - ! '>='
|
36
|
+
- !ruby/object:Gem::Version
|
37
|
+
version: '0'
|
38
|
+
type: :development
|
39
|
+
prerelease: false
|
40
|
+
version_requirements: !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
42
|
+
requirements:
|
43
|
+
- - ! '>='
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
version: '0'
|
46
|
+
description: ''
|
47
|
+
email: shelburt02@gmail.com
|
48
|
+
executables:
|
49
|
+
- scribe.js
|
50
|
+
extensions: []
|
51
|
+
extra_rdoc_files:
|
52
|
+
- CHANGELOG
|
53
|
+
- LICENSE
|
54
|
+
- README.rdoc
|
55
|
+
- bin/scribe.js
|
56
|
+
- lib/scribe.rb
|
57
|
+
- lib/scribe/symbols.rb
|
58
|
+
files:
|
59
|
+
- CHANGELOG
|
60
|
+
- Gemfile
|
61
|
+
- Gemfile.lock
|
62
|
+
- LICENSE
|
63
|
+
- Manifest
|
64
|
+
- README.rdoc
|
65
|
+
- Rakefile
|
66
|
+
- assets/scripts/coffee/scribe/datastore.coffee
|
67
|
+
- assets/scripts/coffee/scribe/factory/entity_factory.coffee
|
68
|
+
- assets/scripts/coffee/scribe/factory/entity_mapper.coffee
|
69
|
+
- assets/scripts/coffee/scribe/factory/reference_property.coffee
|
70
|
+
- assets/scripts/coffee/scribe/repositories/entity_metadata.coffee
|
71
|
+
- assets/scripts/coffee/scribe/repositories/entity_repository.coffee
|
72
|
+
- bin/scribe.js
|
73
|
+
- config/assets.rb
|
74
|
+
- lib/scribe.rb
|
75
|
+
- lib/scribe/symbols.rb
|
76
|
+
- scribe-js.gemspec
|
77
|
+
- spec/jasmine.yml
|
78
|
+
- spec/runner.html
|
79
|
+
- spec/support/classes.coffee
|
80
|
+
- spec/support/helpers.coffee
|
81
|
+
- spec/support/mocks.coffee
|
82
|
+
- spec/support/objects.coffee
|
83
|
+
- spec/support/requirements.coffee
|
84
|
+
- spec/tests/datastore_spec.coffee
|
85
|
+
homepage: https://github.com/tshelburne/scribe-js
|
86
|
+
licenses: []
|
87
|
+
post_install_message:
|
88
|
+
rdoc_options:
|
89
|
+
- --line-numbers
|
90
|
+
- --inline-source
|
91
|
+
- --title
|
92
|
+
- Scribe-js
|
93
|
+
- --main
|
94
|
+
- README.rdoc
|
95
|
+
require_paths:
|
96
|
+
- lib
|
97
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
98
|
+
none: false
|
99
|
+
requirements:
|
100
|
+
- - ! '>='
|
101
|
+
- !ruby/object:Gem::Version
|
102
|
+
version: '0'
|
103
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
104
|
+
none: false
|
105
|
+
requirements:
|
106
|
+
- - ! '>='
|
107
|
+
- !ruby/object:Gem::Version
|
108
|
+
version: '1.2'
|
109
|
+
requirements: []
|
110
|
+
rubyforge_project: scribe-js
|
111
|
+
rubygems_version: 1.8.24
|
112
|
+
signing_key:
|
113
|
+
specification_version: 3
|
114
|
+
summary: ''
|
115
|
+
test_files: []
|