fera-api 0.1.0 → 0.1.3

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.
@@ -0,0 +1 @@
1
+ clearfix
@@ -0,0 +1,3 @@
1
+ concat
2
+ intl
3
+ swal
@@ -0,0 +1,22 @@
1
+ cattr
2
+ endcapture
3
+ endfor
4
+ endform
5
+ endif
6
+ evalsha
7
+ hdel
8
+ hget
9
+ hgetall
10
+ hkeys
11
+ hmset
12
+ sadd
13
+ sismember
14
+ smembers
15
+ spop
16
+ srem
17
+ zadd
18
+ zcount
19
+ zrangebyscore
20
+ zrank
21
+ zrem
22
+ zrevrange
data/Gemfile CHANGED
@@ -5,10 +5,13 @@ source "https://rubygems.org"
5
5
  # Specify your gem's dependencies in fera.gemspec
6
6
  gemspec
7
7
 
8
- gem "rake", "~> 13.0"
9
-
10
8
  group :development, :test do
11
- gem "rspec", "~> 3.0"
12
-
9
+ gem "pry"
10
+ gem "pry-byebug"
11
+ gem "pry-rails"
12
+ gem "pry-remote"
13
+ gem "pry-rescue"
14
+ gem "pry-stack_explorer"
13
15
  gem "rubocop"
16
+ gem "rubocop-rspec"
14
17
  end
data/Gemfile.lock CHANGED
@@ -1,18 +1,18 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- fera-api (0.1.0)
4
+ fera-api (0.1.3)
5
5
  activemodel (>= 4)
6
6
  activeresource (>= 6)
7
- activesupport (>= 5.0)
7
+ activesupport (>= 4.0)
8
8
  json-jwt (>= 1)
9
9
  require_all (>= 2)
10
10
 
11
11
  GEM
12
12
  remote: https://rubygems.org/
13
13
  specs:
14
- activemodel (6.1.6)
15
- activesupport (= 6.1.6)
14
+ activemodel (7.0.3.1)
15
+ activesupport (= 7.0.3.1)
16
16
  activemodel-serializers-xml (1.0.2)
17
17
  activemodel (> 5.x)
18
18
  activesupport (> 5.x)
@@ -21,31 +21,62 @@ GEM
21
21
  activemodel (>= 6.0)
22
22
  activemodel-serializers-xml (~> 1.0)
23
23
  activesupport (>= 6.0)
24
- activesupport (6.1.6)
24
+ activesupport (7.0.3.1)
25
25
  concurrent-ruby (~> 1.0, >= 1.0.2)
26
26
  i18n (>= 1.6, < 2)
27
27
  minitest (>= 5.1)
28
28
  tzinfo (~> 2.0)
29
- zeitwerk (~> 2.3)
29
+ addressable (2.8.0)
30
+ public_suffix (>= 2.0.2, < 5.0)
30
31
  aes_key_wrap (1.1.0)
31
32
  ast (2.4.2)
32
33
  bindata (2.4.10)
34
+ binding_of_caller (1.0.0)
35
+ debug_inspector (>= 0.0.1)
33
36
  builder (3.2.4)
37
+ byebug (11.1.3)
38
+ coderay (1.1.3)
34
39
  concurrent-ruby (1.1.10)
40
+ crack (0.4.5)
41
+ rexml
42
+ debug_inspector (1.1.0)
35
43
  diff-lcs (1.5.0)
36
- i18n (1.10.0)
44
+ hashdiff (1.0.1)
45
+ httpclient (2.8.3)
46
+ i18n (1.12.0)
37
47
  concurrent-ruby (~> 1.0)
38
- json-jwt (1.13.0)
48
+ interception (0.5)
49
+ json (2.6.2)
50
+ json-jwt (1.15.3)
39
51
  activesupport (>= 4.2)
40
52
  aes_key_wrap
41
53
  bindata
42
- minitest (5.16.0)
54
+ httpclient
55
+ method_source (1.0.0)
56
+ minitest (5.16.3)
43
57
  parallel (1.22.1)
44
- parser (3.1.2.0)
58
+ parser (3.1.2.1)
45
59
  ast (~> 2.4.1)
60
+ pry (0.14.1)
61
+ coderay (~> 1.1)
62
+ method_source (~> 1.0)
63
+ pry-byebug (3.10.1)
64
+ byebug (~> 11.0)
65
+ pry (>= 0.13, < 0.15)
66
+ pry-rails (0.3.9)
67
+ pry (>= 0.10.4)
68
+ pry-remote (0.1.8)
69
+ pry (~> 0.9)
70
+ slop (~> 3.0)
71
+ pry-rescue (1.5.2)
72
+ interception (>= 0.5)
73
+ pry (>= 0.12.0)
74
+ pry-stack_explorer (0.6.1)
75
+ binding_of_caller (~> 1.0)
76
+ pry (~> 0.13)
77
+ public_suffix (4.0.7)
46
78
  rainbow (3.1.1)
47
- rake (13.0.6)
48
- regexp_parser (2.4.0)
79
+ regexp_parser (2.5.0)
49
80
  require_all (3.0.0)
50
81
  rexml (3.2.5)
51
82
  rspec (3.11.0)
@@ -61,32 +92,49 @@ GEM
61
92
  diff-lcs (>= 1.2.0, < 2.0)
62
93
  rspec-support (~> 3.11.0)
63
94
  rspec-support (3.11.0)
64
- rubocop (1.29.0)
95
+ rubocop (1.35.0)
96
+ json (~> 2.3)
65
97
  parallel (~> 1.10)
66
- parser (>= 3.1.0.0)
98
+ parser (>= 3.1.2.1)
67
99
  rainbow (>= 2.2.2, < 4.0)
68
100
  regexp_parser (>= 1.8, < 3.0)
69
101
  rexml (>= 3.2.5, < 4.0)
70
- rubocop-ast (>= 1.17.0, < 2.0)
102
+ rubocop-ast (>= 1.20.1, < 2.0)
71
103
  ruby-progressbar (~> 1.7)
72
104
  unicode-display_width (>= 1.4.0, < 3.0)
73
- rubocop-ast (1.17.0)
105
+ rubocop-ast (1.21.0)
74
106
  parser (>= 3.1.1.0)
107
+ rubocop-rspec (2.12.1)
108
+ rubocop (~> 1.31)
75
109
  ruby-progressbar (1.11.0)
76
- tzinfo (2.0.4)
110
+ slop (3.6.0)
111
+ to_bool (2.0.0)
112
+ tzinfo (2.0.5)
77
113
  concurrent-ruby (~> 1.0)
78
- unicode-display_width (2.1.0)
79
- zeitwerk (2.5.4)
114
+ unicode-display_width (2.2.0)
115
+ webmock (3.18.0)
116
+ addressable (>= 2.8.0)
117
+ crack (>= 0.3.2)
118
+ hashdiff (>= 0.4.0, < 2.0.0)
80
119
 
81
120
  PLATFORMS
82
121
  x86_64-darwin-18
83
122
  x86_64-darwin-20
123
+ x86_64-linux
84
124
 
85
125
  DEPENDENCIES
86
126
  fera-api!
87
- rake (~> 13.0)
88
- rspec (~> 3.0)
127
+ pry
128
+ pry-byebug
129
+ pry-rails
130
+ pry-remote
131
+ pry-rescue
132
+ pry-stack_explorer
133
+ rspec (>= 3.0)
89
134
  rubocop
135
+ rubocop-rspec
136
+ to_bool
137
+ webmock (>= 3.0)
90
138
 
91
139
  BUNDLED WITH
92
140
  2.3.13
data/README.md CHANGED
@@ -1,4 +1,7 @@
1
- # Introduction
1
+ [![Checks](https://github.com/feracommerce/fera-api-ruby/actions/workflows/checks.yml/badge.svg)](https://github.com/feracommerce/fera-api-ruby/actions/workflows/checks.yml)
2
+ [![Tests](https://github.com/feracommerce/fera-api-ruby/actions/workflows/tests.yml/badge.svg)](https://github.com/feracommerce/fera-api-ruby/actions/workflows/tests.yml)
3
+
4
+ # Fera API Ruby Client
2
5
 
3
6
  Welcome to the Fera API gem for Ruby. This gem is Fera's official Ruby SDK and make it easy to interact with the Fera API.
4
7
 
@@ -9,7 +12,7 @@ Fera API Developer Docs and API Reference can be found at: [https://developers.f
9
12
  Install the gem and add to the application's Gemfile by executing:
10
13
 
11
14
  ```ruby
12
- gem 'fera', '~> 0.1'
15
+ gem 'fera-api'
13
16
  ```
14
17
 
15
18
  # Configuration
@@ -2,6 +2,6 @@
2
2
 
3
3
  module Fera
4
4
  module API
5
- VERSION = "0.1.0"
5
+ VERSION = "0.1.3"
6
6
  end
7
7
  end
data/lib/fera/api.rb CHANGED
@@ -18,11 +18,15 @@ module Fera
18
18
 
19
19
  ##
20
20
  # @param api_key [String] Public API key, Secret API key or Auth Token (if app)
21
- def self.configure(api_key, api_url: nil, strict_mode: false)
21
+ # @return [Object, ::Fera::API] Result of the block operation if given, otherwise self
22
+ def self.configure(api_key, api_url: nil, strict_mode: false, debug_mode: false)
22
23
  previous_base_site = Base.site
23
24
  previous_base_headers = Base.headers
24
25
 
25
- Base.site = api_url || 'https://api.fera.ai/v3/private'
26
+ api_url ||= 'https://api.fera.ai'
27
+ Base.site = "#{ api_url.chomp('/') }/v3/private"
28
+
29
+ @debug_mode = debug_mode
26
30
 
27
31
  if api_key =~ /^sk_/
28
32
  Base.headers['Secret-Key'] = api_key
@@ -48,9 +52,10 @@ module Fera
48
52
  else
49
53
  self
50
54
  end
51
-
52
55
  end
53
56
 
57
+ def self.debug_mode?; @debug_mode; end
58
+
54
59
  def self.revoke_token!(client_id:, client_secret:, auth_token:)
55
60
  previous_site = Base.site
56
61
 
data/lib/fera/app.rb CHANGED
@@ -29,5 +29,8 @@ module Fera
29
29
  nil
30
30
  end
31
31
 
32
+ def encode_jwt(payload)
33
+ JWT.encode(payload, @client_secret)
34
+ end
32
35
  end
33
36
  end
@@ -2,11 +2,10 @@ require_relative './collection'
2
2
 
3
3
  module Fera
4
4
  class Base < ActiveResource::Base
5
- # include ActiveModel::Dirty
6
-
7
5
  attr_reader :last_response, :last_response_body, :last_response_message, :last_response_exception, :options
8
6
 
9
7
  self.collection_parser = ::Fera::Collection
8
+ self.site ||= "https://api.fera.ai/v3/private"
10
9
 
11
10
  class << self
12
11
  def belongs_to(name, options = {})
@@ -33,13 +32,11 @@ module Fera
33
32
  elsif superclass != Object && superclass.headers
34
33
  superclass.headers
35
34
  else
36
- _headers ||= {}
35
+ _headers ||= {} # rubocop:disable Lint/UnderscorePrefixedVariableName
37
36
  end
38
37
  end
39
38
 
40
- def default_params=(default_params)
41
- @default_params = default_params
42
- end
39
+ attr_writer :default_params
43
40
 
44
41
  ##
45
42
  # @override to support extra_params
@@ -80,7 +77,7 @@ module Fera
80
77
  end
81
78
 
82
79
  def new_element_path(prefix_options = {}, extra_params = {})
83
- url = "#{prefix(prefix_options)}#{collection_name}/new#{format_extension}"
80
+ url = "#{ prefix(prefix_options) }#{ collection_name }/new#{ format_extension }"
84
81
  url += "?#{ extra_params.to_param }" if extra_params.present?
85
82
  url
86
83
  end
@@ -108,12 +105,14 @@ module Fera
108
105
 
109
106
  super(dynamic_attributes, persisted)
110
107
 
111
- association_keys.each do |name, opts|
108
+ return unless attributes.present?
109
+
110
+ association_keys.each do |name, _opts|
112
111
  if attributes.key?(name.to_s) || attributes.key?(name.to_sym)
113
112
  val = attributes.to_h[name.to_s] || attributes.to_h[name.to_sym]
114
113
  self.send("#{ name }=", val) if respond_to?("#{ name }=")
115
114
  end
116
- end if attributes.present?
115
+ end
117
116
  end
118
117
 
119
118
  def load(attributes, *args)
@@ -135,18 +134,24 @@ module Fera
135
134
  end
136
135
 
137
136
  def created_at=(new_created_at)
138
- return super(Time.parse(new_created_at)) if new_created_at.is_a?(String)
139
- super
137
+ if new_created_at.is_a?(String)
138
+ super(Time.parse(new_created_at))
139
+ else
140
+ super
141
+ end
140
142
  end
141
143
 
142
144
  def updated_at=(new_updated_at)
143
- return super(Time.parse(new_updated_at)) if new_updated_at.is_a?(String)
144
- super
145
+ if new_updated_at.is_a?(String)
146
+ super(Time.parse(new_updated_at))
147
+ else
148
+ super
149
+ end
145
150
  end
146
151
 
147
- def update(changed_attributes, extra_params = {}, raise = false)
152
+ def update(changed_attributes, extra_params = {}, raise: false)
148
153
  run_callbacks(:update) do
149
- connection.put(element_path(prefix_options, extra_params), dynamic_changed_attributes.to_json, self.class.headers).tap do |response|
154
+ connection.put(element_path(prefix_options, extra_params), changed_attributes.to_json, self.class.headers).tap do |response|
150
155
  load_attributes_from_response(response)
151
156
  end
152
157
 
@@ -165,21 +170,21 @@ module Fera
165
170
  end
166
171
 
167
172
  def update!(changed_attributes, extra_params = {})
168
- update(changed_attributes, extra_params, true)
173
+ update(changed_attributes, extra_params, raise: true)
169
174
  end
170
175
 
171
- def valid?(context = nil)
176
+ def valid?(_context = nil)
172
177
  super()
173
178
  end
174
179
 
175
180
  ##
176
- # @override to add exgtra params
177
- def create(extra_params = {}, raise = false)
181
+ # @override to add extra params
182
+ def create(extra_params = {}, raise: false)
178
183
  run_callbacks :create do
179
-
180
184
  data = as_json
181
- (self.class.belongs_tos.merge(self.class.has_ones)).each do |name, opts|
185
+ self.class.belongs_tos.merge(self.class.has_ones).each do |name, _opts|
182
186
  next unless instance_variable_defined?(:"@#{ name }")
187
+
183
188
  nested_resource = self.send(name)
184
189
  if nested_resource.present? && !nested_resource.persisted?
185
190
  nested_resource.validate!
@@ -187,8 +192,9 @@ module Fera
187
192
  end
188
193
  end
189
194
 
190
- self.class.has_manys.each do |name, opts|
195
+ self.class.has_manys.each do |name, _opts|
191
196
  next unless instance_variable_defined?(:"@#{ name }")
197
+
192
198
  nested_resource = self.send(name)
193
199
 
194
200
  next if nested_resource.nil?
@@ -203,7 +209,7 @@ module Fera
203
209
  end
204
210
  end
205
211
 
206
- connection.post(collection_path(nil, extra_params), data.to_json, self.class.headers).tap do |response|
212
+ connection.post(collection_path(nil, extra_params), { data: data }.to_json, self.class.headers).tap do |response|
207
213
  self.id = id_from_response(response)
208
214
  load_attributes_from_response(response)
209
215
  end
@@ -221,13 +227,13 @@ module Fera
221
227
  end
222
228
 
223
229
  def create!(extra_params = {})
224
- create(extra_params, true)
230
+ create(extra_params, raise: true)
225
231
  end
226
232
 
227
- def save(extra_params = {}, raise = false)
233
+ def save(extra_params = {}, raise: false)
228
234
  run_callbacks :save do
229
235
  if new?
230
- create(extra_params, raise) # We'll raise the error below
236
+ create(extra_params, raise: raise) # We'll raise the error below
231
237
  else
232
238
  # find changes
233
239
  changed_attributes = attributes.filter { |key, value| !@clean_copy.attributes.key?(key) || (@clean_copy.attributes[key] != value) || (key == self.class.primary_key) }
@@ -235,23 +241,22 @@ module Fera
235
241
  return false unless changed_attributes.keys.any?
236
242
 
237
243
  # save
238
- update(changed_attributes, extra_params, raise)
244
+ update(changed_attributes, extra_params, raise: raise)
239
245
  end
240
246
 
241
247
  @clean_copy = clone_with_nil # Clear changes
242
248
 
243
249
  self
244
250
  end
245
-
246
251
  end
247
252
 
248
253
  def save!(extra_params = {})
249
- save(extra_params, true)
254
+ save(extra_params, raise: true)
250
255
  end
251
256
 
252
257
  def clone_with_nil
253
258
  # Clone all attributes except the pk and any nested ARes
254
- cloned = Hash[attributes.reject { |k, v| k == self.class.primary_key || v.is_a?(ActiveResource::Base) }.map { |k, v| [k, v.clone] }]
259
+ cloned = attributes.reject { |k, v| k == self.class.primary_key || v.is_a?(ActiveResource::Base) }.map { |k, v| [k, v.clone] }.to_h
255
260
  # Form the new resource - bypass initialize of resource with 'new' as that will call 'load' which
256
261
  # attempts to convert hashes into member objects and arrays into collections of objects. We want
257
262
  # the raw objects to be cloned so we bypass load by directly setting the attributes hash.
@@ -288,9 +293,11 @@ module Fera
288
293
  if matcher.present?
289
294
  attribute_name = matcher[1]
290
295
  return super if attribute_name.blank?
296
+
291
297
  attribute_name = "is_#{ attribute_name }" unless attribute_name =~ /^is_/
292
298
  return super unless known_attribute?(attribute_name.to_s)
293
- return !!(send(attribute_name.to_sym).presence)
299
+
300
+ return !!send(attribute_name.to_sym).presence
294
301
  end
295
302
 
296
303
  super
@@ -301,6 +308,7 @@ module Fera
301
308
  if matcher.present?
302
309
  attribute_name = matcher[1]
303
310
  return super if attribute_name.blank?
311
+
304
312
  attribute_name = "is_#{ attribute_name }" unless attribute_name =~ /^is_/
305
313
  return true if known_attribute?(attribute_name)
306
314
  end
@@ -312,7 +320,7 @@ module Fera
312
320
  known_attributes.map(&:to_s).include?(attribute_name.to_s)
313
321
  end
314
322
 
315
- def set_last_response(result)
323
+ def set_last_response(result) # rubocop:disable Naming/AccessorMethodName
316
324
  response = if result.is_a?(StandardError)
317
325
  @last_response_exception = result
318
326
  @last_response_exception.response
@@ -370,5 +378,9 @@ module Fera
370
378
  sub_fields = sub_fields.drop(1)
371
379
  changed_attributes[sub_key] = values.map { |value| clone_selected_fields(value, sub_fields) }
372
380
  end
381
+
382
+ def debug(message)
383
+ puts "[Fera-Api] #{ message }" if ::Fera::Api.debug_mode?
384
+ end
373
385
  end
374
386
  end
@@ -5,7 +5,7 @@ module Fera
5
5
  attr_reader :result_count, :total_count, :page, :total_pages, :page_size, :offset, :limit
6
6
 
7
7
  def initialize(parsed = {})
8
- @elements = parsed['data']
8
+ super(parsed['data'])
9
9
  @result_count = parsed['result_count']
10
10
  @total_count = parsed['total_count']
11
11
 
@@ -10,8 +10,8 @@ module Fera
10
10
 
11
11
  def customer=(customer)
12
12
  if customer.is_a?(Customer)
13
- @customer = customer
14
- self.attributes['customer_id'] = customer.id
13
+ @customer = customer
14
+ self.attributes['customer_id'] = customer.id
15
15
  self.attributes['external_customer_id'] = customer.try(:external_id)
16
16
  self.attributes.delete('customer')
17
17
  elsif customer.is_a?(Hash)
@@ -32,9 +32,6 @@ module Fera
32
32
  @customer = Customer.new(customer, customer_id.present?)
33
33
  self.attributes.delete('customer')
34
34
  end
35
-
36
-
37
- @customer
38
35
  end
39
36
 
40
37
  def customer_id=(new_id)
@@ -62,8 +59,6 @@ module Fera
62
59
  Customer.find(customer_id)
63
60
  elsif attributes.key?('external_customer_id') && external_customer_id.present?
64
61
  Customer.find(external_customer_id)
65
- else
66
- nil
67
62
  end
68
63
  end
69
64
  end
@@ -9,29 +9,28 @@ module Fera
9
9
  end
10
10
 
11
11
  def order=(order)
12
- order_id = if order.is_a?(Order)
13
- order.id
14
- else
15
- order.try(:with_indifferent_access).try(:[], :id)
16
- end
12
+ order_id = if order.is_a?(Order)
13
+ order.id
14
+ else
15
+ order.try(:with_indifferent_access).try(:[], :id)
16
+ end
17
17
  external_order_id = if order.is_a?(Order)
18
- order.external_id
19
- else
20
- order.try(:with_indifferent_access).try(:[], :external_id)
21
- end
22
- @order = if order.is_a?(Order)
23
- order
24
- else
25
- Order.new(order, order_id.present?)
26
- end
18
+ order.external_id
19
+ else
20
+ order.try(:with_indifferent_access).try(:[], :external_id)
21
+ end
22
+ @order = if order.is_a?(Order)
23
+ order
24
+ else
25
+ Order.new(order, order_id.present?)
26
+ end
27
27
  self.attributes['order_id'] = order_id
28
28
  self.attributes['external_order_id'] = external_order_id
29
29
  self.attributes.delete('order')
30
- @order
31
30
  end
32
31
 
33
32
  def order_id=(new_id)
34
- return new_id if order_id == new_id
33
+ return if order_id == new_id
35
34
 
36
35
  if new_id.nil?
37
36
  reset_order_instance_assoc
@@ -41,7 +40,7 @@ module Fera
41
40
  end
42
41
 
43
42
  def external_order_id=(new_id)
44
- return new_id if external_order_id == new_id
43
+ return if external_order_id == new_id
45
44
 
46
45
  if new_id.nil?
47
46
  reset_order_instance_assoc
@@ -78,10 +77,7 @@ module Fera
78
77
  Order.find(order_id)
79
78
  elsif attributes.key?('external_order_id') && external_order_id.present?
80
79
  Order.find(external_order_id)
81
- else
82
- nil
83
80
  end
84
81
  end
85
-
86
82
  end
87
83
  end
@@ -9,25 +9,24 @@ module Fera
9
9
  end
10
10
 
11
11
  def product=(product)
12
- product_id = if product.is_a?(Product)
13
- product.id
14
- else
15
- product.try(:with_indifferent_access).try(:[], :id)
16
- end
12
+ product_id = if product.is_a?(Product)
13
+ product.id
14
+ else
15
+ product.try(:with_indifferent_access).try(:[], :id)
16
+ end
17
17
  external_product_id = if product.is_a?(Product)
18
- product.external_id
19
- else
20
- product.try(:with_indifferent_access).try(:[], :external_id)
21
- end
22
- @product = if product.is_a?(Product)
23
- product
24
- else
25
- Product.new(product, product_id.present?)
26
- end
18
+ product.external_id
19
+ else
20
+ product.try(:with_indifferent_access).try(:[], :external_id)
21
+ end
22
+ @product = if product.is_a?(Product)
23
+ product
24
+ else
25
+ Product.new(product, product_id.present?)
26
+ end
27
27
  self.attributes['product_id'] = product_id
28
28
  self.attributes['external_product_id'] = external_product_id
29
29
  self.attributes.delete('product')
30
- @product
31
30
  end
32
31
 
33
32
  def product
@@ -39,10 +38,7 @@ module Fera
39
38
  Product.find(product_id)
40
39
  elsif attributes.key?('external_product_id') && external_product_id.present?
41
40
  Product.find(external_product_id)
42
- else
43
- nil
44
41
  end
45
42
  end
46
-
47
43
  end
48
44
  end
@@ -10,18 +10,17 @@ module Fera
10
10
 
11
11
  def review=(review)
12
12
  review_id = if review.is_a?(Review)
13
- review.id
14
- else
15
- review.try(:with_indifferent_access).try(:[], :id)
16
- end
17
- @review = if review.is_a?(Review)
18
- review
19
- else
20
- Review.new(review, review_id.present?)
21
- end
13
+ review.id
14
+ else
15
+ review.try(:with_indifferent_access).try(:[], :id)
16
+ end
17
+ @review = if review.is_a?(Review)
18
+ review
19
+ else
20
+ Review.new(review, review_id.present?)
21
+ end
22
22
  self.attributes['review_id'] = review_id
23
23
  self.attributes.delete('review')
24
- @review
25
24
  end
26
25
 
27
26
  def review
@@ -31,10 +30,7 @@ module Fera
31
30
  Review.new(attributes['review'], true)
32
31
  elsif attributes.key?('review_id') && review_id.present?
33
32
  Review.find(review_id)
34
- else
35
- nil
36
33
  end
37
34
  end
38
-
39
35
  end
40
36
  end