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
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 4c2b35880164766dbe0b25ecdcdd01209d4de04e
4
- data.tar.gz: deff9940d846ef7fccec9f6e22c8d9daeb94c039
3
+ metadata.gz: f4a778c1664c68c4ddab8f3ca75a3a3b55c10650
4
+ data.tar.gz: 6fcf9637535419b34e4ce377a91804c0497623fe
5
5
  SHA512:
6
- metadata.gz: e6e2fc360779c08866d0d13248e73431ae2df31d9afc0914e973cb52b89bc0f472737cbe07bbd3044cc964859c09e9e3a65e9e1345812ef041dfe0cbdb6ed478
7
- data.tar.gz: 569a29cb2a620bb6b28777887c1e9d7b00ed19d96a8850bf1ea1dc3129dfe60a07967102f3f394dffa9b4f3e08a536c464f315e160a896bc9a95530c95444781
6
+ metadata.gz: b35d4919150c7fd05b48d92b63779def2829e5d113c35fa2d53b5a66011931e691d3da037e74cf410133cffaf04bdc630b4d61bf6ab30f8ea94232a2786ab922
7
+ data.tar.gz: e853d6515ab4417ce3044135e96f4a206a0e19dd8d44b49ce3e7a24a210206d4af3768916a4b2ab634d6bd3966851ca5b8b7ce6e06a5545d48e433eba7d9c125
@@ -1,3 +1,3 @@
1
1
  module TestTrackRailsClient
2
- VERSION = "4.0.0.alpha12" # rubocop:disable Style/MutableConstant
2
+ VERSION = "4.0.0.alpha13" # rubocop:disable Style/MutableConstant
3
3
  end
@@ -17,10 +17,7 @@ module FakeableHer
17
17
  response_attrs = fake_save_response_attributes
18
18
  assign_attributes(response_attrs) if response_attrs.present?
19
19
 
20
- if self.changed_attributes.present?
21
- @previously_changed = self.changed_attributes.clone
22
- self.changed_attributes.clear
23
- end
20
+ changes_applied
24
21
  end
25
22
  end
26
23
  true
@@ -47,19 +44,6 @@ module FakeableHer
47
44
  raise "You must define `#fake_save_response_attributes` to provide default values for #{self.class.name} during development. For more details, refer to the Retail app README."
48
45
  end
49
46
 
50
- unless method_defined?(:clear_changes_information)
51
- def clear_changes_information
52
- if respond_to?(:reset_changes)
53
- reset_changes
54
- else
55
- @previously_changed = ActiveSupport::HashWithIndifferentAccess.new
56
- @changed_attributes = ActiveSupport::HashWithIndifferentAccess.new
57
- end
58
- end
59
- end
60
-
61
- private :clear_changes_information
62
-
63
47
  module ClassMethods
64
48
  def faked?
65
49
  !ENV["#{service_name.to_s.upcase}_ENABLED"] && (Rails.env.development? || Rails.env.test?)
@@ -120,7 +104,7 @@ module FakeableHer
120
104
  if @parent.faked?
121
105
  args = ids
122
106
  args << @params if @params.present?
123
- @parent.new(@parent.fake_instance_attributes(*args)).tap { |p| p.send(:clear_changes_information) }
107
+ @parent.new(@parent.fake_instance_attributes(*args)).tap { |p| p.send(:changes_applied) }
124
108
  else
125
109
  super
126
110
  end
@@ -133,16 +117,15 @@ module FakeableHer
133
117
 
134
118
  if id_param && !id_param.is_a?(Array)
135
119
  @params.delete(@parent.primary_key)
136
- @parent.new(@parent.fake_instance_attributes(id_param, @params)).tap { |p| p.send(:clear_changes_information) }
120
+ @parent.new(@parent.fake_instance_attributes(id_param, @params)).tap { |p| p.send(:changes_applied) }
137
121
  else
138
122
  fetch_collection.first
139
123
  end
140
124
  end
141
125
 
142
126
  def fetch_collection
143
- Her::Collection.new @parent.fake_collection_attributes(@params).map { |attrs| @parent.new(attrs).tap { |p| p.send(:clear_changes_information) } }
127
+ Her::Collection.new @parent.fake_collection_attributes(@params).map { |attrs| @parent.new(attrs).tap { |p| p.send(:changes_applied) } }
144
128
  end
145
129
  end
146
130
  end
147
131
  end
148
-
@@ -1,4 +1,5 @@
1
1
  # -*- encoding: utf-8 -*-
2
+
2
3
  $:.push File.expand_path("../lib", __FILE__)
3
4
  require "her/version"
4
5
 
@@ -14,17 +15,15 @@ Gem::Specification.new do |s|
14
15
 
15
16
  s.files = `git ls-files`.split("\n")
16
17
  s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
17
- s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
18
+ s.executables = `git ls-files -- bin/*`.split("\n").map { |f| File.basename(f) }
18
19
  s.require_paths = ["lib"]
19
20
 
20
- s.add_development_dependency "rake", "~> 10.0"
21
- s.add_development_dependency "rspec", "~> 3.5"
22
21
  s.add_development_dependency "json", "~> 1.8"
23
22
  s.add_development_dependency "pry"
24
- s.add_development_dependency 'appraisal', '~> 2.2.0'
23
+ s.add_development_dependency "rake", "~> 10.0"
24
+ s.add_development_dependency "rspec", "~> 3.5"
25
25
 
26
- s.add_runtime_dependency "activemodel", ">= 3.0.0", "<= 6.0.0"
27
- s.add_runtime_dependency "activesupport", ">= 3.0.0", "<= 6.0.0"
26
+ s.add_runtime_dependency "activemodel", ">= 4.2.1"
28
27
  s.add_runtime_dependency "faraday", ">= 0.8", "< 1.0"
29
28
  s.add_runtime_dependency "multi_json", "~> 1.7"
30
29
  end
@@ -2,6 +2,7 @@ module Her
2
2
  # This class is where all HTTP requests are made. Before using Her, you must configure it
3
3
  # so it knows where to make those requests. In Rails, this is usually done in `config/initializers/her.rb`:
4
4
  class API
5
+
5
6
  # @private
6
7
  attr_reader :connection, :options
7
8
 
@@ -9,7 +10,7 @@ module Her
9
10
  FARADAY_OPTIONS = [:request, :proxy, :ssl, :builder, :url, :parallel_manager, :params, :headers, :builder_class, :timeout, :open_timeout].freeze
10
11
 
11
12
  # Setup a default API connection. Accepted arguments and options are the same as {API#setup}.
12
- def self.setup(opts={}, &block)
13
+ def self.setup(opts = {}, &block)
13
14
  @default_api = new(opts, &block)
14
15
  end
15
16
 
@@ -68,11 +69,11 @@ module Her
68
69
  # connection.use MyCustomParser
69
70
  # connection.use Faraday::Adapter::NetHttp
70
71
  # end
71
- def setup(opts={}, &blk)
72
+ def setup(opts = {}, &blk)
72
73
  opts[:url] = opts.delete(:base_uri) if opts.include?(:base_uri) # Support legacy :base_uri option
73
74
  @options = opts
74
75
 
75
- faraday_options = @options.reject { |key, value| !FARADAY_OPTIONS.include?(key.to_sym) }
76
+ faraday_options = @options.select { |key, _| FARADAY_OPTIONS.include?(key.to_sym) }
76
77
  @connection = Faraday.new(faraday_options) do |connection|
77
78
  yield connection if block_given?
78
79
  end
@@ -84,35 +85,42 @@ module Her
84
85
  # and a metadata Hash.
85
86
  #
86
87
  # @private
87
- def request(params={})
88
- method = params.delete(:_method)
89
- path = params.delete(:_path)
90
- headers = params.delete(:_headers)
91
- options = params.delete(:_options) || {}
92
- params.delete_if { |key, value| key.to_s =~ /^_/ } # Remove all internal parameters
93
- response = @connection.send method do |request|
88
+ def request(opts = {})
89
+ method = opts.delete(:_method)
90
+ path = opts.delete(:_path)
91
+ headers = opts.delete(:_headers)
92
+ options = opts.delete(:_options) || {}
93
+ opts.delete_if { |key, _| key.to_s =~ /^_/ } # Remove all internal parameters
94
+ if method == :options
95
+ # Faraday doesn't support the OPTIONS verb because of a name collision with an internal options method
96
+ # so we need to call run_request directly.
94
97
  request.headers.merge!(headers) if headers
98
+ response = @connection.run_request method, path, opts, headers
99
+ else
100
+ response = @connection.send method do |request|
101
+ request.headers.merge!(headers) if headers
95
102
 
96
- timeout = options.delete(:timeout)
97
- raise "options not implemented: #{options.keys.join(', ')}" unless options.empty?
98
- request.options[:timeout] = timeout if timeout
103
+ timeout = options.delete(:timeout)
104
+ raise "options not implemented: #{options.keys.join(', ')}" unless options.empty?
105
+ request.options[:timeout] = timeout if timeout
99
106
 
100
- if method == :get
101
- # For GET requests, treat additional parameters as querystring data
102
- request.url path, params
103
- else
104
- # For POST, PUT and DELETE requests, treat additional parameters as request body
105
- request.url path
106
- request.body = params
107
+ if method == :get
108
+ # For GET requests, treat additional parameters as querystring data
109
+ request.url path, opts
110
+ else
111
+ # For POST, PUT and DELETE requests, treat additional parameters as request body
112
+ request.url path
113
+ request.body = opts
114
+ end
107
115
  end
108
116
  end
109
-
110
117
  { :parsed_data => response.env[:body], :response => response }
111
118
  end
112
119
 
113
120
  private
121
+
114
122
  # @private
115
- def self.default_api(opts={})
123
+ def self.default_api(opts = {})
116
124
  defined?(@default_api) ? @default_api : nil
117
125
  end
118
126
  end
@@ -1,9 +1,10 @@
1
1
  module Her
2
2
  class Collection < ::Array
3
+
3
4
  attr_reader :metadata, :errors
4
5
 
5
6
  # @private
6
- def initialize(items=[], metadata={}, errors={})
7
+ def initialize(items = [], metadata = {}, errors = {})
7
8
  super(items)
8
9
  @metadata = metadata
9
10
  @errors = errors
@@ -1,9 +1,10 @@
1
1
  module Her
2
2
  module Errors
3
3
  class PathError < StandardError
4
+
4
5
  attr_reader :missing_parameter
5
6
 
6
- def initialize(message, missing_parameter=nil)
7
+ def initialize(message, missing_parameter = nil)
7
8
  super(message)
8
9
  @missing_parameter = missing_parameter
9
10
  end
@@ -36,5 +37,14 @@ module Her
36
37
 
37
38
  class RecordInvalid < ResponseError
38
39
  end
40
+
41
+ class ResourceInvalid < StandardError
42
+ attr_reader :resource
43
+ def initialize(resource)
44
+ @resource = resource
45
+ errors = @resource.response_errors.join(", ")
46
+ super("Remote validation failed: #{errors}")
47
+ end
48
+ end
39
49
  end
40
50
  end
@@ -1,13 +1,12 @@
1
1
  module Her
2
2
  module JsonApi
3
3
  module Model
4
-
5
4
  def self.included(klass)
6
5
  klass.class_eval do
7
6
  include Her::Model
8
7
 
9
8
  [:parse_root_in_json, :include_root_in_json, :root_element, :primary_key].each do |method|
10
- define_method method do |*args|
9
+ define_method method do |*_|
11
10
  raise NoMethodError, "Her::JsonApi::Model does not support the #{method} configuration option"
12
11
  end
13
12
  end
@@ -15,24 +14,21 @@ module Her
15
14
  method_for :update, :patch
16
15
 
17
16
  @type = name.demodulize.tableize
18
-
17
+
19
18
  def self.parse(data)
20
19
  data.fetch(:attributes).merge(data.slice(:id))
21
20
  end
22
21
 
23
- def self.to_params(attributes, changes={})
24
- request_data = { type: @type }.tap { |request_body|
25
- attrs = attributes.dup.symbolize_keys.tap { |filtered_attributes|
22
+ def self.to_params(attributes, changes = {})
23
+ request_data = { type: @type }.tap do |request_body|
24
+ attrs = attributes.dup.symbolize_keys.tap do |filtered_attributes|
26
25
  if her_api.options[:send_only_modified_attributes]
27
- filtered_attributes = changes.symbolize_keys.keys.inject({}) do |hash, attribute|
28
- hash[attribute] = filtered_attributes[attribute]
29
- hash
30
- end
26
+ filtered_attributes.slice! *changes.keys.map(&:to_sym)
31
27
  end
32
- }
28
+ end
33
29
  request_body[:id] = attrs.delete(:id) if attrs[:id]
34
30
  request_body[:attributes] = attrs
35
- }
31
+ end
36
32
  { data: request_data }
37
33
  end
38
34
 
@@ -2,6 +2,7 @@ module Her
2
2
  module Middleware
3
3
  # This middleware adds a "Accept: application/json" HTTP header
4
4
  class AcceptJSON < Faraday::Middleware
5
+
5
6
  # @private
6
7
  def add_header(headers)
7
8
  headers.merge! "Accept" => "application/json"
@@ -2,6 +2,7 @@ module Her
2
2
  module Middleware
3
3
  # This middleware treat the received first-level JSON structure as the resource data.
4
4
  class FirstLevelParseJSON < ParseJSON
5
+
5
6
  # Parse the response body
6
7
  #
7
8
  # @param [String] body The response body
@@ -25,11 +26,11 @@ module Her
25
26
  # @private
26
27
  def on_complete(env)
27
28
  env[:body] = case env[:status]
28
- when 204
29
- parse('{}')
30
- else
31
- parse(env[:body])
32
- end
29
+ when 204
30
+ parse('{}')
31
+ else
32
+ parse(env[:body])
33
+ end
33
34
  end
34
35
  end
35
36
  end
@@ -3,6 +3,7 @@ module Her
3
3
  # This middleware expects the resource/collection data to be contained in the `data`
4
4
  # key of the JSON object
5
5
  class JsonApiParser < ParseJSON
6
+
6
7
  # Parse the response body
7
8
  #
8
9
  # @param [String] body The response body
@@ -25,11 +26,11 @@ module Her
25
26
  # @private
26
27
  def on_complete(env)
27
28
  env[:body] = case env[:status]
28
- when 204
29
- parse('{}')
30
- else
31
- parse(env[:body])
32
- end
29
+ when 204, 304
30
+ parse('{}')
31
+ else
32
+ parse(env[:body])
33
+ end
33
34
  end
34
35
  end
35
36
  end
@@ -1,6 +1,7 @@
1
1
  module Her
2
2
  module Middleware
3
3
  class ParseJSON < Faraday::Response::Middleware
4
+
4
5
  # @private
5
6
  def parse_json(body = nil)
6
7
  body = '{}' if body.blank?
@@ -12,7 +13,7 @@ module Her
12
13
  raise Her::Errors::ParseError, message
13
14
  end
14
15
 
15
- raise Her::Errors::ParseError, message unless json.is_a?(Hash) or json.is_a?(Array)
16
+ raise Her::Errors::ParseError, message unless json.is_a?(Hash) || json.is_a?(Array)
16
17
 
17
18
  json
18
19
  end
@@ -3,6 +3,7 @@ module Her
3
3
  # This middleware expects the resource/collection data to be contained in the `data`
4
4
  # key of the JSON object
5
5
  class SecondLevelParseJSON < ParseJSON
6
+
6
7
  # Parse the response body
7
8
  #
8
9
  # @param [String] body The response body
@@ -25,11 +26,11 @@ module Her
25
26
  # @private
26
27
  def on_complete(env)
27
28
  env[:body] = case env[:status]
28
- when 204
29
- parse('{}')
30
- else
31
- parse(env[:body])
32
- end
29
+ when 204
30
+ parse('{}')
31
+ else
32
+ parse(env[:body])
33
+ end
33
34
  end
34
35
  end
35
36
  end
@@ -7,6 +7,6 @@ module Her
7
7
  module Middleware
8
8
  DefaultParseJSON = FirstLevelParseJSON
9
9
 
10
- autoload :JsonApiParser, 'her/middleware/json_api_parser'
10
+ autoload :JsonApiParser, 'her/middleware/json_api_parser'
11
11
  end
12
12
  end
@@ -2,6 +2,7 @@ module Her
2
2
  module Model
3
3
  module Associations
4
4
  class Association
5
+
5
6
  # @private
6
7
  attr_accessor :params
7
8
 
@@ -26,14 +27,7 @@ module Her
26
27
  return {} unless data[data_key]
27
28
 
28
29
  klass = klass.her_nearby_class(association[:class_name])
29
- if data[data_key].kind_of?(klass)
30
- { association[:name] => data[data_key] }
31
- else
32
- resource = klass.new(klass.parse(data[data_key]))
33
- resource.instance_variable_set(:@changed_attributes, {})
34
- resource.run_callbacks :find
35
- { association[:name] => resource }
36
- end
30
+ { association[:name] => klass.instantiate_record(klass, data: data[data_key]) }
37
31
  end
38
32
 
39
33
  # @private
@@ -52,8 +46,9 @@ module Her
52
46
 
53
47
  return @cached_result unless @params.any? || @cached_result.nil?
54
48
  return @parent.attributes[@name] unless @params.any? || @parent.attributes[@name].blank?
49
+ return @opts[:default].try(:dup) if @parent.new?
55
50
 
56
- path = build_association_path lambda { "#{@parent.request_path(@params)}#{@opts[:path]}" }
51
+ path = build_association_path -> { "#{@parent.request_path(@params)}#{@opts[:path]}" }
57
52
  @klass.get(path, @params).tap do |result|
58
53
  @cached_result = result unless @params.any?
59
54
  end
@@ -61,11 +56,16 @@ module Her
61
56
 
62
57
  # @private
63
58
  def build_association_path(code)
64
- begin
65
- instance_exec(&code)
66
- rescue Her::Errors::PathError
67
- return nil
68
- end
59
+ instance_exec(&code)
60
+ rescue Her::Errors::PathError
61
+ nil
62
+ end
63
+
64
+ # @private
65
+ def reset
66
+ @params = {}
67
+ @cached_result = nil
68
+ @parent.attributes.delete(@name)
69
69
  end
70
70
 
71
71
  # Add query parameters to the HTTP request performed to fetch the data
@@ -80,7 +80,7 @@ module Her
80
80
  # user.comments.where(:approved => 1) # Fetched via GET "/users/1/comments?approved=1
81
81
  def where(params = {})
82
82
  return self if params.blank? && @parent.attributes[@name].blank?
83
- AssociationProxy.new self.clone.tap { |a| a.params = a.params.merge(params) }
83
+ AssociationProxy.new clone.tap { |a| a.params = a.params.merge(params) }
84
84
  end
85
85
  alias all where
86
86
 
@@ -96,10 +96,32 @@ module Her
96
96
  # user.comments.find(3) # Fetched via GET "/users/1/comments/3
97
97
  def find(id)
98
98
  return nil if id.blank?
99
- path = build_association_path lambda { "#{@parent.request_path(@params)}#{@opts[:path]}/#{id}" }
99
+ path = build_association_path -> { "#{@parent.request_path(@params)}#{@opts[:path]}/#{id}" }
100
100
  @klass.get_resource(path, @params)
101
101
  end
102
102
 
103
+ # Refetches the association and puts the proxy back in its initial state,
104
+ # which is unloaded. Cached associations are cleared.
105
+ #
106
+ # @example
107
+ # class User
108
+ # include Her::Model
109
+ # has_many :comments
110
+ # end
111
+ #
112
+ # class Comment
113
+ # include Her::Model
114
+ # end
115
+ #
116
+ # user = User.find(1)
117
+ # user.comments = [#<Comment(comments/2) id=2 body="Hello!">]
118
+ # user.comments.first.id = "Oops"
119
+ # user.comments.reload # => [#<Comment(comments/2) id=2 body="Hello!">]
120
+ # # Fetched again via GET "/users/1/comments"
121
+ def reload
122
+ reset
123
+ fetch
124
+ end
103
125
  end
104
126
  end
105
127
  end
@@ -15,7 +15,7 @@ module Her
15
15
  end
16
16
 
17
17
  install_proxy_methods :association,
18
- :build, :create, :where, :find, :all, :assign_nested_attributes
18
+ :build, :create, :where, :find, :all, :assign_nested_attributes, :reload
19
19
 
20
20
  # @private
21
21
  def initialize(association)
@@ -28,7 +28,7 @@ module Her
28
28
 
29
29
  # @private
30
30
  def method_missing(name, *args, &block)
31
- if :object_id == name # avoid redefining object_id
31
+ if name == :object_id # avoid redefining object_id
32
32
  return association.fetch.object_id
33
33
  end
34
34
 
@@ -38,7 +38,6 @@ module Her
38
38
  # resend message to fetched object
39
39
  __send__(name, *args, &block)
40
40
  end
41
-
42
41
  end
43
42
  end
44
43
  end
@@ -80,7 +80,7 @@ module Her
80
80
  return @parent.attributes[@name] unless @params.any? || @parent.attributes[@name].blank?
81
81
 
82
82
  path_params = @parent.attributes.merge(@params.merge(@klass.primary_key => foreign_key_value))
83
- path = build_association_path lambda { @klass.build_request_path(path_params) }
83
+ path = build_association_path -> { @klass.build_request_path(@opts[:path], path_params) }
84
84
  @klass.get_resource(path, @params).tap do |result|
85
85
  @cached_result = result if @params.blank?
86
86
  end
@@ -31,7 +31,7 @@ module Her
31
31
  return {} unless data[data_key]
32
32
 
33
33
  klass = klass.her_nearby_class(association[:class_name])
34
- { association[:name] => Her::Model::Attributes.initialize_collection(klass, :data => data[data_key]) }
34
+ { association[:name] => klass.instantiate_collection(klass, :data => data[data_key]) }
35
35
  end
36
36
 
37
37
  # Initialize a new object with a foreign key to the parent
@@ -85,14 +85,14 @@ module Her
85
85
  def fetch
86
86
  super.tap do |o|
87
87
  inverse_of = @opts[:inverse_of] || @parent.singularized_resource_name
88
- o.each { |entry| entry.send("#{inverse_of}=", @parent) }
88
+ o.each { |entry| entry.attributes[inverse_of] = @parent }
89
89
  end
90
90
  end
91
91
 
92
92
  # @private
93
93
  def assign_nested_attributes(attributes)
94
94
  data = attributes.is_a?(Hash) ? attributes.values : attributes
95
- @parent.attributes[@name] = Her::Model::Attributes.initialize_collection(@klass, :data => data)
95
+ @parent.attributes[@name] = @klass.instantiate_collection(@klass, :data => data)
96
96
  end
97
97
  end
98
98
  end
@@ -32,18 +32,18 @@ module Her
32
32
  # @private
33
33
  def associations
34
34
  @_her_associations ||= begin
35
- superclass.respond_to?(:associations) ? superclass.associations.dup : Hash.new { |h,k| h[k] = [] }
35
+ superclass.respond_to?(:associations) ? superclass.associations.dup : Hash.new { |h, k| h[k] = [] }
36
36
  end
37
37
  end
38
38
 
39
39
  # @private
40
40
  def association_names
41
- associations.inject([]) { |memo, (name, details)| memo << details }.flatten.map { |a| a[:name] }
41
+ associations.inject([]) { |memo, (_, details)| memo << details }.flatten.map { |a| a[:name] }
42
42
  end
43
43
 
44
44
  # @private
45
45
  def association_keys
46
- associations.inject([]) { |memo, (name, details)| memo << details }.flatten.map { |a| a[:data_key] }
46
+ associations.inject([]) { |memo, (_, details)| memo << details }.flatten.map { |a| a[:data_key] }
47
47
  end
48
48
 
49
49
  # Parse associations data after initializing a new object
@@ -81,7 +81,7 @@ module Her
81
81
  # @user = User.find(1)
82
82
  # @user.articles # => [#<Article(articles/2) id=2 title="Hello world.">]
83
83
  # # Fetched via GET "/users/1/articles"
84
- def has_many(name, opts={})
84
+ def has_many(name, opts = {})
85
85
  Her::Model::Associations::HasManyAssociation.attach(self, name, opts)
86
86
  end
87
87
 
@@ -106,7 +106,7 @@ module Her
106
106
  # @user = User.find(1)
107
107
  # @user.organization # => #<Organization(organizations/2) id=2 name="Foobar Inc.">
108
108
  # # Fetched via GET "/users/1/organization"
109
- def has_one(name, opts={})
109
+ def has_one(name, opts = {})
110
110
  Her::Model::Associations::HasOneAssociation.attach(self, name, opts)
111
111
  end
112
112
 
@@ -132,7 +132,7 @@ module Her
132
132
  # @user = User.find(1) # => #<User(users/1) id=1 team_id=2 name="Tobias">
133
133
  # @user.team # => #<Team(teams/2) id=2 name="Developers">
134
134
  # # Fetched via GET "/teams/2"
135
- def belongs_to(name, opts={})
135
+ def belongs_to(name, opts = {})
136
136
  Her::Model::Associations::BelongsToAssociation.attach(self, name, opts)
137
137
  end
138
138
  end