test_track_rails_client 4.0.0.alpha12 → 4.0.0.alpha13

Sign up to get free protection for your applications and to get access to all the features.
Files changed (30) hide show
  1. checksums.yaml +4 -4
  2. data/lib/test_track_rails_client/version.rb +1 -1
  3. data/vendor/gems/fakeable_her/lib/fakeable_her/model.rb +4 -21
  4. data/vendor/gems/her/her.gemspec +5 -6
  5. data/vendor/gems/her/lib/her/api.rb +30 -22
  6. data/vendor/gems/her/lib/her/collection.rb +2 -1
  7. data/vendor/gems/her/lib/her/errors.rb +11 -1
  8. data/vendor/gems/her/lib/her/json_api/model.rb +8 -12
  9. data/vendor/gems/her/lib/her/middleware/accept_json.rb +1 -0
  10. data/vendor/gems/her/lib/her/middleware/first_level_parse_json.rb +6 -5
  11. data/vendor/gems/her/lib/her/middleware/json_api_parser.rb +6 -5
  12. data/vendor/gems/her/lib/her/middleware/parse_json.rb +2 -1
  13. data/vendor/gems/her/lib/her/middleware/second_level_parse_json.rb +6 -5
  14. data/vendor/gems/her/lib/her/middleware.rb +1 -1
  15. data/vendor/gems/her/lib/her/model/associations/association.rb +38 -16
  16. data/vendor/gems/her/lib/her/model/associations/association_proxy.rb +2 -3
  17. data/vendor/gems/her/lib/her/model/associations/belongs_to_association.rb +1 -1
  18. data/vendor/gems/her/lib/her/model/associations/has_many_association.rb +3 -3
  19. data/vendor/gems/her/lib/her/model/associations.rb +6 -6
  20. data/vendor/gems/her/lib/her/model/attributes.rb +121 -92
  21. data/vendor/gems/her/lib/her/model/base.rb +2 -2
  22. data/vendor/gems/her/lib/her/model/http.rb +4 -4
  23. data/vendor/gems/her/lib/her/model/introspection.rb +6 -4
  24. data/vendor/gems/her/lib/her/model/nested_attributes.rb +1 -1
  25. data/vendor/gems/her/lib/her/model/orm.rb +101 -29
  26. data/vendor/gems/her/lib/her/model/parse.rb +35 -28
  27. data/vendor/gems/her/lib/her/model/paths.rb +3 -4
  28. data/vendor/gems/her/lib/her/model/relation.rb +51 -24
  29. data/vendor/gems/her/lib/her/version.rb +1 -1
  30. metadata +2 -2
@@ -10,7 +10,7 @@ module Her
10
10
  # @user.to_params
11
11
  # # => { :id => 1, :name => 'John Smith' }
12
12
  def to_params
13
- self.class.to_params(self.attributes, self.changes)
13
+ self.class.to_params(attributes, changes)
14
14
  end
15
15
 
16
16
  module ClassMethods
@@ -31,14 +31,21 @@ module Her
31
31
  end
32
32
 
33
33
  # @private
34
- def to_params(attributes, changes={})
35
- filtered_attributes = attributes.dup.symbolize_keys
34
+ def to_params(attributes, changes = {})
35
+ filtered_attributes = attributes.each_with_object({}) do |(key, value), memo|
36
+ case value
37
+ when Her::Model
38
+ when ActiveModel::Serialization
39
+ value = value.serializable_hash.symbolize_keys
40
+ end
41
+
42
+ memo[key.to_sym] = value
43
+ end
44
+
36
45
  filtered_attributes.merge!(embeded_params(attributes))
46
+
37
47
  if her_api.options[:send_only_modified_attributes]
38
- filtered_attributes = changes.symbolize_keys.keys.inject({}) do |hash, attribute|
39
- hash[attribute] = filtered_attributes[attribute]
40
- hash
41
- end
48
+ filtered_attributes.slice! *changes.keys.map(&:to_sym)
42
49
  end
43
50
 
44
51
  if include_root_in_json?
@@ -52,20 +59,16 @@ module Her
52
59
  end
53
60
  end
54
61
 
55
-
56
62
  # @private
57
- # TODO: Handle has_one
58
63
  def embeded_params(attributes)
59
- associations[:has_many].select { |a| attributes.include?(a[:data_key])}.compact.inject({}) do |hash, association|
60
- params = attributes[association[:data_key]].map(&:to_params)
61
- next hash if params.empty?
62
- if association[:class_name].constantize.include_root_in_json?
63
- root = association[:class_name].constantize.root_element
64
- hash[association[:data_key]] = params.map { |n| n[root] }
65
- else
66
- hash[association[:data_key]] = params
67
- end
68
- hash
64
+ associations.values.flatten.each_with_object({}) do |definition, hash|
65
+ value = case association = attributes[definition[:name]]
66
+ when Her::Collection, Array
67
+ association.map { |a| a.to_params }.reject(&:empty?)
68
+ when Her::Model
69
+ association.to_params
70
+ end
71
+ hash[definition[:data_key]] = value if value.present?
69
72
  end
70
73
  end
71
74
 
@@ -127,11 +130,11 @@ module Her
127
130
  # user.name # => "Tobias"
128
131
  def root_element(value = nil)
129
132
  if value.nil?
130
- if json_api_format?
131
- @_her_root_element ||= self.name.split("::").last.pluralize.underscore.to_sym
132
- else
133
- @_her_root_element ||= self.name.split("::").last.underscore.to_sym
134
- end
133
+ @_her_root_element ||= if json_api_format?
134
+ name.split("::").last.pluralize.underscore.to_sym
135
+ else
136
+ name.split("::").last.underscore.to_sym
137
+ end
135
138
  else
136
139
  @_her_root_element = value.to_sym
137
140
  end
@@ -139,7 +142,8 @@ module Her
139
142
 
140
143
  # @private
141
144
  def root_element_included?(data)
142
- data.keys.to_s.include? @_her_root_element.to_s
145
+ element = data[parsed_root_element]
146
+ element.is_a?(Hash) || element.is_a?(Array)
143
147
  end
144
148
 
145
149
  # @private
@@ -198,17 +202,20 @@ module Her
198
202
 
199
203
  # @private
200
204
  def request_new_object_on_build?
201
- @_her_request_new_object_on_build || (superclass.respond_to?(:request_new_object_on_build?) && superclass.request_new_object_on_build?)
205
+ return @_her_request_new_object_on_build unless @_her_request_new_object_on_build.nil?
206
+ superclass.respond_to?(:request_new_object_on_build?) && superclass.request_new_object_on_build?
202
207
  end
203
208
 
204
209
  # @private
205
210
  def include_root_in_json?
206
- @_her_include_root_in_json || (superclass.respond_to?(:include_root_in_json?) && superclass.include_root_in_json?)
211
+ return @_her_include_root_in_json unless @_her_include_root_in_json.nil?
212
+ superclass.respond_to?(:include_root_in_json?) && superclass.include_root_in_json?
207
213
  end
208
214
 
209
215
  # @private
210
216
  def parse_root_in_json?
211
- @_her_parse_root_in_json || (superclass.respond_to?(:parse_root_in_json?) && superclass.parse_root_in_json?)
217
+ return @_her_parse_root_in_json unless @_her_parse_root_in_json.nil?
218
+ superclass.respond_to?(:parse_root_in_json?) && superclass.parse_root_in_json?
212
219
  end
213
220
  end
214
221
  end
@@ -19,7 +19,6 @@ module Her
19
19
  end
20
20
 
21
21
  module ClassMethods
22
-
23
22
  # Define the primary key field that will be used to find and save records
24
23
  #
25
24
  # @example
@@ -88,13 +87,13 @@ module Her
88
87
  # Return a custom path based on the collection path and variable parameters
89
88
  #
90
89
  # @private
91
- def build_request_path(path=nil, parameters={})
90
+ def build_request_path(path = nil, parameters = {})
92
91
  parameters = parameters.try(:with_indifferent_access)
93
92
 
94
93
  unless path.is_a?(String)
95
94
  parameters = path.try(:with_indifferent_access) || parameters
96
95
  path =
97
- if parameters.include?(primary_key) && parameters[primary_key] && !parameters[primary_key].kind_of?(Array)
96
+ if parameters.include?(primary_key) && parameters[primary_key] && !parameters[primary_key].is_a?(Array)
98
97
  resource_path.dup
99
98
  else
100
99
  collection_path.dup
@@ -117,7 +116,7 @@ module Her
117
116
  end
118
117
 
119
118
  # @private
120
- def build_request_path_from_string_or_symbol(path, params={})
119
+ def build_request_path_from_string_or_symbol(path, params = {})
121
120
  path.is_a?(Symbol) ? "#{build_request_path(params)}/#{path}" : path
122
121
  end
123
122
  end
@@ -1,8 +1,10 @@
1
1
  module Her
2
2
  module Model
3
3
  class Relation
4
+
4
5
  # @private
5
6
  attr_accessor :params, :request_headers, :request_options
7
+ attr_writer :parent
6
8
 
7
9
  # @private
8
10
  def initialize(parent)
@@ -49,7 +51,7 @@ module Her
49
51
  # # Fetched via GET "/users?approved=1"
50
52
  def where(params = {})
51
53
  return self if params.blank? && !@_fetch.nil?
52
- self.clone.tap do |r|
54
+ clone.tap do |r|
53
55
  r.params = r.params.merge(params)
54
56
  r.clear_fetch_cache!
55
57
  end
@@ -75,7 +77,7 @@ module Her
75
77
 
76
78
  # @private
77
79
  def kind_of?(thing)
78
- fetch.kind_of?(thing)
80
+ fetch.is_a?(thing)
79
81
  end
80
82
 
81
83
  # Fetch a collection of resources
@@ -83,32 +85,14 @@ module Her
83
85
  # @private
84
86
  def fetch
85
87
  @_fetch ||= begin
86
- path = @parent.build_request_path(@params)
88
+ path = @parent.build_request_path(@parent.collection_path, @params)
87
89
  method = @parent.method_for(:find)
88
- @parent.request(@params.merge(:_method => method, :_path => path, :_headers => request_headers, :_options => request_options)) do |parsed_data, response|
90
+ @parent.request(@params.merge(:_method => method, :_path => path, :_headers => request_headers, :_options => request_options)) do |parsed_data, _|
89
91
  @parent.new_collection(parsed_data)
90
92
  end
91
93
  end
92
94
  end
93
95
 
94
- # Fetch specific resource by some of its attributes
95
- #
96
- # @example
97
- # @user = User.find_by(id: 1)
98
- # # Fetched via GET "/users/1"
99
- #
100
- # @example
101
- # @users = User.find_by(id: 1, age: 25)
102
- # # Fetched via GET "/users/1?age=25"
103
- #
104
- # @example
105
- # @users = User.find_by(age: 25)
106
- # # Fetched via GET "/users?age=25"
107
- # # locally limit to single result
108
- def find_by(params = {})
109
- where(params).first
110
- end
111
-
112
96
  # Fetch first result
113
97
  #
114
98
  # @example
@@ -181,7 +165,6 @@ module Her
181
165
  @parent.request(request_params) do |parsed_data, response|
182
166
  if response.success?
183
167
  resource = @parent.new_from_parsed_data(parsed_data)
184
- resource.instance_variable_set(:@changed_attributes, {})
185
168
  resource.run_callbacks :find
186
169
  else
187
170
  raise Her::Errors::ResponseError.for(response.status).new("Request against #{@parent.name} returned a #{response.status}")
@@ -191,7 +174,51 @@ module Her
191
174
  resource
192
175
  end
193
176
 
194
- ids.length > 1 || ids.first.kind_of?(Array) ? results : results.first
177
+ ids.length > 1 || ids.first.is_a?(Array) ? results : results.first
178
+ end
179
+
180
+ # Fetch first resource with the given attributes.
181
+ #
182
+ # If no resource is found, returns <tt>nil</tt>.
183
+ #
184
+ # @example
185
+ # @user = User.find_by(name: "Tobias", age: 42)
186
+ # # Called via GET "/users?name=Tobias&age=42"
187
+ def find_by(params)
188
+ where(params).first
189
+ end
190
+
191
+ # Fetch first resource with the given attributes, or create a resource
192
+ # with the attributes if one is not found.
193
+ #
194
+ # @example
195
+ # @user = User.find_or_create_by(email: "remi@example.com")
196
+ #
197
+ # # Returns the first item in the collection if present:
198
+ # # Called via GET "/users?email=remi@example.com"
199
+ #
200
+ # # If collection is empty:
201
+ # # POST /users with `email=remi@example.com`
202
+ # @user.email # => "remi@example.com"
203
+ # @user.new? # => false
204
+ def find_or_create_by(attributes)
205
+ find_by(attributes) || create(attributes)
206
+ end
207
+
208
+ # Fetch first resource with the given attributes, or initialize a resource
209
+ # with the attributes if one is not found.
210
+ #
211
+ # @example
212
+ # @user = User.find_or_initialize_by(email: "remi@example.com")
213
+ #
214
+ # # Returns the first item in the collection if present:
215
+ # # Called via GET "/users?email=remi@example.com"
216
+ #
217
+ # # If collection is empty:
218
+ # @user.email # => "remi@example.com"
219
+ # @user.new? # => true
220
+ def find_or_initialize_by(attributes)
221
+ find_by(attributes) || build(attributes)
195
222
  end
196
223
 
197
224
  # Create a resource and return it
@@ -1,3 +1,3 @@
1
1
  module Her
2
- VERSION = "0.8.6"
2
+ VERSION = "1.0.3"
3
3
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: test_track_rails_client
3
3
  version: !ruby/object:Gem::Version
4
- version: 4.0.0.alpha12
4
+ version: 4.0.0.alpha13
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ryan O'Neill
@@ -13,7 +13,7 @@ authors:
13
13
  autorequire:
14
14
  bindir: bin
15
15
  cert_chain: []
16
- date: 2018-10-29 00:00:00.000000000 Z
16
+ date: 2018-10-30 00:00:00.000000000 Z
17
17
  dependencies:
18
18
  - !ruby/object:Gem::Dependency
19
19
  name: airbrake