her 0.4 → 0.4.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +15 -0
- data/{docs/CONTRIBUTING.md → CONTRIBUTING.md} +0 -0
- data/README.md +46 -44
- data/{docs/UPGRADE.md → UPGRADE.md} +0 -0
- data/her.gemspec +1 -1
- data/lib/her/api.rb +18 -1
- data/lib/her/errors.rb +1 -0
- data/lib/her/middleware/first_level_parse_json.rb +6 -1
- data/lib/her/model.rb +2 -0
- data/lib/her/model/http.rb +11 -11
- data/lib/her/model/nested_attributes.rb +57 -0
- data/lib/her/model/orm.rb +14 -9
- data/lib/her/model/relationships.rb +1 -1
- data/lib/her/version.rb +1 -1
- data/spec/api_spec.rb +77 -76
- data/spec/collection_spec.rb +10 -11
- data/spec/middleware/first_level_parse_json_spec.rb +10 -0
- data/spec/model/http_spec.rb +105 -186
- data/spec/model/nested_attributes_spec.rb +98 -0
- data/spec/model/relationships_spec.rb +26 -0
- data/spec/model_spec.rb +15 -27
- data/spec/spec_helper.rb +4 -4
- metadata +12 -29
@@ -0,0 +1,98 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
require File.join(File.dirname(__FILE__), "../spec_helper.rb")
|
3
|
+
|
4
|
+
describe Her::Model::NestedAttributes do
|
5
|
+
context "with a belongs_to relation" do
|
6
|
+
before do
|
7
|
+
Her::API.setup :url => "https://api.example.com" do |builder|
|
8
|
+
builder.use Her::Middleware::FirstLevelParseJSON
|
9
|
+
builder.use Faraday::Request::UrlEncoded
|
10
|
+
end
|
11
|
+
|
12
|
+
spawn_model "Foo::User" do
|
13
|
+
belongs_to :company, :path => "/organizations/:id", :foreign_key => :organization_id
|
14
|
+
accepts_nested_attributes_for :company
|
15
|
+
end
|
16
|
+
|
17
|
+
spawn_model "Foo::Company"
|
18
|
+
|
19
|
+
@user_with_data_through_nested_attributes = Foo::User.new :name => "Test", :company_attributes => { :name => "Example Company" }
|
20
|
+
end
|
21
|
+
|
22
|
+
context "when child does not yet exist" do
|
23
|
+
it "creates an instance of the associated class" do
|
24
|
+
@user_with_data_through_nested_attributes.company.should be_a(Foo::Company)
|
25
|
+
@user_with_data_through_nested_attributes.company.name.should == "Example Company"
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
context "when child does exist" do
|
30
|
+
it "updates the attributes of the associated object" do
|
31
|
+
@user_with_data_through_nested_attributes.company_attributes = { :name => "Fünke's Company" }
|
32
|
+
@user_with_data_through_nested_attributes.company.should be_a(Foo::Company)
|
33
|
+
@user_with_data_through_nested_attributes.company.name.should == "Fünke's Company"
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
context "with a has_one relation" do
|
39
|
+
before do
|
40
|
+
Her::API.setup :url => "https://api.example.com" do |builder|
|
41
|
+
builder.use Her::Middleware::FirstLevelParseJSON
|
42
|
+
builder.use Faraday::Request::UrlEncoded
|
43
|
+
end
|
44
|
+
|
45
|
+
spawn_model "Foo::User" do
|
46
|
+
has_one :pet
|
47
|
+
accepts_nested_attributes_for :pet
|
48
|
+
end
|
49
|
+
|
50
|
+
spawn_model "Foo::Pet"
|
51
|
+
|
52
|
+
@user_with_data_through_nested_attributes = Foo::User.new :name => "Test", :pet_attributes => { :name => "Hasi" }
|
53
|
+
end
|
54
|
+
|
55
|
+
context "when child does not yet exist" do
|
56
|
+
it "creates an instance of the associated class" do
|
57
|
+
@user_with_data_through_nested_attributes.pet.should be_a(Foo::Pet)
|
58
|
+
@user_with_data_through_nested_attributes.pet.name.should == "Hasi"
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
context "when child does exist" do
|
63
|
+
it "updates the attributes of the associated object" do
|
64
|
+
@user_with_data_through_nested_attributes.pet_attributes = { :name => "Rodriguez" }
|
65
|
+
@user_with_data_through_nested_attributes.pet.should be_a(Foo::Pet)
|
66
|
+
@user_with_data_through_nested_attributes.pet.name.should == "Rodriguez"
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
context "with a has_many relation" do
|
72
|
+
before do
|
73
|
+
Her::API.setup :url => "https://api.example.com" do |builder|
|
74
|
+
builder.use Her::Middleware::FirstLevelParseJSON
|
75
|
+
builder.use Faraday::Request::UrlEncoded
|
76
|
+
end
|
77
|
+
|
78
|
+
spawn_model "Foo::User" do
|
79
|
+
has_many :pets
|
80
|
+
accepts_nested_attributes_for :pets
|
81
|
+
end
|
82
|
+
|
83
|
+
spawn_model "Foo::Pet"
|
84
|
+
|
85
|
+
@user_with_data_through_nested_attributes = Foo::User.new :name => "Test", :pets_attributes => [{ :name => "Hasi" }, { :name => "Rodriguez" }]
|
86
|
+
end
|
87
|
+
|
88
|
+
context "when children do not yet exist" do
|
89
|
+
it "creates an instance of the associated class" do
|
90
|
+
@user_with_data_through_nested_attributes.pets.length.should == 2
|
91
|
+
@user_with_data_through_nested_attributes.pets[0].should be_a(Foo::Pet)
|
92
|
+
@user_with_data_through_nested_attributes.pets[1].should be_a(Foo::Pet)
|
93
|
+
@user_with_data_through_nested_attributes.pets[0].name.should == "Hasi"
|
94
|
+
@user_with_data_through_nested_attributes.pets[1].name.should == "Rodriguez"
|
95
|
+
end
|
96
|
+
end
|
97
|
+
end
|
98
|
+
end
|
@@ -87,6 +87,9 @@ describe Her::Model::Relationships do
|
|
87
87
|
stub.get("/users/1/posts") { |env| [200, {}, {:id => 1, :body => 'blogging stuff', :admin_id => 1 }.to_json] }
|
88
88
|
stub.get("/organizations/1") { |env| [200, {}, { :id => 1, :name => "Bluth Company Foo" }.to_json] }
|
89
89
|
stub.get("/organizations/2") { |env| [200, {}, { :id => 2, :name => "Bluth Company" }.to_json] }
|
90
|
+
stub.post("/users") { |env| [200, {}, { :id => 5, :name => "Mr. Krabs", :comments => [{ :id => 99, :body => "Rodríguez, nasibisibusi?", :user_id => 5 }], :role => { :id => 1, :body => "Admin" }, :organization => { :id => 3, :name => "Krusty Krab" }, :organization_id => 3 }.to_json] }
|
91
|
+
stub.put("/users/5") { |env| [200, {}, { :id => 5, :name => "Clancy Brown", :comments => [{ :id => 99, :body => "Rodríguez, nasibisibusi?", :user_id => 5 }], :role => { :id => 1, :body => "Admin" }, :organization => { :id => 3, :name => "Krusty Krab" }, :organization_id => 3 }.to_json] }
|
92
|
+
stub.delete("/users/5") { |env| [200, {}, { :id => 5, :name => "Clancy Brown", :comments => [{ :id => 99, :body => "Rodríguez, nasibisibusi?", :user_id => 5 }], :role => { :id => 1, :body => "Admin" }, :organization => { :id => 3, :name => "Krusty Krab" }, :organization_id => 3 }.to_json] }
|
90
93
|
end
|
91
94
|
end
|
92
95
|
|
@@ -110,6 +113,10 @@ describe Her::Model::Relationships do
|
|
110
113
|
@user_without_included_data = Foo::User.find(2)
|
111
114
|
end
|
112
115
|
|
116
|
+
let(:user_with_included_data_after_create) { Foo::User.create }
|
117
|
+
let(:user_with_included_data_after_save_existing) { Foo::User.save_existing(5, :name => "Clancy Brown") }
|
118
|
+
let(:user_with_included_data_after_destroy) { Foo::User.new(:id => 5).destroy }
|
119
|
+
|
113
120
|
it "maps an array of included data through has_many" do
|
114
121
|
@user_with_included_data.comments.first.should be_a(Foo::Comment)
|
115
122
|
@user_with_included_data.comments.length.should == 2
|
@@ -177,6 +184,25 @@ describe Her::Model::Relationships do
|
|
177
184
|
@user_without_included_data.get_relationship(:unknown_relationship).should be_nil
|
178
185
|
@user_without_included_data.get_relationship(:organization).name.should == "Bluth Company"
|
179
186
|
end
|
187
|
+
|
188
|
+
[:create, :save_existing, :destroy].each do |type|
|
189
|
+
context "after #{type}" do
|
190
|
+
let(:subject) { self.send("user_with_included_data_after_#{type}")}
|
191
|
+
|
192
|
+
it "maps an array of included data through has_many" do
|
193
|
+
subject.comments.first.should be_a(Foo::Comment)
|
194
|
+
subject.comments.length.should == 1
|
195
|
+
subject.comments.first.id.should == 99
|
196
|
+
subject.comments.first.body.should == "Rodríguez, nasibisibusi?"
|
197
|
+
end
|
198
|
+
|
199
|
+
it "maps an array of included data through has_one" do
|
200
|
+
subject.role.should be_a(Foo::Role)
|
201
|
+
subject.role.id.should == 1
|
202
|
+
subject.role.body.should == "Admin"
|
203
|
+
end
|
204
|
+
end
|
205
|
+
end
|
180
206
|
end
|
181
207
|
|
182
208
|
context "handling relationships with details" do
|
data/spec/model_spec.rb
CHANGED
@@ -3,41 +3,29 @@ require 'spec_helper'
|
|
3
3
|
|
4
4
|
describe Her::Model do
|
5
5
|
before do
|
6
|
-
Her::API.setup :url => "https://api.example.com" do |
|
7
|
-
|
8
|
-
|
9
|
-
builder.adapter :test do |stub|
|
6
|
+
Her::API.setup :url => "https://api.example.com" do |connection|
|
7
|
+
connection.use Her::Middleware::FirstLevelParseJSON
|
8
|
+
connection.adapter :test do |stub|
|
10
9
|
stub.get("/users/1") { |env| [200, {}, { :id => 1, :name => "Tobias Fünke" }.to_json] }
|
11
10
|
stub.get("/users/1/comments") { |env| [200, {}, [{ :id => 4, :body => "They're having a FIRESALE?" }].to_json] }
|
12
11
|
end
|
13
12
|
end
|
14
13
|
|
15
|
-
spawn_model
|
16
|
-
|
17
|
-
end
|
18
|
-
|
19
|
-
spawn_model "Foo::Comment"
|
20
|
-
|
21
|
-
@user_without_included_data = Foo::User.find(1)
|
22
|
-
end
|
23
|
-
|
24
|
-
it "handles has_key? for data" do
|
25
|
-
@user_without_included_data.should_not have_key(:unknown_method_for_a_user)
|
26
|
-
@user_without_included_data.should have_key(:name)
|
27
|
-
end
|
28
|
-
|
29
|
-
it "handles has_key? for relationships" do
|
30
|
-
@user_without_included_data.should_not have_key(:unknown_method_for_a_user)
|
31
|
-
@user_without_included_data.should have_key(:comments)
|
14
|
+
spawn_model("Foo::User") { has_many :comments }
|
15
|
+
spawn_model("Foo::Comment")
|
32
16
|
end
|
17
|
+
subject { Foo::User.find(1) }
|
33
18
|
|
34
|
-
|
35
|
-
|
36
|
-
|
19
|
+
describe :has_key? do
|
20
|
+
it { should_not have_key(:unknown_method_for_a_user) }
|
21
|
+
it { should_not have_key(:unknown_method_for_a_user) }
|
22
|
+
it { should have_key(:name) }
|
23
|
+
it { should have_key(:comments) }
|
37
24
|
end
|
38
25
|
|
39
|
-
|
40
|
-
|
41
|
-
|
26
|
+
describe :[] do
|
27
|
+
it { should_not have_key(:unknown_method_for_a_user) }
|
28
|
+
specify { subject[:name].should == "Tobias Fünke" }
|
29
|
+
specify { subject[:comments].first.body.should == "They're having a FIRESALE?" }
|
42
30
|
end
|
43
31
|
end
|
data/spec/spec_helper.rb
CHANGED
@@ -4,14 +4,14 @@ require "rspec"
|
|
4
4
|
require "mocha/api"
|
5
5
|
require "her"
|
6
6
|
|
7
|
-
RSpec.configure do |
|
8
|
-
|
7
|
+
RSpec.configure do |config|
|
8
|
+
config.mock_with :mocha
|
9
9
|
|
10
|
-
|
10
|
+
config.before :each do
|
11
11
|
@globals = []
|
12
12
|
end
|
13
13
|
|
14
|
-
|
14
|
+
config.after :each do
|
15
15
|
@globals.each do |global|
|
16
16
|
Object.instance_eval { remove_const global } if Object.const_defined?(global)
|
17
17
|
end
|
metadata
CHANGED
@@ -1,20 +1,18 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: her
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
5
|
-
prerelease:
|
4
|
+
version: 0.4.1
|
6
5
|
platform: ruby
|
7
6
|
authors:
|
8
7
|
- Rémi Prévost
|
9
8
|
autorequire:
|
10
9
|
bindir: bin
|
11
10
|
cert_chain: []
|
12
|
-
date: 2013-
|
11
|
+
date: 2013-02-27 00:00:00.000000000 Z
|
13
12
|
dependencies:
|
14
13
|
- !ruby/object:Gem::Dependency
|
15
14
|
name: rake
|
16
15
|
requirement: !ruby/object:Gem::Requirement
|
17
|
-
none: false
|
18
16
|
requirements:
|
19
17
|
- - ~>
|
20
18
|
- !ruby/object:Gem::Version
|
@@ -22,7 +20,6 @@ dependencies:
|
|
22
20
|
type: :development
|
23
21
|
prerelease: false
|
24
22
|
version_requirements: !ruby/object:Gem::Requirement
|
25
|
-
none: false
|
26
23
|
requirements:
|
27
24
|
- - ~>
|
28
25
|
- !ruby/object:Gem::Version
|
@@ -30,23 +27,20 @@ dependencies:
|
|
30
27
|
- !ruby/object:Gem::Dependency
|
31
28
|
name: rspec
|
32
29
|
requirement: !ruby/object:Gem::Requirement
|
33
|
-
none: false
|
34
30
|
requirements:
|
35
31
|
- - ~>
|
36
32
|
- !ruby/object:Gem::Version
|
37
|
-
version: '2.
|
33
|
+
version: '2.13'
|
38
34
|
type: :development
|
39
35
|
prerelease: false
|
40
36
|
version_requirements: !ruby/object:Gem::Requirement
|
41
|
-
none: false
|
42
37
|
requirements:
|
43
38
|
- - ~>
|
44
39
|
- !ruby/object:Gem::Version
|
45
|
-
version: '2.
|
40
|
+
version: '2.13'
|
46
41
|
- !ruby/object:Gem::Dependency
|
47
42
|
name: mocha
|
48
43
|
requirement: !ruby/object:Gem::Requirement
|
49
|
-
none: false
|
50
44
|
requirements:
|
51
45
|
- - ~>
|
52
46
|
- !ruby/object:Gem::Version
|
@@ -54,7 +48,6 @@ dependencies:
|
|
54
48
|
type: :development
|
55
49
|
prerelease: false
|
56
50
|
version_requirements: !ruby/object:Gem::Requirement
|
57
|
-
none: false
|
58
51
|
requirements:
|
59
52
|
- - ~>
|
60
53
|
- !ruby/object:Gem::Version
|
@@ -62,7 +55,6 @@ dependencies:
|
|
62
55
|
- !ruby/object:Gem::Dependency
|
63
56
|
name: activesupport
|
64
57
|
requirement: !ruby/object:Gem::Requirement
|
65
|
-
none: false
|
66
58
|
requirements:
|
67
59
|
- - ! '>='
|
68
60
|
- !ruby/object:Gem::Version
|
@@ -70,7 +62,6 @@ dependencies:
|
|
70
62
|
type: :runtime
|
71
63
|
prerelease: false
|
72
64
|
version_requirements: !ruby/object:Gem::Requirement
|
73
|
-
none: false
|
74
65
|
requirements:
|
75
66
|
- - ! '>='
|
76
67
|
- !ruby/object:Gem::Version
|
@@ -78,7 +69,6 @@ dependencies:
|
|
78
69
|
- !ruby/object:Gem::Dependency
|
79
70
|
name: faraday
|
80
71
|
requirement: !ruby/object:Gem::Requirement
|
81
|
-
none: false
|
82
72
|
requirements:
|
83
73
|
- - ~>
|
84
74
|
- !ruby/object:Gem::Version
|
@@ -86,7 +76,6 @@ dependencies:
|
|
86
76
|
type: :runtime
|
87
77
|
prerelease: false
|
88
78
|
version_requirements: !ruby/object:Gem::Requirement
|
89
|
-
none: false
|
90
79
|
requirements:
|
91
80
|
- - ~>
|
92
81
|
- !ruby/object:Gem::Version
|
@@ -94,7 +83,6 @@ dependencies:
|
|
94
83
|
- !ruby/object:Gem::Dependency
|
95
84
|
name: multi_json
|
96
85
|
requirement: !ruby/object:Gem::Requirement
|
97
|
-
none: false
|
98
86
|
requirements:
|
99
87
|
- - ~>
|
100
88
|
- !ruby/object:Gem::Version
|
@@ -102,7 +90,6 @@ dependencies:
|
|
102
90
|
type: :runtime
|
103
91
|
prerelease: false
|
104
92
|
version_requirements: !ruby/object:Gem::Requirement
|
105
|
-
none: false
|
106
93
|
requirements:
|
107
94
|
- - ~>
|
108
95
|
- !ruby/object:Gem::Version
|
@@ -117,12 +104,12 @@ files:
|
|
117
104
|
- .gitignore
|
118
105
|
- .rspec
|
119
106
|
- .travis.yml
|
107
|
+
- CONTRIBUTING.md
|
120
108
|
- Gemfile
|
121
109
|
- LICENSE
|
122
110
|
- README.md
|
123
111
|
- Rakefile
|
124
|
-
-
|
125
|
-
- docs/UPGRADE.md
|
112
|
+
- UPGRADE.md
|
126
113
|
- examples/twitter-oauth/Gemfile
|
127
114
|
- examples/twitter-oauth/app.rb
|
128
115
|
- examples/twitter-oauth/config.ru
|
@@ -145,6 +132,7 @@ files:
|
|
145
132
|
- lib/her/model/hooks.rb
|
146
133
|
- lib/her/model/http.rb
|
147
134
|
- lib/her/model/introspection.rb
|
135
|
+
- lib/her/model/nested_attributes.rb
|
148
136
|
- lib/her/model/orm.rb
|
149
137
|
- lib/her/model/paths.rb
|
150
138
|
- lib/her/model/relationships.rb
|
@@ -157,6 +145,7 @@ files:
|
|
157
145
|
- spec/model/hooks_spec.rb
|
158
146
|
- spec/model/http_spec.rb
|
159
147
|
- spec/model/introspection_spec.rb
|
148
|
+
- spec/model/nested_attributes_spec.rb
|
160
149
|
- spec/model/orm_spec.rb
|
161
150
|
- spec/model/paths_spec.rb
|
162
151
|
- spec/model/relationships_spec.rb
|
@@ -165,33 +154,26 @@ files:
|
|
165
154
|
homepage: http://remiprev.github.com/her
|
166
155
|
licenses:
|
167
156
|
- MIT
|
157
|
+
metadata: {}
|
168
158
|
post_install_message:
|
169
159
|
rdoc_options: []
|
170
160
|
require_paths:
|
171
161
|
- lib
|
172
162
|
required_ruby_version: !ruby/object:Gem::Requirement
|
173
|
-
none: false
|
174
163
|
requirements:
|
175
164
|
- - ! '>='
|
176
165
|
- !ruby/object:Gem::Version
|
177
166
|
version: '0'
|
178
|
-
segments:
|
179
|
-
- 0
|
180
|
-
hash: -2845158545991818661
|
181
167
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
182
|
-
none: false
|
183
168
|
requirements:
|
184
169
|
- - ! '>='
|
185
170
|
- !ruby/object:Gem::Version
|
186
171
|
version: '0'
|
187
|
-
segments:
|
188
|
-
- 0
|
189
|
-
hash: -2845158545991818661
|
190
172
|
requirements: []
|
191
173
|
rubyforge_project:
|
192
|
-
rubygems_version:
|
174
|
+
rubygems_version: 2.0.0
|
193
175
|
signing_key:
|
194
|
-
specification_version:
|
176
|
+
specification_version: 4
|
195
177
|
summary: A simple Representational State Transfer-based Hypertext Transfer Protocol-powered
|
196
178
|
Object Relational Mapper. Her?
|
197
179
|
test_files:
|
@@ -203,6 +185,7 @@ test_files:
|
|
203
185
|
- spec/model/hooks_spec.rb
|
204
186
|
- spec/model/http_spec.rb
|
205
187
|
- spec/model/introspection_spec.rb
|
188
|
+
- spec/model/nested_attributes_spec.rb
|
206
189
|
- spec/model/orm_spec.rb
|
207
190
|
- spec/model/paths_spec.rb
|
208
191
|
- spec/model/relationships_spec.rb
|