gecko-ruby 0.1.0 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 08f0ea519c51017bd91d6d4a2345c1610213a2f8
4
- data.tar.gz: d3ec91d7ece3d1099d76b3f1de88f98be1e16505
3
+ metadata.gz: fd4c6e56d2678d03d389be05ba3e141724089e76
4
+ data.tar.gz: b7395c6ceab56b95dc79db04cfb0891564fb1b7a
5
5
  SHA512:
6
- metadata.gz: 7ff2a4ed0decd8212e1c91a50fb9bfc4c9b256f21a77fce2008137172884d40e0fcf64dc1b5039f32e6d9005f335c4fed534ebca84d3aaa62cc7fc62fbd4fd1e
7
- data.tar.gz: c07e8454750c183de6a4af0a9b88ea74b69cc1986ea2974d65f6f7d2867c8dfa1c4621fce172e58b25baeea36b9ce06196171402f65f4a1dc92dc850d5300dca
6
+ metadata.gz: bea2e880324d48b95e68289b5a41c0a21c7a42f55c62db2ac4233c8a81f29dbae606b381aa597733722e3bbb3ca5eac5e320a84a4c2f2b90b85ebc10cc483d28
7
+ data.tar.gz: c9e4065f15a4b4b15e05b50984f6403e811ce86311d1342f0f0eb6b19c56bed3d1572736a9ec6d7d1de8ff9c9651461692f1265167e7cc499b4a6ea6f13cc65c
data/.rubocop.yml CHANGED
@@ -1,13 +1,66 @@
1
- # I personally disagree with this default and much rather outdented keywords
2
- AccessModifierIndentation:
1
+ AllCops:
2
+ DisplayCopNames: true
3
+
4
+ # class Example
5
+ # ...
6
+ # private
7
+ # ...
8
+ # end
9
+ Style/AccessModifierIndentation:
3
10
  EnforcedStyle: outdent
4
11
 
5
- SpaceAroundEqualsInParameterDefault:
6
- EnforcedStyle: no_space
12
+ Style/Blocks:
13
+ Enabled: false
14
+
15
+ # Allows foo(bar: baz)
16
+ Style/BracesAroundHashParameters:
17
+ Enabled: false
18
+
19
+ Style/DotPosition:
20
+ EnforcedStyle: leading
21
+
22
+ Style/IndentHash:
23
+ EnforcedStyle: consistent
24
+
25
+ Style/LineLength:
26
+ Max: 120
27
+
28
+ Style/RedundantSelf:
29
+ Enabled: false
30
+
31
+ # We like neatly-aligned code
32
+ Style/SingleSpaceBeforeFirstArg:
33
+ Enabled: false
34
+
35
+ Style/SpaceAroundEqualsInParameterDefault:
36
+ Enabled: false
37
+
38
+ Style/SpaceInsideHashLiteralBraces:
39
+ Enabled: false
40
+
41
+ # Allow single or double quotes
42
+ Style/StringLiterals:
43
+ Enabled: false
7
44
 
8
- IndentHash:
45
+ # Disable this until we can work out how to allow aligning of assignments
46
+ # https://github.com/bbatsov/rubocop/blob/master/spec/rubocop/cop/style/extra_spacing_spec.rb#L23
47
+ Style/ExtraSpacing:
9
48
  Enabled: false
10
49
 
11
- # We like to line up the attribute definitions
12
- ExtraSpacing:
50
+ Style/WordArray:
13
51
  Enabled: false
52
+
53
+ Style/NumericLiterals:
54
+ Enabled: false
55
+
56
+ Style/SignalException:
57
+ Enabled: false
58
+
59
+ Metrics/ClassLength:
60
+ Enabled: false
61
+
62
+ Style/MultilineOperationIndentation:
63
+ Enabled: false
64
+
65
+ Style/ClassAndModuleChildren:
66
+ EnforcedStyle: compact
data/CHANGELOG.md CHANGED
@@ -1,3 +1,11 @@
1
+ ## 0.2.0 (2016-06-06)
2
+ - Support `writeable_on :create` for attributes
3
+ - Allow passing query parameters to `Adapter#count`
4
+ - Add `@client.Record.first` and `@client.Record.forty_two` as helpers
5
+ - Store the last API response at `@client.Record.last_response`
6
+ - Make sure to set Content-Type to `application/json`
7
+ - Clean up some deprecated fields leading up to API release (See [https://developer.tradegecko.com](https://developer.tradegecko.com) for up-to-date attribute list)
8
+
1
9
  ## 0.1.0 (2015-11-25)
2
10
  - Move default headers to the adapter base class to make it easier to merge them when overriding
3
11
  - Clean up old attributes
data/README.md CHANGED
@@ -139,6 +139,21 @@ ActiveSupport::Notifications.subscribe('request.gecko') do |name, start, finish,
139
139
  end
140
140
  ```
141
141
 
142
+ ## Checking API limits
143
+
144
+ The Gecko gem stores a copy of the last API response per adapter.
145
+ You can use this to access headers such as cache controls or current API limit usages.
146
+
147
+ ```ruby
148
+ client.Product.find(124)
149
+ client.Product.last_response.headers['X-Rate-Limit-Limit']
150
+ #=> '300'
151
+ client.Product.last_response.headers['X-Rate-Limit-Remaining']
152
+ #=> '290'
153
+ client.Product.last_response.headers['X-Rate-Limit-Reset']
154
+ #=> '1412079600'
155
+ ```
156
+
142
157
  ## TODO
143
158
  - Deleting records
144
159
  - Complete record collection
data/generate.thor CHANGED
@@ -59,7 +59,8 @@ class Gecko::#{@model_name}Test < Minitest::Test
59
59
  def test_initializes_record
60
60
  assert_instance_of(Gecko::Record::#{@model_name}, @record)
61
61
  end
62
- end}
62
+ end
63
+ }
63
64
  end
64
65
 
65
66
  def test_adapter_template
@@ -76,6 +77,7 @@ class Gecko::Record::#{@model_name}AdapterTest < Minitest::Test
76
77
  def test_initializes_adapter
77
78
  assert_instance_of(Gecko::Record::#{@model_name}Adapter, @client.#{@model_name})
78
79
  end
79
- end}
80
+ end
81
+ }
80
82
  end
81
83
  end
@@ -27,12 +27,30 @@ module Gecko
27
27
  def serializable_hash
28
28
  attribute_hash = {}
29
29
  attribute_set.each do |attribute|
30
- next if attribute.options[:readonly]
30
+ next unless writeable?(attribute)
31
31
  serialize_attribute(attribute_hash, attribute)
32
32
  end
33
33
  attribute_hash
34
34
  end
35
35
 
36
+ # Returns true if an attribute can be serialized
37
+ #
38
+ # @return [Boolean]
39
+ #
40
+ # @api private
41
+ def writeable?(attribute)
42
+ return if attribute.options[:readonly]
43
+ return true unless attribute.options[:writeable_on]
44
+ case attribute.options[:writeable_on]
45
+ when :update
46
+ persisted?
47
+ when :create
48
+ !persisted?
49
+ else
50
+ raise ArgumentError
51
+ end
52
+ end
53
+
36
54
  # Store the serialized representation of a single attribute
37
55
  #
38
56
  # @param [Hash] attribute_hash Serialized record being iterated over
@@ -37,10 +37,8 @@ module Gecko
37
37
  attribute :tax_label, String
38
38
  attribute :tax_number_label, String
39
39
 
40
- # attribute :stock_level_warn, String
41
-
42
40
  ## DEPRECATED
43
- attribute :default_tax_rate, String
41
+ # attribute :default_tax_rate, String
44
42
  # attribute :default_tax_type, String
45
43
  end
46
44
 
@@ -3,7 +3,7 @@ require 'gecko/record/base'
3
3
  module Gecko
4
4
  module Record
5
5
  class Address < Base
6
- belongs_to :company
6
+ belongs_to :company, writeable_on: :create
7
7
 
8
8
  attribute :label, String
9
9
 
@@ -1,7 +1,7 @@
1
1
  module Gecko
2
2
  module Record
3
3
  class BaseAdapter
4
- attr_reader :client
4
+ attr_reader :client, :last_response
5
5
  # Instantiates a new Record Adapter
6
6
  #
7
7
  # @param [Gecko::Client] client
@@ -84,10 +84,10 @@ module Gecko
84
84
  end
85
85
  end
86
86
 
87
- # Make an API request with parameters. Parameters vary via Record Type
87
+ # Fetch a record collection via the API. Parameters vary via Record Type
88
88
  #
89
89
  # @example Fetch via ID
90
- # client.Product.where(ids: [1,2]
90
+ # client.Product.where(ids: [1,2])
91
91
  #
92
92
  # @example Fetch via date
93
93
  # client.Product.where(updated_at_min: "2014-03-03T21:09:00")
@@ -109,22 +109,57 @@ module Gecko
109
109
  #
110
110
  # @api public
111
111
  def where(params={})
112
- response = request(:get, plural_path, params: params)
112
+ response = @last_response = request(:get, plural_path, params: params)
113
113
  parsed_response = response.parsed
114
114
  set_pagination(response.headers)
115
115
  parse_records(parsed_response)
116
116
  end
117
117
 
118
+ # Fetch the first record for the given parameters
119
+ #
120
+ # @example Fetch via ID
121
+ # client.Product.first
122
+ #
123
+ # @example Fetch via date
124
+ # client.Product.first(updated_at_min: "2014-03-03T21:09:00")
125
+ #
126
+ # @example Search
127
+ # client.Product.first(q: "gecko")
128
+ #
129
+ # @param [#to_hash] params
130
+ # @option params [String] :q Search query
131
+ # @option params [Array<Integer>] :ids IDs to search for
132
+ # @option params [String] :updated_at_min Last updated_at minimum
133
+ # @option params [String] :updated_at_max Last updated_at maximum
134
+ # @option params [String] :order Sort order i.e 'name asc'
135
+ # @option params [String, Array<String>] :status Record status/es
136
+ #
137
+ # @return <Gecko::Record::Base> A record instance
138
+ #
139
+ # @api public
140
+ def first(params={})
141
+ where(params.merge(limit: 1)).first
142
+ end
143
+
144
+ # Fetch the forty-second record for the given parameters
145
+ #
146
+ # @api public
147
+ def forty_two(params={})
148
+ where(params.merge(limit: 1, page: 42)).first
149
+ end
150
+
118
151
  # Returns the total count for a record type via API request.
119
152
  #
120
153
  # @example
121
154
  # client.Product.count
122
155
  #
156
+ # @param [#to_hash] params
157
+ #
123
158
  # @return [Integer] Total number of available records
124
159
  #
125
160
  # @api public
126
- def count
127
- self.where(limit: 0)
161
+ def count(params = {})
162
+ self.where(params.merge(limit: 0))
128
163
  @pagination['total_records']
129
164
  end
130
165
 
@@ -154,7 +189,7 @@ module Gecko
154
189
  # @api private
155
190
  def fetch(id)
156
191
  verify_id_presence!(id)
157
- response = request(:get, plural_path + '/' + id.to_s)
192
+ response = @last_response = request(:get, plural_path + '/' + id.to_s)
158
193
  record_json = extract_record(response.parsed)
159
194
  instantiate_and_register_record(record_json)
160
195
  rescue OAuth2::Error => ex
@@ -377,6 +412,8 @@ module Gecko
377
412
  payload[:body] = options[:body]
378
413
  payload[:model_class] = model_class
379
414
  payload[:request_path] = path
415
+ options[:headers] = options.fetch(:headers, {}).tap { |headers| headers['Content-Type'] = 'application/json' }
416
+ options[:body] = options[:body].to_json if options[:body]
380
417
  payload[:response] = @client.access_token.request(verb, path, options)
381
418
  end
382
419
  end
@@ -3,7 +3,7 @@ require 'gecko/record/base'
3
3
  module Gecko
4
4
  module Record
5
5
  class Contact < Base
6
- belongs_to :company
6
+ belongs_to :company, writeable_on: :create
7
7
 
8
8
  attribute :email, String
9
9
  attribute :first_name, String
@@ -18,7 +18,7 @@ module Gecko
18
18
  attribute :status, String, readonly: true
19
19
 
20
20
  ## DEPRECATED
21
- attribute :phone, String
21
+ # attribute :phone, String
22
22
  end
23
23
 
24
24
  class ContactAdapter < BaseAdapter
@@ -4,9 +4,11 @@ require 'gecko/record/fulfillment_line_item'
4
4
  module Gecko
5
5
  module Record
6
6
  class Fulfillment < Base
7
- belongs_to :order
7
+ belongs_to :order, writeable_on: :create
8
8
  belongs_to :shipping_address, class_name: 'Address'
9
9
  belongs_to :billing_address, class_name: 'Address'
10
+ belongs_to :stock_location, class_name: 'Location'
11
+
10
12
  has_many :fulfillment_line_items
11
13
 
12
14
  attribute :status, String
@@ -16,7 +18,6 @@ module Gecko
16
18
  attribute :notes, String
17
19
  attribute :tracking_url, String
18
20
  attribute :tracking_company, String
19
- attribute :destination_url, String, readonly: true
20
21
 
21
22
  attribute :packed_at, Date
22
23
  attribute :shipped_at, DateTime
@@ -3,8 +3,8 @@ require 'gecko/record/base'
3
3
  module Gecko
4
4
  module Record
5
5
  class FulfillmentLineItem < Base
6
- belongs_to :fulfillment
7
- belongs_to :order_line_item
6
+ belongs_to :fulfillment, writeable_on: :create
7
+ belongs_to :order_line_item, writeable_on: :create
8
8
 
9
9
  attribute :quantity, BigDecimal
10
10
  attribute :base_price, BigDecimal, readonly: true
@@ -3,7 +3,7 @@ require 'gecko/record/base'
3
3
  module Gecko
4
4
  module Record
5
5
  class Invoice < Base
6
- belongs_to :order
6
+ belongs_to :order, writeable_on: :create
7
7
  belongs_to :shipping_address
8
8
  belongs_to :billing_address
9
9
  belongs_to :payment_term
@@ -16,8 +16,10 @@ module Gecko
16
16
  attribute :notes, String
17
17
  attribute :exchange_rate, BigDecimal
18
18
 
19
- attribute :destination_url, String, readonly: true
20
- attribute :document_url, String, readonly: true
19
+ attribute :status, String, readonly: true
20
+ attribute :payment_status, String, readonly: true
21
+ attribute :total, BigDecimal, readonly: true
22
+ attribute :document_url, String, readonly: true
21
23
  end
22
24
 
23
25
  class InvoiceAdapter < BaseAdapter
@@ -3,7 +3,7 @@ require 'gecko/record/base'
3
3
  module Gecko
4
4
  module Record
5
5
  class InvoiceLineItem < Base
6
- belongs_to :invoice
6
+ belongs_to :invoice, writeable_on: :create
7
7
  belongs_to :order_line_item
8
8
  # belongs_to :ledger_account
9
9
  attribute :ledger_account_id, Integer
@@ -3,7 +3,6 @@ require 'gecko/record/base'
3
3
  module Gecko
4
4
  module Record
5
5
  class Location < Base
6
-
7
6
  attribute :address1, String
8
7
  attribute :address2, String
9
8
  attribute :suburb, String
@@ -28,7 +28,11 @@ module Gecko
28
28
  attribute :packed_status, String, readonly: true
29
29
  attribute :fulfillment_status, String, readonly: true
30
30
  attribute :invoice_status, String, readonly: true
31
- attribute :payment_status, String
31
+ attribute :payment_status, String, readonly: true
32
+ attribute :return_status, String, readonly: true
33
+ attribute :returning_status, String, readonly: true
34
+ attribute :shippability_status, String, readonly: true
35
+ attribute :backordering_status, String, readonly: true
32
36
  attribute :tax_treatment, String
33
37
  attribute :issued_at, Date
34
38
  attribute :ship_at, Date
@@ -3,8 +3,8 @@ require 'gecko/record/base'
3
3
  module Gecko
4
4
  module Record
5
5
  class OrderLineItem < Base
6
- belongs_to :order
7
- belongs_to :variant
6
+ belongs_to :order, writeable_on: :create
7
+ belongs_to :variant, writeable_on: :create
8
8
  belongs_to :tax_type
9
9
 
10
10
  has_many :fulfillment_line_items
@@ -17,8 +17,6 @@ module Gecko
17
17
  attribute :status, String
18
18
 
19
19
  attribute :image_url, String, readonly: true
20
- # attribute :quantity, Integer, readonly: true
21
- # attribute :search_cache, String, readonly: true
22
20
  end
23
21
 
24
22
  class ProductAdapter < BaseAdapter
@@ -19,18 +19,22 @@ module Gecko
19
19
  attribute :reference_number, String
20
20
  attribute :email, String
21
21
  attribute :due_at, Date
22
+ attribute :received_at, Date
22
23
 
23
24
  attribute :status, String
24
25
  attribute :procurement_status, String, readonly: true
25
26
  attribute :notes, String
26
27
  attribute :tax_treatment, String
27
28
 
28
- attribute :destination_url, String, readonly: true
29
29
  attribute :document_url, String, readonly: true
30
30
 
31
31
  attribute :total, BigDecimal, readonly: true
32
32
  attribute :cached_quantity, BigDecimal, readonly: true
33
- attribute :cached_total, BigDecimal, readonly: true
33
+
34
+ attribute :tags, Array[String]
35
+
36
+ # DEPRECATED
37
+ # attribute :cached_total, BigDecimal, readonly: true
34
38
  end
35
39
 
36
40
  class PurchaseOrderAdapter < BaseAdapter
@@ -3,8 +3,8 @@ require 'gecko/record/base'
3
3
  module Gecko
4
4
  module Record
5
5
  class PurchaseOrderLineItem < Base
6
- belongs_to :purchase_order
7
- belongs_to :variant
6
+ belongs_to :purchase_order, writeable_on: :create
7
+ belongs_to :variant, writeable_on: :create
8
8
  belongs_to :procurement
9
9
  belongs_to :tax_type
10
10
 
@@ -9,7 +9,7 @@ module Gecko
9
9
 
10
10
  attribute :status, String, readonly: true
11
11
 
12
- # has_many :tax_components
12
+ has_many :tax_components
13
13
  end
14
14
 
15
15
  class TaxTypeAdapter < BaseAdapter
@@ -16,11 +16,6 @@ module Gecko
16
16
  attribute :status, String, readonly: true
17
17
  attribute :billing_contact, Boolean, readonly: true
18
18
 
19
- # attribute :sales_report_email, Boolean
20
- # attribute :action_items_email, String
21
-
22
- # attribute :notification_email, Boolean
23
- # attribute :permissions, Array[String]
24
19
  # attribute :account_id, Integer
25
20
 
26
21
  ## DEPRECATED
@@ -21,7 +21,7 @@ module Gecko
21
21
  attribute :value, BigDecimal
22
22
  end
23
23
 
24
- belongs_to :product
24
+ belongs_to :product, writeable_on: :create
25
25
  has_many :images
26
26
 
27
27
  attribute :name, String
@@ -36,6 +36,7 @@ module Gecko
36
36
  attribute :opt3, String
37
37
 
38
38
  attribute :weight, String
39
+ attribute :weight_unit, String
39
40
 
40
41
  attribute :status, String, readonly: true
41
42
 
@@ -54,7 +55,6 @@ module Gecko
54
55
  attribute :reorder_point, Integer
55
56
  attribute :max_online, Integer
56
57
 
57
- attribute :composite, Boolean
58
58
  attribute :keep_selling, Boolean
59
59
  attribute :taxable, Boolean
60
60
  attribute :sellable, Boolean
@@ -63,11 +63,16 @@ module Gecko
63
63
  attribute :position, Integer
64
64
 
65
65
  attribute :stock_on_hand, BigDecimal, readonly: true
66
+ attribute :incoming_stock, BigDecimal, readonly: true
66
67
  attribute :committed_stock, BigDecimal, readonly: true
67
68
 
68
69
  attribute :locations, Array[VariantLocation]
69
70
  attribute :variant_prices, Array[VariantPrice]
70
71
 
72
+ attribute :composite, Boolean, writeable_on: :create
73
+ attribute :initial_stock_level, BigDecimal, writeable_on: :create
74
+ attribute :initial_cost_price, BigDecimal, writeable_on: :create
75
+
71
76
  # Returns a display name for a variant
72
77
  #
73
78
  # @example
data/lib/gecko/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Gecko
2
- VERSION = '0.1.0'
2
+ VERSION = '0.2.0'
3
3
  end
@@ -13,6 +13,8 @@ class Gecko::Helpers::SerializationHelperTest < Minitest::Test
13
13
  Widget = Class.new(Gecko::Record::Base) do
14
14
  attribute :name, String
15
15
  attribute :secret, String, readonly: true
16
+ attribute :initial_stock, BigDecimal, writeable_on: :create
17
+ attribute :update_stock, BigDecimal, writeable_on: :update
16
18
  attribute :score, BigDecimal
17
19
  attribute :started_on, Date
18
20
  attribute :started_at, DateTime
@@ -27,6 +29,8 @@ class Gecko::Helpers::SerializationHelperTest < Minitest::Test
27
29
  Widget.new(@client, {
28
30
  name: "Gecko",
29
31
  secret: "Iguana",
32
+ initial_stock: 10.0,
33
+ update_stock: 10.0,
30
34
  score: 1.234,
31
35
  started_at: DateTime.now,
32
36
  started_on: Date.today,
@@ -47,6 +51,18 @@ class Gecko::Helpers::SerializationHelperTest < Minitest::Test
47
51
  assert_equal({widget: record.serializable_hash}, record.as_json)
48
52
  end
49
53
 
54
+ def test_writeable_on_create
55
+ assert_equal(serialized_record, record.serializable_hash)
56
+ end
57
+
58
+ def test_writeable_on_update
59
+ cleaned_record = serialized_record
60
+ cleaned_record.delete(:initial_stock)
61
+ cleaned_record[:update_stock] = "10.0"
62
+ record.id = 1
63
+ assert_equal(cleaned_record, record.serializable_hash)
64
+ end
65
+
50
66
  def test_serializable_hash
51
67
  assert_equal(serialized_record, record.serializable_hash)
52
68
  end
@@ -69,6 +85,7 @@ private
69
85
  def serialized_record
70
86
  {
71
87
  name: "Gecko",
88
+ initial_stock: "10.0",
72
89
  score: "1.234",
73
90
  started_on: Date.today,
74
91
  started_at: DateTime.now,
@@ -18,7 +18,7 @@ class Gecko::FulfillmentTest < Minitest::Test
18
18
 
19
19
  def test_serialization
20
20
  json_keys = %w(
21
- order_id shipping_address_id billing_address_id status exchange_rate
21
+ order_id shipping_address_id billing_address_id status stock_location_id exchange_rate
22
22
  delivery_type tracking_number notes tracking_url tracking_company packed_at
23
23
  service shipped_at received_at receipt
24
24
  ).map(&:to_sym)
@@ -150,7 +150,7 @@ private
150
150
  mock_token = mock
151
151
  mock_response = mock(status: response[0], parsed: response[1])
152
152
  mock_token.expects(:request)
153
- .with(request[0], request[1], body: record.as_json, raise_errors: false)
153
+ .with(request[0], request[1], body: record.as_json.to_json, raise_errors: false, headers: {'Content-Type' => 'application/json'})
154
154
  .returns(mock_response)
155
155
  adapter.client.access_token = mock_token
156
156
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: gecko-ruby
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Bradley Priest
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-11-25 00:00:00.000000000 Z
11
+ date: 2016-06-06 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -357,7 +357,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
357
357
  version: '0'
358
358
  requirements: []
359
359
  rubyforge_project:
360
- rubygems_version: 2.4.5
360
+ rubygems_version: 2.6.4
361
361
  signing_key:
362
362
  specification_version: 4
363
363
  summary: A Ruby interface to the TradeGecko API.