her 1.0.3 → 1.1.0
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 +4 -4
- data/.ruby-version +1 -0
- data/.travis.yml +2 -1
- data/README.md +4 -0
- data/lib/her/model/associations.rb +1 -1
- data/lib/her/model/associations/belongs_to_association.rb +1 -2
- data/lib/her/model/attributes.rb +8 -0
- data/lib/her/model/orm.rb +10 -0
- data/lib/her/version.rb +1 -1
- data/spec/model/associations_spec.rb +89 -8
- data/spec/model/attributes_spec.rb +4 -0
- data/spec/model/orm_spec.rb +7 -0
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c0f87d36e43920519c831bffab58456dd03219dd
|
4
|
+
data.tar.gz: 8f347722b32acb8f9a7f8f372683b09e9c305d8f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 4a239ac856dd17577b9adcfbf96d454a20ec12cdfa605bd45625261aeb93a31b04d95712b2ed5c7901f48371eadbfb08076a4318cc85276373e3e0dfb6de31a8
|
7
|
+
data.tar.gz: 9a9b886cc0050fecb2d3bff8fcec90dddd3ffac98c1af8c61c177ef5314036f19939ab29542a52305c427ebd6f8b78100199d2fddf66a4031299cbb800dff9fa
|
data/.ruby-version
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
2.2.4
|
data/.travis.yml
CHANGED
data/README.md
CHANGED
@@ -91,6 +91,10 @@ user.fullname = "Lindsay Fünke" # OR user.assign_attributes(fullname: "Lindsay
|
|
91
91
|
user.save # returns false if it fails, errors in user.response_errors array
|
92
92
|
# PUT "/users/1" with `fullname=Lindsay+Fünke`
|
93
93
|
|
94
|
+
user.update_attributes(fullname: "Maeby Fünke")
|
95
|
+
# PUT "/users/1" with `fullname=Maeby+Fünke`
|
96
|
+
|
97
|
+
# => PUT /users/1 { "id": 1, "name": "new new name" }
|
94
98
|
# Update a resource without fetching it
|
95
99
|
User.save_existing(1, fullname: "Lindsay Fünke")
|
96
100
|
# PUT "/users/1" with `fullname=Lindsay+Fünke`
|
@@ -116,7 +116,7 @@ module Her
|
|
116
116
|
# @param [Hash] opts Options
|
117
117
|
# @option opts [String] :class_name The name of the class to map objects to
|
118
118
|
# @option opts [Symbol] :data_key The attribute where the data is stored
|
119
|
-
# @option opts [Path] :path The relative path where to fetch the data
|
119
|
+
# @option opts [Path] :path The relative path where to fetch the data
|
120
120
|
# @option opts [Symbol] :foreign_key The foreign key used to build the `:id` part of the path (defaults to `{name}_id`)
|
121
121
|
#
|
122
122
|
# @example
|
data/lib/her/model/attributes.rb
CHANGED
@@ -69,7 +69,15 @@ module Her
|
|
69
69
|
# user.assign_attributes(name: "Lindsay")
|
70
70
|
# user.changes # => { :name => ["Tobias", "Lindsay"] }
|
71
71
|
def assign_attributes(new_attributes)
|
72
|
+
if !new_attributes.respond_to?(:to_hash)
|
73
|
+
raise ArgumentError, "When assigning attributes, you must pass a hash as an argument."
|
74
|
+
end
|
75
|
+
|
76
|
+
# Coerce new_attributes to hash in case of strong parameters
|
77
|
+
new_attributes = new_attributes.to_hash
|
78
|
+
|
72
79
|
@_her_attributes ||= attributes
|
80
|
+
|
73
81
|
# Use setter methods first
|
74
82
|
unset_attributes = self.class.use_setter_methods(self, new_attributes)
|
75
83
|
|
data/lib/her/model/orm.rb
CHANGED
@@ -61,6 +61,16 @@ module Her
|
|
61
61
|
self
|
62
62
|
end
|
63
63
|
|
64
|
+
# Update a resource and return it
|
65
|
+
#
|
66
|
+
# @example
|
67
|
+
# @user = User.find(1)
|
68
|
+
# @user.update_attributes(:name => "Tobias Fünke")
|
69
|
+
# # Called via PUT "/users/1"
|
70
|
+
def update_attributes(attributes)
|
71
|
+
assign_attributes(attributes) && save
|
72
|
+
end
|
73
|
+
|
64
74
|
# Destroy a resource
|
65
75
|
#
|
66
76
|
# @example
|
data/lib/her/version.rb
CHANGED
@@ -112,8 +112,7 @@ describe Her::Model::Associations do
|
|
112
112
|
data_key: :organization,
|
113
113
|
default: nil,
|
114
114
|
class_name: "Organization",
|
115
|
-
foreign_key: "organization_id"
|
116
|
-
path: "/organizations/:id"
|
115
|
+
foreign_key: "organization_id"
|
117
116
|
}
|
118
117
|
end
|
119
118
|
before { Foo::User.belongs_to :organization }
|
@@ -121,7 +120,8 @@ describe Her::Model::Associations do
|
|
121
120
|
it { is_expected.to eql [organization_association] }
|
122
121
|
end
|
123
122
|
|
124
|
-
context "
|
123
|
+
context "specifying non-default path" do
|
124
|
+
let(:path) { 'my_special_path' }
|
125
125
|
let(:organization_association) do
|
126
126
|
{
|
127
127
|
name: :organization,
|
@@ -129,7 +129,22 @@ describe Her::Model::Associations do
|
|
129
129
|
default: nil,
|
130
130
|
class_name: "Organization",
|
131
131
|
foreign_key: "organization_id",
|
132
|
-
path:
|
132
|
+
path: path
|
133
|
+
}
|
134
|
+
end
|
135
|
+
before { Foo::User.belongs_to :organization, path: path }
|
136
|
+
|
137
|
+
it { is_expected.to eql [organization_association] }
|
138
|
+
end
|
139
|
+
|
140
|
+
context "multiple" do
|
141
|
+
let(:organization_association) do
|
142
|
+
{
|
143
|
+
name: :organization,
|
144
|
+
data_key: :organization,
|
145
|
+
default: nil,
|
146
|
+
class_name: "Organization",
|
147
|
+
foreign_key: "organization_id"
|
133
148
|
}
|
134
149
|
end
|
135
150
|
let(:family_association) do
|
@@ -138,8 +153,7 @@ describe Her::Model::Associations do
|
|
138
153
|
data_key: :family,
|
139
154
|
default: nil,
|
140
155
|
class_name: "Family",
|
141
|
-
foreign_key: "family_id"
|
142
|
-
path: "/families/:id"
|
156
|
+
foreign_key: "family_id"
|
143
157
|
}
|
144
158
|
end
|
145
159
|
before do
|
@@ -216,8 +230,7 @@ describe Her::Model::Associations do
|
|
216
230
|
data_key: :org,
|
217
231
|
default: true,
|
218
232
|
class_name: "Business",
|
219
|
-
foreign_key: "org_id"
|
220
|
-
path: "/organizations/:id"
|
233
|
+
foreign_key: "org_id"
|
221
234
|
}
|
222
235
|
end
|
223
236
|
before do
|
@@ -527,6 +540,74 @@ describe Her::Model::Associations do
|
|
527
540
|
end
|
528
541
|
end
|
529
542
|
|
543
|
+
context "handling associations with collection_path" do
|
544
|
+
before do
|
545
|
+
spawn_model "Foo::Organization" do
|
546
|
+
has_many :users
|
547
|
+
parse_root_in_json true
|
548
|
+
collection_path '/special/organizations'
|
549
|
+
end
|
550
|
+
spawn_model "Foo::User" do
|
551
|
+
belongs_to :organization
|
552
|
+
end
|
553
|
+
end
|
554
|
+
|
555
|
+
context "without included data" do
|
556
|
+
before(:context) do
|
557
|
+
Her::API.setup url: "https://api.example.com" do |builder|
|
558
|
+
builder.use Her::Middleware::FirstLevelParseJSON
|
559
|
+
builder.use Faraday::Request::UrlEncoded
|
560
|
+
builder.adapter :test do |stub|
|
561
|
+
stub.get("/users/2") { [200, {}, { id: 2, name: "Lindsay Fünke", organization_id: 2 }.to_json] }
|
562
|
+
stub.get("/special/organizations/2") { [200, {}, { organization: { id: 2, name: "Bluth Company" } }.to_json] }
|
563
|
+
end
|
564
|
+
end
|
565
|
+
end
|
566
|
+
|
567
|
+
let(:user) { Foo::User.find(2) }
|
568
|
+
|
569
|
+
it "fetches data that was not included through belongs_to" do
|
570
|
+
expect(user.organization).to be_a(Foo::Organization)
|
571
|
+
expect(user.organization.id).to eq(2)
|
572
|
+
expect(user.organization.name).to eq("Bluth Company")
|
573
|
+
end
|
574
|
+
end
|
575
|
+
end
|
576
|
+
|
577
|
+
context "handling associations with path_prefix" do
|
578
|
+
before do
|
579
|
+
spawn_model "Foo::Organization" do
|
580
|
+
has_many :users
|
581
|
+
parse_root_in_json true
|
582
|
+
end
|
583
|
+
spawn_model "Foo::User" do
|
584
|
+
belongs_to :organization
|
585
|
+
end
|
586
|
+
end
|
587
|
+
|
588
|
+
context "without included data" do
|
589
|
+
before(:context) do
|
590
|
+
Her::API.setup url: "https://api.example.com" do |builder|
|
591
|
+
builder.use Her::Middleware::FirstLevelParseJSON
|
592
|
+
builder.use Faraday::Request::UrlEncoded
|
593
|
+
builder.path_prefix = 'special'
|
594
|
+
builder.adapter :test do |stub|
|
595
|
+
stub.get("/special/users/2") { [200, {}, { id: 2, name: "Lindsay Fünke", organization_id: 2 }.to_json] }
|
596
|
+
stub.get("/special/organizations/2") { [200, {}, { organization: { id: 2, name: "Bluth Company" } }.to_json] }
|
597
|
+
end
|
598
|
+
end
|
599
|
+
end
|
600
|
+
|
601
|
+
let(:user) { Foo::User.find(2) }
|
602
|
+
|
603
|
+
it "fetches data that was not included through belongs_to" do
|
604
|
+
expect(user.organization).to be_a(Foo::Organization)
|
605
|
+
expect(user.organization.id).to eq(2)
|
606
|
+
expect(user.organization.name).to eq("Bluth Company")
|
607
|
+
end
|
608
|
+
end
|
609
|
+
end
|
610
|
+
|
530
611
|
context "handling associations with details in active_model_serializers format" do
|
531
612
|
before do
|
532
613
|
spawn_model "Foo::User" do
|
@@ -86,6 +86,10 @@ describe Her::Model::Attributes do
|
|
86
86
|
@user.assign_attributes active: true
|
87
87
|
expect(@user).to be_active
|
88
88
|
end
|
89
|
+
|
90
|
+
it "expects to receive hash" do
|
91
|
+
expect { @user.assign_attributes(1) }.to raise_error(ArgumentError, 'When assigning attributes, you must pass a hash as an argument.')
|
92
|
+
end
|
89
93
|
end
|
90
94
|
|
91
95
|
context "checking resource equality" do
|
data/spec/model/orm_spec.rb
CHANGED
@@ -430,6 +430,13 @@ describe Her::Model::ORM do
|
|
430
430
|
expect(@user.fullname).to eq("Lindsay Fünke")
|
431
431
|
end
|
432
432
|
|
433
|
+
it "handle resource update through #update_attributes" do
|
434
|
+
@user = Foo::User.find(1)
|
435
|
+
expect(@user).to receive(:save).and_return(true)
|
436
|
+
@user.update_attributes(fullname: "Lindsay Fünke")
|
437
|
+
expect(@user.fullname).to eq("Lindsay Fünke")
|
438
|
+
end
|
439
|
+
|
433
440
|
it "handles resource update through #toggle without saving it" do
|
434
441
|
@user = Foo::User.find(1)
|
435
442
|
expect(@user.admin).to be_falsey
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: her
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0
|
4
|
+
version: 1.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Rémi Prévost
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2019-02-13 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: json
|
@@ -111,6 +111,7 @@ files:
|
|
111
111
|
- ".rspec"
|
112
112
|
- ".rubocop.yml"
|
113
113
|
- ".rubocop_todo.yml"
|
114
|
+
- ".ruby-version"
|
114
115
|
- ".travis.yml"
|
115
116
|
- ".yardopts"
|
116
117
|
- CONTRIBUTING.md
|