ember-data-factory-guy 0.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,188 @@
1
+ (function(){
2
+ var get = Ember.get, set = Ember.set, setProperties = Ember.setProperties;
3
+
4
+ function asyncHasMany(record, type, options, meta) {
5
+ var relationship = record._relationships[key],
6
+ promiseLabel = "DS: Async hasMany " + record + " : " + key;
7
+
8
+ if (!relationship) {
9
+ var resolver = Ember.RSVP.defer(promiseLabel);
10
+ relationship = buildRelationship(record, key, options, function(store, data) {
11
+ var link = data.links && data.links[key];
12
+ var rel;
13
+ if (link) {
14
+ rel = store.findHasMany(record, link, meta, resolver);
15
+ } else {
16
+ rel = store.findMany(record, data[key], meta.type, resolver);
17
+ }
18
+ // cache the promise so we can use it
19
+ // when we come back and don't need to rebuild
20
+ // the relationship.
21
+ set(rel, 'promise', resolver.promise);
22
+ return rel;
23
+ });
24
+ }
25
+
26
+ var promise = relationship.get('promise').then(function() {
27
+ return relationship;
28
+ }, null, "DS: Async hasMany records received");
29
+
30
+ return DS.PromiseArray.create({
31
+ promise: promise
32
+ });
33
+ }
34
+
35
+ function buildRelationship(record, key, options, callback) {
36
+ var rels = record._relationships;
37
+
38
+ if (rels[key]) { return rels[key]; }
39
+
40
+ var data = get(record, 'data'),
41
+ store = get(record, 'store');
42
+
43
+ var relationship = rels[key] = callback.call(record, store, data);
44
+
45
+ return setProperties(relationship, {
46
+ owner: record,
47
+ name: key,
48
+ isPolymorphic: options.polymorphic
49
+ });
50
+ }
51
+
52
+ function hasRelationship(type, options) {
53
+ options = options || {};
54
+
55
+ var meta = {
56
+ type: type,
57
+ isRelationship: true,
58
+ options: options,
59
+ kind: 'hasMany'
60
+ };
61
+
62
+ return Ember.computed('data', function(key) {
63
+ var adapter = this.store.adapterFor('application');
64
+ if (adapter.toString().match('Fixture')) {
65
+ var relationship = this._relationships[key],
66
+ promiseLabel = "DS: Async hasMany " + this + " : " + key;
67
+
68
+ if (!relationship) {
69
+ var resolver = Ember.RSVP.defer(promiseLabel);
70
+ relationship = buildRelationship(this, key, options, function(store, data) {
71
+ var link = data.links && data.links[key];
72
+ var rel;
73
+ if (link) {
74
+ rel = store.findHasMany(this, link, meta, resolver);
75
+ } else {
76
+ rel = store.findMany(this, data[key], meta.type, resolver);
77
+ }
78
+ // cache the promise so we can use it
79
+ // when we come back and don't need to rebuild
80
+ // the relationship.
81
+ set(rel, 'promise', resolver.promise);
82
+ return rel;
83
+ });
84
+ }
85
+
86
+ var promise = relationship.get('promise').then(function() {
87
+ return relationship;
88
+ }, null, "DS: Async hasMany records received");
89
+
90
+ return DS.PromiseArray.create({
91
+ promise: promise
92
+ });
93
+ }
94
+
95
+ return buildRelationship(this, key, options, function(store, data) {
96
+ var records = data[key];
97
+ Ember.assert("You looked up the '" + key + "' relationship on '" + this + "' but some of the associated records were not loaded. Either make sure they are all loaded together with the parent record, or specify that the relationship is async (`DS.hasMany({ async: true })`)", Ember.A(records).everyProperty('isEmpty', false));
98
+ return store.findMany(this, data[key], meta.type);
99
+ });
100
+ }).meta(meta).readOnly();
101
+ }
102
+
103
+ /**
104
+ `DS.hasMany` is used to define One-To-Many and Many-To-Many
105
+ relationships on a [DS.Model](/api/data/classes/DS.Model.html).
106
+
107
+ `DS.hasMany` takes an optional hash as a second parameter, currently
108
+ supported options are:
109
+
110
+ - `async`: A boolean value used to explicitly declare this to be an async relationship.
111
+ - `inverse`: A string used to identify the inverse property on a related model.
112
+
113
+ #### One-To-Many
114
+ To declare a one-to-many relationship between two models, use
115
+ `DS.belongsTo` in combination with `DS.hasMany`, like this:
116
+
117
+ ```javascript
118
+ App.Post = DS.Model.extend({
119
+ comments: DS.hasMany('comment')
120
+ });
121
+
122
+ App.Comment = DS.Model.extend({
123
+ post: DS.belongsTo('post')
124
+ });
125
+ ```
126
+
127
+ #### Many-To-Many
128
+ To declare a many-to-many relationship between two models, use
129
+ `DS.hasMany`:
130
+
131
+ ```javascript
132
+ App.Post = DS.Model.extend({
133
+ tags: DS.hasMany('tag')
134
+ });
135
+
136
+ App.Tag = DS.Model.extend({
137
+ posts: DS.hasMany('post')
138
+ });
139
+ ```
140
+
141
+ #### Explicit Inverses
142
+
143
+ Ember Data will do its best to discover which relationships map to
144
+ one another. In the one-to-many code above, for example, Ember Data
145
+ can figure out that changing the `comments` relationship should update
146
+ the `post` relationship on the inverse because post is the only
147
+ relationship to that model.
148
+
149
+ However, sometimes you may have multiple `belongsTo`/`hasManys` for the
150
+ same type. You can specify which property on the related model is
151
+ the inverse using `DS.hasMany`'s `inverse` option:
152
+
153
+ ```javascript
154
+ var belongsTo = DS.belongsTo,
155
+ hasMany = DS.hasMany;
156
+
157
+ App.Comment = DS.Model.extend({
158
+ onePost: belongsTo('post'),
159
+ twoPost: belongsTo('post'),
160
+ redPost: belongsTo('post'),
161
+ bluePost: belongsTo('post')
162
+ });
163
+
164
+ App.Post = DS.Model.extend({
165
+ comments: hasMany('comment', {
166
+ inverse: 'redPost'
167
+ })
168
+ });
169
+ ```
170
+
171
+ You can also specify an inverse on a `belongsTo`, which works how
172
+ you'd expect.
173
+
174
+ @namespace
175
+ @method hasMany
176
+ @for DS
177
+ @param {String or DS.Model} type the model type of the relationship
178
+ @param {Object} options a hash of options
179
+ @return {Ember.computed} relationship
180
+ */
181
+ DS.hasMany = function(type, options) {
182
+ if (typeof type === 'object') {
183
+ options = type;
184
+ type = undefined;
185
+ }
186
+ return hasRelationship(type, options);
187
+ }
188
+ }).call();
metadata ADDED
@@ -0,0 +1,76 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: ember-data-factory-guy
3
+ version: !ruby/object:Gem::Version
4
+ version: '0.1'
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - daniel sudol
9
+ - alex opak
10
+ autorequire:
11
+ bindir: bin
12
+ cert_chain: []
13
+ date: 2014-04-23 00:00:00.000000000 +03:00
14
+ default_executable:
15
+ dependencies: []
16
+ description: Create Fixtures for Ember Data
17
+ email:
18
+ - dansudol@yahoo.com
19
+ executables: []
20
+ extensions: []
21
+ extra_rdoc_files: []
22
+ files:
23
+ - .gitignore
24
+ - Gruntfile.js
25
+ - README.md
26
+ - bower.json
27
+ - dist/ember-data-factory-guy.js
28
+ - dist/ember-data-factory-guy.min.js
29
+ - ember-data-factory-guy.gemspec
30
+ - lib/ember-data-factory-guy.rb
31
+ - package.json
32
+ - src/factory_guy.js
33
+ - src/factory_guy_helper_mixin.js
34
+ - src/has_many.js
35
+ - src/store.js
36
+ - tests/active_model_adapter_factory_test.js
37
+ - tests/factory_guy_test.js
38
+ - tests/fixture_adapter_factory_test.js
39
+ - tests/index.html
40
+ - tests/rest_adapter_factory_test.js
41
+ - tests/store_test.js
42
+ - tests/support/factories/project_factory.js
43
+ - tests/support/factories/user_factory.js
44
+ - tests/support/models/project.js
45
+ - tests/support/models/user.js
46
+ - tests/support/test_helper.js
47
+ - tests/test_setup.js
48
+ - vendor/assets/javascripts/ember_data_factory_guy.js
49
+ - vendor/assets/javascripts/factory_guy_has_many.js
50
+ has_rdoc: true
51
+ homepage: http://rubygems.org/gems/ember-data-factory-guy
52
+ licenses:
53
+ - MIT
54
+ post_install_message:
55
+ rdoc_options: []
56
+ require_paths:
57
+ - lib
58
+ required_ruby_version: !ruby/object:Gem::Requirement
59
+ none: false
60
+ requirements:
61
+ - - ! '>='
62
+ - !ruby/object:Gem::Version
63
+ version: '0'
64
+ required_rubygems_version: !ruby/object:Gem::Requirement
65
+ none: false
66
+ requirements:
67
+ - - ! '>='
68
+ - !ruby/object:Gem::Version
69
+ version: 1.3.6
70
+ requirements: []
71
+ rubyforge_project: ember-data-factory-guy
72
+ rubygems_version: 1.6.2
73
+ signing_key:
74
+ specification_version: 3
75
+ summary: Create Fixtures for Ember Data
76
+ test_files: []