fortnox-api 0.8.2 → 0.9.1

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.
Files changed (212) hide show
  1. checksums.yaml +4 -4
  2. data/.env.template +7 -0
  3. data/.env.test +11 -3
  4. data/.gitignore +7 -1
  5. data/.rubocop.yml +17 -1
  6. data/.travis.yml +10 -9
  7. data/CHANGELOG.md +27 -6
  8. data/CONTRIBUTE.md +21 -9
  9. data/DEVELOPER_README.md +69 -0
  10. data/Guardfile +13 -4
  11. data/README.md +226 -64
  12. data/Rakefile +128 -0
  13. data/bin/get_tokens +79 -0
  14. data/bin/renew_tokens +28 -0
  15. data/fortnox-api.gemspec +10 -9
  16. data/lib/fortnox/api/mappers/base/from_json.rb +4 -3
  17. data/lib/fortnox/api/mappers/base/to_json.rb +2 -3
  18. data/lib/fortnox/api/models/article.rb +1 -1
  19. data/lib/fortnox/api/models/base.rb +12 -10
  20. data/lib/fortnox/api/models/customer.rb +55 -55
  21. data/lib/fortnox/api/models/label.rb +2 -2
  22. data/lib/fortnox/api/repositories/authentication.rb +61 -0
  23. data/lib/fortnox/api/repositories/base/savers.rb +3 -1
  24. data/lib/fortnox/api/repositories/base.rb +21 -35
  25. data/lib/fortnox/api/repositories.rb +1 -0
  26. data/lib/fortnox/api/request_handling.rb +30 -18
  27. data/lib/fortnox/api/types/document_row.rb +3 -3
  28. data/lib/fortnox/api/types/enums.rb +27 -11
  29. data/lib/fortnox/api/types/model.rb +1 -3
  30. data/lib/fortnox/api/types/sized.rb +2 -2
  31. data/lib/fortnox/api/types.rb +14 -1
  32. data/lib/fortnox/api/version.rb +1 -1
  33. data/lib/fortnox/api.rb +12 -32
  34. data/spec/fortnox/api/mappers/base/canonical_name_sym_spec.rb +4 -4
  35. data/spec/fortnox/api/mappers/base/from_json_spec.rb +10 -12
  36. data/spec/fortnox/api/mappers/base/to_json_spec.rb +48 -57
  37. data/spec/fortnox/api/mappers/base_spec.rb +4 -7
  38. data/spec/fortnox/api/mappers/contexts/json_conversion.rb +38 -33
  39. data/spec/fortnox/api/mappers/unit_spec.rb +3 -4
  40. data/spec/fortnox/api/models/base_spec.rb +27 -16
  41. data/spec/fortnox/api/models/unit_spec.rb +5 -3
  42. data/spec/fortnox/api/repositories/article_spec.rb +46 -9
  43. data/spec/fortnox/api/repositories/authentication_spec.rb +103 -0
  44. data/spec/fortnox/api/repositories/base_spec.rb +106 -319
  45. data/spec/fortnox/api/repositories/customer_spec.rb +37 -7
  46. data/spec/fortnox/api/repositories/examples/all.rb +0 -1
  47. data/spec/fortnox/api/repositories/examples/find.rb +5 -8
  48. data/spec/fortnox/api/repositories/examples/only.rb +4 -13
  49. data/spec/fortnox/api/repositories/examples/save.rb +32 -18
  50. data/spec/fortnox/api/repositories/examples/save_with_nested_model.rb +0 -5
  51. data/spec/fortnox/api/repositories/examples/save_with_specially_named_attribute.rb +1 -4
  52. data/spec/fortnox/api/repositories/examples/search.rb +4 -7
  53. data/spec/fortnox/api/repositories/invoice_spec.rb +117 -15
  54. data/spec/fortnox/api/repositories/order_spec.rb +11 -9
  55. data/spec/fortnox/api/repositories/project_spec.rb +7 -6
  56. data/spec/fortnox/api/repositories/terms_of_payment_spec.rb +9 -7
  57. data/spec/fortnox/api/repositories/unit_spec.rb +13 -11
  58. data/spec/fortnox/api/types/country_spec.rb +1 -1
  59. data/spec/fortnox/api/types/email_spec.rb +2 -2
  60. data/spec/fortnox/api/types/examples/document_row.rb +3 -3
  61. data/spec/fortnox/api/types/examples/enum.rb +4 -4
  62. data/spec/fortnox/api/types/examples/types.rb +1 -3
  63. data/spec/fortnox/api/types/housework_types_spec.rb +54 -61
  64. data/spec/fortnox/api/types/model_spec.rb +3 -7
  65. data/spec/fortnox/api/types/order_row_spec.rb +2 -2
  66. data/spec/fortnox/api/types/required_spec.rb +6 -11
  67. data/spec/fortnox/api/types/sales_account_spec.rb +57 -0
  68. data/spec/fortnox/api_spec.rb +19 -124
  69. data/spec/spec_helper.rb +0 -14
  70. data/spec/support/helpers/configuration_helper.rb +30 -3
  71. data/spec/support/helpers.rb +1 -1
  72. data/spec/support/matchers/type/attribute_matcher.rb +2 -2
  73. data/spec/support/matchers/type/have_nullable_date_matcher.rb +6 -4
  74. data/spec/support/matchers/type/have_nullable_matcher.rb +1 -1
  75. data/spec/support/matchers/type/have_nullable_string_matcher.rb +5 -5
  76. data/spec/support/matchers/type/require_attribute_matcher.rb +5 -5
  77. data/spec/support/matchers/type/type_matcher.rb +1 -1
  78. data/spec/support/vcr_setup.rb +16 -0
  79. data/spec/vcr_cassettes/articles/all.yml +16 -43
  80. data/spec/vcr_cassettes/articles/find_by_hash_failure.yml +10 -12
  81. data/spec/vcr_cassettes/articles/find_failure.yml +10 -12
  82. data/spec/vcr_cassettes/articles/find_id_1.yml +13 -14
  83. data/spec/vcr_cassettes/articles/find_new.yml +14 -16
  84. data/spec/vcr_cassettes/articles/limits/quantity_in_stock_min_value.yml +63 -0
  85. data/spec/vcr_cassettes/articles/limits/quantity_in_stock_rounding_positive_value.yml +63 -0
  86. data/spec/vcr_cassettes/articles/multi_param_find_by_hash.yml +13 -15
  87. data/spec/vcr_cassettes/articles/save_new.yml +13 -15
  88. data/spec/vcr_cassettes/articles/save_old.yml +14 -16
  89. data/spec/vcr_cassettes/articles/save_with_specially_named_attribute.yml +13 -15
  90. data/spec/vcr_cassettes/articles/search_by_name.yml +16 -15
  91. data/spec/vcr_cassettes/articles/search_miss.yml +10 -12
  92. data/spec/vcr_cassettes/articles/search_with_special_char.yml +10 -12
  93. data/spec/vcr_cassettes/articles/single_param_find_by_hash.yml +13 -27
  94. data/spec/vcr_cassettes/authentication/expired_token.yml +54 -0
  95. data/spec/vcr_cassettes/authentication/invalid_authorization.yml +57 -0
  96. data/spec/vcr_cassettes/authentication/invalid_refresh_token.yml +58 -0
  97. data/spec/vcr_cassettes/authentication/valid_request.yml +63 -0
  98. data/spec/vcr_cassettes/customers/all.yml +20 -127
  99. data/spec/vcr_cassettes/customers/find_by_hash_failure.yml +10 -12
  100. data/spec/vcr_cassettes/customers/find_failure.yml +10 -12
  101. data/spec/vcr_cassettes/customers/find_id_1.yml +14 -15
  102. data/spec/vcr_cassettes/customers/find_new.yml +13 -15
  103. data/spec/vcr_cassettes/customers/find_with_sales_account.yml +63 -0
  104. data/spec/vcr_cassettes/customers/multi_param_find_by_hash.yml +13 -15
  105. data/spec/vcr_cassettes/customers/save_new.yml +12 -14
  106. data/spec/vcr_cassettes/customers/save_new_with_country_code_SE.yml +12 -14
  107. data/spec/vcr_cassettes/customers/save_new_with_sales_account.yml +63 -0
  108. data/spec/vcr_cassettes/customers/save_old.yml +13 -15
  109. data/spec/vcr_cassettes/customers/save_with_specially_named_attribute.yml +12 -14
  110. data/spec/vcr_cassettes/customers/search_by_name.yml +13 -45
  111. data/spec/vcr_cassettes/customers/search_miss.yml +10 -12
  112. data/spec/vcr_cassettes/customers/search_with_special_char.yml +10 -12
  113. data/spec/vcr_cassettes/customers/single_param_find_by_hash.yml +14 -16
  114. data/spec/vcr_cassettes/invoices/all.yml +47 -112
  115. data/spec/vcr_cassettes/invoices/filter_hit.yml +14 -18
  116. data/spec/vcr_cassettes/invoices/filter_invalid.yml +10 -12
  117. data/spec/vcr_cassettes/invoices/find_by_hash_failure.yml +10 -12
  118. data/spec/vcr_cassettes/invoices/find_failure.yml +10 -12
  119. data/spec/vcr_cassettes/invoices/find_id_1.yml +15 -16
  120. data/spec/vcr_cassettes/invoices/find_new.yml +16 -18
  121. data/spec/vcr_cassettes/invoices/multi_param_find_by_hash.yml +13 -15
  122. data/spec/vcr_cassettes/invoices/row_delivered_quantity_decimals.yml +65 -0
  123. data/spec/vcr_cassettes/invoices/row_delivered_quantity_decimals_round_up.yml +65 -0
  124. data/spec/vcr_cassettes/invoices/row_description_limit.yml +65 -0
  125. data/spec/vcr_cassettes/invoices/row_price_limit.yml +65 -0
  126. data/spec/vcr_cassettes/invoices/row_price_limit_round_up.yml +65 -0
  127. data/spec/vcr_cassettes/invoices/save_new.yml +14 -16
  128. data/spec/vcr_cassettes/invoices/save_new_with_comments.yml +14 -16
  129. data/spec/vcr_cassettes/invoices/save_new_with_country.yml +14 -15
  130. data/spec/vcr_cassettes/invoices/save_new_with_country_GB.yml +15 -16
  131. data/spec/vcr_cassettes/invoices/save_new_with_country_Norge.yml +14 -15
  132. data/spec/vcr_cassettes/invoices/save_new_with_country_Norway.yml +14 -15
  133. data/spec/vcr_cassettes/invoices/save_new_with_country_Sverige.yml +14 -15
  134. data/spec/vcr_cassettes/invoices/save_new_with_country_VA.yml +15 -16
  135. data/spec/vcr_cassettes/invoices/save_new_with_country_VI.yml +15 -16
  136. data/spec/vcr_cassettes/invoices/save_new_with_country_empty_string.yml +14 -15
  137. data/spec/vcr_cassettes/invoices/save_new_with_country_nil.yml +14 -15
  138. data/spec/vcr_cassettes/invoices/save_new_with_unsaved_parent.yml +65 -0
  139. data/spec/vcr_cassettes/invoices/save_old.yml +16 -18
  140. data/spec/vcr_cassettes/invoices/save_old_with_empty_comments.yml +16 -18
  141. data/spec/vcr_cassettes/invoices/save_old_with_empty_country.yml +16 -17
  142. data/spec/vcr_cassettes/invoices/save_old_with_nil_comments.yml +16 -18
  143. data/spec/vcr_cassettes/invoices/save_old_with_nil_country.yml +16 -17
  144. data/spec/vcr_cassettes/invoices/save_with_nested_model.yml +15 -16
  145. data/spec/vcr_cassettes/invoices/save_with_specially_named_attribute.yml +14 -15
  146. data/spec/vcr_cassettes/invoices/search_by_name.yml +13 -21
  147. data/spec/vcr_cassettes/invoices/search_miss.yml +10 -12
  148. data/spec/vcr_cassettes/invoices/search_with_special_char.yml +10 -12
  149. data/spec/vcr_cassettes/invoices/single_param_find_by_hash.yml +14 -16
  150. data/spec/vcr_cassettes/orders/all.yml +19 -113
  151. data/spec/vcr_cassettes/orders/filter_hit.yml +14 -20
  152. data/spec/vcr_cassettes/orders/filter_invalid.yml +10 -12
  153. data/spec/vcr_cassettes/orders/find_by_hash_failure.yml +10 -12
  154. data/spec/vcr_cassettes/orders/find_failure.yml +10 -12
  155. data/spec/vcr_cassettes/orders/find_id_1.yml +17 -17
  156. data/spec/vcr_cassettes/orders/find_new.yml +16 -18
  157. data/spec/vcr_cassettes/orders/housework_invalid_tax_reduction_type.yml +11 -13
  158. data/spec/vcr_cassettes/orders/housework_othercoses_invalid.yml +11 -13
  159. data/spec/vcr_cassettes/orders/housework_type_babysitting.yml +15 -16
  160. data/spec/vcr_cassettes/orders/housework_type_cleaning.yml +15 -16
  161. data/spec/vcr_cassettes/orders/housework_type_construction.yml +15 -16
  162. data/spec/vcr_cassettes/orders/housework_type_cooking.yml +11 -13
  163. data/spec/vcr_cassettes/orders/housework_type_electricity.yml +15 -16
  164. data/spec/vcr_cassettes/orders/housework_type_gardening.yml +15 -16
  165. data/spec/vcr_cassettes/orders/housework_type_glassmetalwork.yml +15 -16
  166. data/spec/vcr_cassettes/orders/housework_type_grounddrainagework.yml +15 -16
  167. data/spec/vcr_cassettes/orders/housework_type_hvac.yml +15 -16
  168. data/spec/vcr_cassettes/orders/housework_type_itservices.yml +15 -16
  169. data/spec/vcr_cassettes/orders/housework_type_majorappliancerepair.yml +15 -16
  170. data/spec/vcr_cassettes/orders/housework_type_masonry.yml +15 -16
  171. data/spec/vcr_cassettes/orders/housework_type_movingservices.yml +15 -16
  172. data/spec/vcr_cassettes/orders/housework_type_othercare.yml +15 -16
  173. data/spec/vcr_cassettes/orders/housework_type_othercosts.yml +15 -16
  174. data/spec/vcr_cassettes/orders/housework_type_paintingwallpapering.yml +15 -16
  175. data/spec/vcr_cassettes/orders/housework_type_snowplowing.yml +15 -16
  176. data/spec/vcr_cassettes/orders/housework_type_textileclothing.yml +15 -16
  177. data/spec/vcr_cassettes/orders/housework_type_tutoring.yml +11 -13
  178. data/spec/vcr_cassettes/orders/multi_param_find_by_hash.yml +13 -15
  179. data/spec/vcr_cassettes/orders/save_new.yml +16 -18
  180. data/spec/vcr_cassettes/orders/save_old.yml +16 -18
  181. data/spec/vcr_cassettes/orders/save_with_nested_model.yml +15 -16
  182. data/spec/vcr_cassettes/orders/search_by_name.yml +13 -17
  183. data/spec/vcr_cassettes/orders/search_miss.yml +10 -12
  184. data/spec/vcr_cassettes/orders/search_with_special_char.yml +10 -12
  185. data/spec/vcr_cassettes/orders/single_param_find_by_hash.yml +14 -16
  186. data/spec/vcr_cassettes/projects/all.yml +14 -37
  187. data/spec/vcr_cassettes/projects/find_by_hash_failure.yml +10 -12
  188. data/spec/vcr_cassettes/projects/find_failure.yml +10 -12
  189. data/spec/vcr_cassettes/projects/find_id_1.yml +13 -15
  190. data/spec/vcr_cassettes/projects/find_new.yml +14 -16
  191. data/spec/vcr_cassettes/projects/multi_param_find_by_hash.yml +15 -16
  192. data/spec/vcr_cassettes/projects/save_new.yml +13 -15
  193. data/spec/vcr_cassettes/projects/save_old.yml +14 -16
  194. data/spec/vcr_cassettes/projects/single_param_find_by_hash.yml +12 -14
  195. data/spec/vcr_cassettes/termsofpayments/all.yml +16 -23
  196. data/spec/vcr_cassettes/termsofpayments/find_failure.yml +10 -12
  197. data/spec/vcr_cassettes/termsofpayments/find_id_1.yml +13 -16
  198. data/spec/vcr_cassettes/termsofpayments/find_new.yml +12 -14
  199. data/spec/vcr_cassettes/termsofpayments/save_new.yml +12 -14
  200. data/spec/vcr_cassettes/termsofpayments/save_old.yml +12 -14
  201. data/spec/vcr_cassettes/units/all.yml +13 -24
  202. data/spec/vcr_cassettes/units/find_failure.yml +10 -12
  203. data/spec/vcr_cassettes/units/find_id_1.yml +13 -15
  204. data/spec/vcr_cassettes/units/find_new.yml +12 -14
  205. data/spec/vcr_cassettes/units/save_new.yml +12 -14
  206. data/spec/vcr_cassettes/units/save_old.yml +12 -14
  207. data/spec/vcr_cassettes/units/save_with_specially_named_attribute.yml +12 -14
  208. metadata +45 -230
  209. data/lib/fortnox/api/circular_queue.rb +0 -39
  210. data/spec/fortnox/api/circular_queue_spec.rb +0 -52
  211. data/spec/support/helpers/when_performing_helper.rb +0 -7
  212. data/temp.txt +0 -1
@@ -1,39 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'forwardable'
4
-
5
- # rubocop:disable Style/ClassVars
6
-
7
- module Fortnox
8
- module API
9
- class CircularQueue
10
- extend Forwardable
11
-
12
- def initialize(*items)
13
- @queue = [*items]
14
- @@next_index = random_start_index
15
- end
16
-
17
- # support some general Array methods that fit Queues well
18
- def_delegators :@queue, :new, :[], :size
19
-
20
- def next
21
- value = @queue[@@next_index]
22
- if @@next_index == size - 1
23
- @@next_index = 0
24
- else
25
- @@next_index += 1
26
- end
27
- value
28
- end
29
-
30
- private
31
-
32
- def random_start_index
33
- Random.rand(@queue.size)
34
- end
35
- end
36
- end
37
- end
38
-
39
- # rubocop:enable Style/ClassVars
@@ -1,52 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'spec_helper'
4
- require 'fortnox/api/circular_queue'
5
-
6
- describe Fortnox::API::CircularQueue do
7
- describe 'start index' do
8
- context 'when running several times' do
9
- subject { Set.new(samples).size }
10
-
11
- let(:test_array) { (0..99).to_a }
12
- let(:samples) { Array.new(100) { described_class.new(*test_array).next } }
13
-
14
- # NOTE: This test is not perfect. We are testing that a random generator
15
- # with 100 items to choose from does not choose the same item 100 times in a row.
16
- # Yes, the possibility is low, but I thought I should just mention it :)
17
- it 'does not start with the same item each time' do
18
- is_expected.to be > 1
19
- end
20
- end
21
- end
22
-
23
- describe '#next' do
24
- context 'when several items in queue' do
25
- let(:queue) { described_class.new(1, 2, 3) }
26
- let(:first_round) { Array.new(3) { queue.next } }
27
- let(:second_round) { Array.new(3) { queue.next } }
28
-
29
- it 'circulates the items' do
30
- first_round
31
- expect(first_round[0]).to eq(queue.next)
32
- end
33
-
34
- it 'circulates the items in the same order each time' do
35
- expect(first_round).to eq(second_round)
36
- end
37
-
38
- it 'circulates through given input' do
39
- expect(first_round.sort).to eq([1, 2, 3])
40
- end
41
- end
42
-
43
- context 'when only one item in queue' do
44
- let(:queue) { described_class.new(1) }
45
-
46
- it 'circulates the item' do
47
- first_item = queue.next
48
- expect(first_item).to eq(queue.next)
49
- end
50
- end
51
- end
52
- end
@@ -1,7 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Helpers
4
- def when_performing(&block)
5
- block.to_proc
6
- end
7
- end
data/temp.txt DELETED
@@ -1 +0,0 @@
1
- temp2