gecko-ruby 0.0.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (132) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +19 -0
  3. data/.rubocop.yml +9 -0
  4. data/.travis.yml +5 -0
  5. data/CHANGELOG.md +41 -0
  6. data/CONTRIBUTING.md +0 -0
  7. data/Gemfile +4 -0
  8. data/LICENSE.txt +22 -0
  9. data/README.md +144 -0
  10. data/Rakefile +19 -0
  11. data/gecko-ruby.gemspec +34 -0
  12. data/generate.thor +81 -0
  13. data/lib/gecko-ruby.rb +1 -0
  14. data/lib/gecko.rb +31 -0
  15. data/lib/gecko/client.rb +132 -0
  16. data/lib/gecko/helpers/association_helper.rb +69 -0
  17. data/lib/gecko/helpers/inspection_helper.rb +51 -0
  18. data/lib/gecko/helpers/record_helper.rb +29 -0
  19. data/lib/gecko/helpers/serialization_helper.rb +61 -0
  20. data/lib/gecko/helpers/validation_helper.rb +91 -0
  21. data/lib/gecko/record/account.rb +66 -0
  22. data/lib/gecko/record/address.rb +33 -0
  23. data/lib/gecko/record/base.rb +66 -0
  24. data/lib/gecko/record/base_adapter.rb +365 -0
  25. data/lib/gecko/record/company.rb +41 -0
  26. data/lib/gecko/record/contact.rb +25 -0
  27. data/lib/gecko/record/currency.rb +23 -0
  28. data/lib/gecko/record/exceptions.rb +15 -0
  29. data/lib/gecko/record/fulfillment.rb +42 -0
  30. data/lib/gecko/record/fulfillment_line_item.rb +26 -0
  31. data/lib/gecko/record/image.rb +38 -0
  32. data/lib/gecko/record/invoice.rb +29 -0
  33. data/lib/gecko/record/invoice_line_item.rb +18 -0
  34. data/lib/gecko/record/location.rb +23 -0
  35. data/lib/gecko/record/order.rb +50 -0
  36. data/lib/gecko/record/order_line_item.rb +35 -0
  37. data/lib/gecko/record/product.rb +27 -0
  38. data/lib/gecko/record/purchase_order.rb +43 -0
  39. data/lib/gecko/record/purchase_order_line_item.rb +29 -0
  40. data/lib/gecko/record/tax_type.rb +21 -0
  41. data/lib/gecko/record/user.rb +44 -0
  42. data/lib/gecko/record/variant.rb +96 -0
  43. data/lib/gecko/version.rb +3 -0
  44. data/test/client_test.rb +29 -0
  45. data/test/fixtures/vcr_cassettes/accounts.yml +57 -0
  46. data/test/fixtures/vcr_cassettes/accounts_current.yml +57 -0
  47. data/test/fixtures/vcr_cassettes/addresses.yml +68 -0
  48. data/test/fixtures/vcr_cassettes/addresses_count.yml +58 -0
  49. data/test/fixtures/vcr_cassettes/companies.yml +62 -0
  50. data/test/fixtures/vcr_cassettes/companies_count.yml +58 -0
  51. data/test/fixtures/vcr_cassettes/contacts.yml +60 -0
  52. data/test/fixtures/vcr_cassettes/contacts_count.yml +58 -0
  53. data/test/fixtures/vcr_cassettes/currencies.yml +62 -0
  54. data/test/fixtures/vcr_cassettes/currencies_count.yml +58 -0
  55. data/test/fixtures/vcr_cassettes/fulfillments.yml +59 -0
  56. data/test/fixtures/vcr_cassettes/fulfillments_count.yml +58 -0
  57. data/test/fixtures/vcr_cassettes/images.yml +59 -0
  58. data/test/fixtures/vcr_cassettes/images_count.yml +58 -0
  59. data/test/fixtures/vcr_cassettes/invoice_line_items.yml +63 -0
  60. data/test/fixtures/vcr_cassettes/invoice_line_items_count.yml +62 -0
  61. data/test/fixtures/vcr_cassettes/invoices.yml +63 -0
  62. data/test/fixtures/vcr_cassettes/invoices_count.yml +62 -0
  63. data/test/fixtures/vcr_cassettes/locations.yml +65 -0
  64. data/test/fixtures/vcr_cassettes/locations_count.yml +58 -0
  65. data/test/fixtures/vcr_cassettes/order_line_items.yml +63 -0
  66. data/test/fixtures/vcr_cassettes/order_line_items_count.yml +62 -0
  67. data/test/fixtures/vcr_cassettes/orders.yml +62 -0
  68. data/test/fixtures/vcr_cassettes/orders_count.yml +58 -0
  69. data/test/fixtures/vcr_cassettes/products.yml +79 -0
  70. data/test/fixtures/vcr_cassettes/products_count.yml +58 -0
  71. data/test/fixtures/vcr_cassettes/products_new_invalid.yml +54 -0
  72. data/test/fixtures/vcr_cassettes/products_new_valid.yml +58 -0
  73. data/test/fixtures/vcr_cassettes/purchase_order_line_items.yml +64 -0
  74. data/test/fixtures/vcr_cassettes/purchase_order_line_items_count.yml +62 -0
  75. data/test/fixtures/vcr_cassettes/purchase_orders.yml +63 -0
  76. data/test/fixtures/vcr_cassettes/purchase_orders_count.yml +62 -0
  77. data/test/fixtures/vcr_cassettes/tax_types.yml +74 -0
  78. data/test/fixtures/vcr_cassettes/tax_types_count.yml +62 -0
  79. data/test/fixtures/vcr_cassettes/users.yml +60 -0
  80. data/test/fixtures/vcr_cassettes/users_count.yml +58 -0
  81. data/test/fixtures/vcr_cassettes/users_current.yml +54 -0
  82. data/test/fixtures/vcr_cassettes/variants.yml +60 -0
  83. data/test/fixtures/vcr_cassettes/variants_count.yml +58 -0
  84. data/test/gecko_test.rb +7 -0
  85. data/test/helpers/association_helper_test.rb +56 -0
  86. data/test/helpers/inspection_helper_test.rb +27 -0
  87. data/test/helpers/serialization_helper_test.rb +30 -0
  88. data/test/helpers/validation_helper_test.rb +24 -0
  89. data/test/record/account_adapter_test.rb +43 -0
  90. data/test/record/address_adapter_test.rb +14 -0
  91. data/test/record/address_test.rb +18 -0
  92. data/test/record/company_adapter_test.rb +14 -0
  93. data/test/record/company_test.rb +18 -0
  94. data/test/record/contact_adapter_test.rb +14 -0
  95. data/test/record/contact_test.rb +18 -0
  96. data/test/record/currency_adapter_test.rb +14 -0
  97. data/test/record/currency_test.rb +18 -0
  98. data/test/record/fulfillment_adapter_test.rb +24 -0
  99. data/test/record/fulfillment_line_item_adapter_test.rb +21 -0
  100. data/test/record/fulfillment_line_item_test.rb +18 -0
  101. data/test/record/fulfillment_test.rb +27 -0
  102. data/test/record/image_adapter_test.rb +14 -0
  103. data/test/record/image_test.rb +25 -0
  104. data/test/record/invoice_adapter_test.rb +14 -0
  105. data/test/record/invoice_line_item_adapter_test.rb +20 -0
  106. data/test/record/invoice_line_item_test.rb +18 -0
  107. data/test/record/invoice_test.rb +18 -0
  108. data/test/record/location_adapter_test.rb +14 -0
  109. data/test/record/location_test.rb +18 -0
  110. data/test/record/order_adapter_test.rb +14 -0
  111. data/test/record/order_line_item_adapter_test.rb +14 -0
  112. data/test/record/order_line_item_test.rb +18 -0
  113. data/test/record/order_test.rb +18 -0
  114. data/test/record/product_adapter_test.rb +32 -0
  115. data/test/record/product_test.rb +18 -0
  116. data/test/record/purchase_order_adapter_test.rb +14 -0
  117. data/test/record/purchase_order_line_item_adapter_test.rb +14 -0
  118. data/test/record/purchase_order_line_item_test.rb +18 -0
  119. data/test/record/purchase_order_test.rb +18 -0
  120. data/test/record/tax_type_adapter_test.rb +14 -0
  121. data/test/record/tax_type_test.rb +18 -0
  122. data/test/record/user_adapter_test.rb +27 -0
  123. data/test/record/user_test.rb +18 -0
  124. data/test/record/variant_adapter_test.rb +14 -0
  125. data/test/record/variant_test.rb +44 -0
  126. data/test/support/let.rb +10 -0
  127. data/test/support/shared_adapter_examples.rb +159 -0
  128. data/test/support/shared_record_examples.rb +21 -0
  129. data/test/support/testing_adapter.rb +11 -0
  130. data/test/support/vcr_support.rb +7 -0
  131. data/test/test_helper.rb +21 -0
  132. metadata +430 -0
@@ -0,0 +1,58 @@
1
+ ---
2
+ http_interactions:
3
+ - request:
4
+ method: get
5
+ uri: http://api.lvh.me:3000/variants?limit=0
6
+ body:
7
+ encoding: US-ASCII
8
+ string: ''
9
+ headers:
10
+ User-Agent:
11
+ - Gecko/0.0.2 OAuth2/0.9.3 Ruby/2.0.0
12
+ Authorization:
13
+ - Bearer ca89bd74c095b9d27b62c0e4dff6960123d6df6919d078e96b85081a132014ba
14
+ Accept-Encoding:
15
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
16
+ Accept:
17
+ - '*/*'
18
+ response:
19
+ status:
20
+ code: 200
21
+ message: OK
22
+ headers:
23
+ Date:
24
+ - Sat, 08 Mar 2014 04:18:47 GMT
25
+ Status:
26
+ - 200 OK
27
+ Connection:
28
+ - close
29
+ X-Frame-Options:
30
+ - SAMEORIGIN
31
+ X-Xss-Protection:
32
+ - 1; mode=block
33
+ X-Content-Type-Options:
34
+ - nosniff
35
+ X-Ua-Compatible:
36
+ - chrome=1
37
+ X-Pagination:
38
+ - '{"total_records":857,"total_pages":1,"first_page":true,"last_page":true,"out_of_bounds":false,"offset":0}'
39
+ Link:
40
+ - <http://api.lvh.me:3000/ajax/variants.json?limit=0&page=1>; rel="last"
41
+ Content-Type:
42
+ - application/json; charset=utf-8
43
+ Etag:
44
+ - '"79e77bf51df468ef5174fd75ebf26081"'
45
+ Cache-Control:
46
+ - max-age=0, private, must-revalidate
47
+ X-Request-Id:
48
+ - 0efd90d9-f263-49d1-a301-73c14048d379
49
+ X-Runtime:
50
+ - '0.192030'
51
+ Transfer-Encoding:
52
+ - chunked
53
+ body:
54
+ encoding: UTF-8
55
+ string: '{"variants":[],"meta":{"total":857}}'
56
+ http_version:
57
+ recorded_at: Sat, 08 Mar 2014 04:18:47 GMT
58
+ recorded_with: VCR 2.8.0
@@ -0,0 +1,7 @@
1
+ require 'test_helper'
2
+
3
+ class GeckoTest < Minitest::Test
4
+ def test_hello_world
5
+ assert Gecko
6
+ end
7
+ end
@@ -0,0 +1,56 @@
1
+ require 'gecko'
2
+
3
+ class Gecko::Helpers::AssociationHelperTest < Minitest::Test
4
+ def setup
5
+ @klass = Class.new(Gecko::Record::Base) do
6
+ has_many :orders
7
+ belongs_to :order
8
+ belongs_to :small_order, class_name: "Order"
9
+ end
10
+ @client = Gecko::Client.new('ABC', 'DEF')
11
+ end
12
+
13
+ def test_adds_association_methods
14
+ record = @klass.new(@client, {})
15
+ assert(record.respond_to?(:orders))
16
+ assert(record.respond_to?(:order))
17
+ assert(record.respond_to?(:small_order))
18
+ end
19
+
20
+ def test_adds_id_methods
21
+ record = @klass.new(@client, {})
22
+ assert(record.respond_to?(:order_ids))
23
+ assert(record.respond_to?(:order_id))
24
+ assert(record.respond_to?(:small_order_id))
25
+ end
26
+
27
+ def test_has_many
28
+ record = @klass.new(@client, {order_ids: [123]})
29
+ @client.Order.expects(:find_many).with([123])
30
+ record.orders
31
+ end
32
+
33
+ def test_has_many_without_ids
34
+ record = @klass.new(@client, {order_ids: []})
35
+ @client.Order.expects(:find_many).never
36
+ assert_equal([], record.orders)
37
+ end
38
+
39
+ def test_belongs_to
40
+ record = @klass.new(@client, {order_id: 4})
41
+ @client.Order.expects(:find).with(4)
42
+ record.order
43
+ end
44
+
45
+ def test_belongs_to_without_id
46
+ record = @klass.new(@client, {order_id: nil})
47
+ @client.Order.expects(:find).never
48
+ assert_nil record.order
49
+ end
50
+
51
+ def test_belongs_to_with_class
52
+ record = @klass.new(@client, {small_order_id: 56})
53
+ @client.Order.expects(:find).with(56)
54
+ record.small_order
55
+ end
56
+ end
@@ -0,0 +1,27 @@
1
+ require 'gecko'
2
+
3
+ class Gecko::Helpers::InspectionHelperTest < Minitest::Test
4
+ def setup
5
+ @klass = Class.new(Gecko::Record::Base) do
6
+ attribute :published_date, Date
7
+ attribute :published_datetime, DateTime
8
+ attribute :published_time, Time
9
+ end
10
+ @client = Gecko::Client.new('ABC', 'DEF')
11
+ end
12
+
13
+ def test_inspect_times
14
+ record = @klass.new(@client, {
15
+ published_date: Date.new(2014),
16
+ published_time: Time.new(2014),
17
+ published_datetime: DateTime.new(2014),
18
+ })
19
+ assert_equal("2014-01-01 00:00:00", get_timestamp(record.inspect, :published_time))
20
+ assert_equal("2014-01-01 00:00:00", get_timestamp(record.inspect, :published_datetime))
21
+ assert_equal("2014-01-01", get_timestamp(record.inspect, :published_date))
22
+ end
23
+
24
+ def get_timestamp(inspect_string, attribute)
25
+ inspect_string.match(%r|#{attribute}: \"(?<timestamp>[\d:\s-]+)\"|)[:timestamp]
26
+ end
27
+ end
@@ -0,0 +1,30 @@
1
+ require 'gecko'
2
+
3
+ class Gecko::Helpers::SerializationHelperTest < Minitest::Test
4
+ def setup
5
+ @klass = Class.new(Gecko::Record::Base) do
6
+ attribute :name, String
7
+ attribute :secret, String, readonly: true
8
+
9
+ def root
10
+ :widget
11
+ end
12
+ end
13
+ @client = Gecko::Client.new('ABC', 'DEF')
14
+ end
15
+
16
+ def test_serializable_hash
17
+ record = @klass.new(@client, name: "Gecko", secret: "Iguana")
18
+ assert_equal({name: "Gecko"}, record.serializable_hash)
19
+ end
20
+
21
+ def test_as_json
22
+ record = @klass.new(@client, name: "Gecko", secret: "Iguana")
23
+ assert_equal({widget: {name: "Gecko"}}, record.as_json)
24
+ end
25
+
26
+ def test_root_key
27
+ record = Gecko::Record::OrderLineItem.new(@client, @json)
28
+ assert_equal(:order_line_item, record.root)
29
+ end
30
+ end
@@ -0,0 +1,24 @@
1
+ require 'gecko'
2
+
3
+ class Gecko::Helpers::ValidationHelperTest < Minitest::Test
4
+ def setup
5
+ @klass = Class.new(Gecko::Record::Base) do
6
+ attribute :name, String
7
+ end
8
+ @client = Gecko::Client.new('ABC', 'DEF')
9
+ end
10
+
11
+ def test_initially_valid?
12
+ record = @klass.new(@client, name: "Gecko")
13
+ assert(record.valid?)
14
+ assert(record.errors.empty?)
15
+ assert(record.errors.messages.empty?)
16
+ end
17
+
18
+ def test_from_response
19
+ record = @klass.new(@client, name: "Gecko")
20
+ record.errors.from_response({name: ["is not shiny"]})
21
+ assert(!record.valid?)
22
+ assert_equal(record.errors[:name], ["is not shiny"])
23
+ end
24
+ end
@@ -0,0 +1,43 @@
1
+ require 'test_helper'
2
+ class Gecko::Record::AccountAdapterTest < Minitest::Test
3
+ include TestingAdapter
4
+ include SharedAdapterExamples
5
+ undef :test_adapter_count
6
+
7
+ # Can't build accounts via API
8
+ undef :test_build
9
+ undef :test_build_with_attributes
10
+ undef :test_saving_new_record
11
+ undef :test_saving_new_invalid_record
12
+
13
+ let(:adapter) { @client.Account }
14
+ let(:plural_name) { 'accounts' }
15
+ let(:record_class) { Gecko::Record::Account }
16
+
17
+ def test_initializes_adapter
18
+ assert_instance_of(Gecko::Record::AccountAdapter, @client.Account)
19
+ end
20
+
21
+ def test_current
22
+ VCR.use_cassette('accounts#current') do
23
+ assert_instance_of(Gecko::Record::Account, @client.Account.current)
24
+ assert(@client.Account.current, 'Account.current is identity mapped')
25
+ end
26
+ end
27
+
28
+ def test_adapter_all
29
+ VCR.use_cassette(plural_name) do
30
+ collection = adapter.where(limit: 5)
31
+ assert_instance_of(Array, collection)
32
+ assert_equal(1, collection.size)
33
+ assert_instance_of(record_class, collection[0])
34
+ end
35
+ end
36
+
37
+ def test_adapter_uses_identity_map
38
+ VCR.use_cassette(plural_name) do
39
+ collection = adapter.where(limit: 5)
40
+ assert_equal(collection.first, adapter.find(collection.first.id))
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,14 @@
1
+ require 'test_helper'
2
+
3
+ class Gecko::Record::AddressAdapterTest < Minitest::Test
4
+ include TestingAdapter
5
+ include SharedAdapterExamples
6
+
7
+ let(:adapter) { @client.Address }
8
+ let(:plural_name) { 'addresses' }
9
+ let(:record_class) { Gecko::Record::Address }
10
+
11
+ def test_initializes_adapter
12
+ assert_instance_of(Gecko::Record::AddressAdapter, @client.Address)
13
+ end
14
+ end
@@ -0,0 +1,18 @@
1
+ require 'test_helper'
2
+
3
+ class Gecko::AddressTest < Minitest::Test
4
+ include VCRHelper
5
+ include SharedRecordExamples
6
+
7
+ let(:plural_name) { 'addresses' }
8
+ let(:record_class) { Gecko::Record::Address }
9
+
10
+ def setup
11
+ @json = load_vcr_hash('addresses', 'addresses').first
12
+ @record = record_class.new(client, @json)
13
+ end
14
+
15
+ def test_initializes_record
16
+ assert_instance_of(Gecko::Record::Address, @record)
17
+ end
18
+ end
@@ -0,0 +1,14 @@
1
+ require 'test_helper'
2
+
3
+ class Gecko::Record::CompanyAdapterTest < Minitest::Test
4
+ include TestingAdapter
5
+ include SharedAdapterExamples
6
+
7
+ let(:adapter) { @client.Company }
8
+ let(:plural_name) { 'companies' }
9
+ let(:record_class) { Gecko::Record::Company }
10
+
11
+ def test_initializes_adapter
12
+ assert_instance_of(Gecko::Record::CompanyAdapter, @client.Company)
13
+ end
14
+ end
@@ -0,0 +1,18 @@
1
+ require 'test_helper'
2
+
3
+ class Gecko::CompanyTest < Minitest::Test
4
+ include VCRHelper
5
+ include SharedRecordExamples
6
+
7
+ let(:plural_name) { 'companies' }
8
+ let(:record_class) { Gecko::Record::Company }
9
+
10
+ def setup
11
+ @json = load_vcr_hash('companies', 'companies').first
12
+ @record = record_class.new(client, @json)
13
+ end
14
+
15
+ def test_initializes_record
16
+ assert_instance_of(Gecko::Record::Company, @record)
17
+ end
18
+ end
@@ -0,0 +1,14 @@
1
+ require 'test_helper'
2
+
3
+ class Gecko::Record::ContactAdapterTest < Minitest::Test
4
+ include TestingAdapter
5
+ include SharedAdapterExamples
6
+
7
+ let(:adapter) { @client.Contact }
8
+ let(:plural_name) { "contacts" }
9
+ let(:record_class) { Gecko::Record::Contact }
10
+
11
+ def test_initializes_adapter
12
+ assert_instance_of(Gecko::Record::ContactAdapter, @client.Contact)
13
+ end
14
+ end
@@ -0,0 +1,18 @@
1
+ require 'test_helper'
2
+
3
+ class Gecko::ContactTest < Minitest::Test
4
+ include VCRHelper
5
+ include SharedRecordExamples
6
+
7
+ let(:plural_name) { "contacts" }
8
+ let(:record_class) { Gecko::Record::Contact }
9
+
10
+ def setup
11
+ @json = load_vcr_hash("contacts", "contacts").first
12
+ @record = record_class.new(client, @json)
13
+ end
14
+
15
+ def test_initializes_record
16
+ assert_instance_of(Gecko::Record::Contact, @record)
17
+ end
18
+ end
@@ -0,0 +1,14 @@
1
+ require 'test_helper'
2
+
3
+ class Gecko::Record::CurrencyAdapterTest < Minitest::Test
4
+ include TestingAdapter
5
+ include SharedAdapterExamples
6
+
7
+ let(:adapter) { @client.Currency }
8
+ let(:plural_name) { 'currencies' }
9
+ let(:record_class) { Gecko::Record::Currency }
10
+
11
+ def test_initializes_adapter
12
+ assert_instance_of(Gecko::Record::CurrencyAdapter, @client.Currency)
13
+ end
14
+ end
@@ -0,0 +1,18 @@
1
+ require 'test_helper'
2
+
3
+ class Gecko::CurrencyTest < Minitest::Test
4
+ include VCRHelper
5
+ include SharedRecordExamples
6
+
7
+ let(:plural_name) { 'currencies' }
8
+ let(:record_class) { Gecko::Record::Currency }
9
+
10
+ def setup
11
+ @json = load_vcr_hash('currencies', 'currencies').first
12
+ @record = record_class.new(client, @json)
13
+ end
14
+
15
+ def test_initializes_record
16
+ assert_instance_of(Gecko::Record::Currency, @record)
17
+ end
18
+ end
@@ -0,0 +1,24 @@
1
+ require 'test_helper'
2
+
3
+ class Gecko::Record::FulfillmentAdapterTest < Minitest::Test
4
+ include TestingAdapter
5
+ include SharedAdapterExamples
6
+
7
+ let(:adapter) { @client.Fulfillment }
8
+ let(:plural_name) { 'fulfillments' }
9
+ let(:record_class) { Gecko::Record::Fulfillment }
10
+
11
+ def test_initializes_adapter
12
+ assert_instance_of(Gecko::Record::FulfillmentAdapter, @client.Fulfillment)
13
+ end
14
+
15
+ def test_identity_map_stores_sideloaded_line_items
16
+ VCR.use_cassette('fulfillments') do
17
+ collection = @client.Fulfillment.where(limit: 5)
18
+ fulfillment = collection.first
19
+ item = fulfillment.fulfillment_line_items.first
20
+ assert_instance_of(Gecko::Record::FulfillmentLineItem, item)
21
+ assert_equal(fulfillment, item.fulfillment)
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,21 @@
1
+ require 'test_helper'
2
+
3
+ class Gecko::Record::FulfillmentLineItemAdapterTest < Minitest::Test
4
+ include TestingAdapter
5
+
6
+ let(:adapter) { @client.FulfillmentLineItem }
7
+ let(:plural_name) { 'fulfillment_line_items' }
8
+ let(:record_class) { Gecko::Record::FulfillmentLineItem }
9
+
10
+ def test_initializes_adapter
11
+ assert_instance_of(Gecko::Record::FulfillmentLineItemAdapter, @client.FulfillmentLineItem)
12
+ end
13
+
14
+ def test_adapter_uses_identity_map
15
+ VCR.use_cassette('fulfillments') do
16
+ @client.Fulfillment.where(limit: 5)
17
+ collection = adapter.all
18
+ assert_equal(collection.first, adapter.find(collection.first.id))
19
+ end
20
+ end
21
+ end