fortnox-api 0.7.2 → 0.9.0

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 (255) hide show
  1. checksums.yaml +4 -4
  2. data/.codeclimate.yml +1 -0
  3. data/.env.template +7 -0
  4. data/.env.test +11 -3
  5. data/.gitignore +7 -1
  6. data/.rubocop.yml +18 -2
  7. data/.tool-versions +1 -0
  8. data/.travis.yml +15 -19
  9. data/CHANGELOG.md +66 -1
  10. data/CONTRIBUTE.md +21 -9
  11. data/DEVELOPER_README.md +72 -0
  12. data/Guardfile +13 -4
  13. data/README.md +226 -61
  14. data/Rakefile +133 -0
  15. data/bin/get_tokens +79 -0
  16. data/bin/renew_tokens +28 -0
  17. data/fortnox-api.gemspec +31 -25
  18. data/lib/fortnox/api/mappers/article.rb +1 -1
  19. data/lib/fortnox/api/mappers/base/from_json.rb +7 -6
  20. data/lib/fortnox/api/mappers/base/to_json.rb +4 -5
  21. data/lib/fortnox/api/mappers/base.rb +3 -3
  22. data/lib/fortnox/api/mappers/customer.rb +1 -1
  23. data/lib/fortnox/api/mappers/default_delivery_types.rb +1 -1
  24. data/lib/fortnox/api/mappers/default_templates.rb +1 -1
  25. data/lib/fortnox/api/mappers/edi_information.rb +1 -1
  26. data/lib/fortnox/api/mappers/email_information.rb +1 -1
  27. data/lib/fortnox/api/mappers/invoice.rb +4 -4
  28. data/lib/fortnox/api/mappers/invoice_row.rb +1 -1
  29. data/lib/fortnox/api/mappers/order.rb +4 -4
  30. data/lib/fortnox/api/mappers/order_row.rb +1 -1
  31. data/lib/fortnox/api/mappers/project.rb +1 -1
  32. data/lib/fortnox/api/mappers/terms_of_payment.rb +1 -1
  33. data/lib/fortnox/api/mappers/unit.rb +1 -1
  34. data/lib/fortnox/api/mappers/value/country_string.rb +1 -1
  35. data/lib/fortnox/api/mappers.rb +18 -18
  36. data/lib/fortnox/api/models/article.rb +2 -2
  37. data/lib/fortnox/api/models/base.rb +23 -21
  38. data/lib/fortnox/api/models/customer.rb +57 -57
  39. data/lib/fortnox/api/models/document.rb +5 -2
  40. data/lib/fortnox/api/models/invoice.rb +2 -2
  41. data/lib/fortnox/api/models/label.rb +3 -3
  42. data/lib/fortnox/api/models/order.rb +2 -2
  43. data/lib/fortnox/api/models/project.rb +2 -2
  44. data/lib/fortnox/api/models/terms_of_payment.rb +2 -2
  45. data/lib/fortnox/api/models/unit.rb +2 -2
  46. data/lib/fortnox/api/models.rb +7 -7
  47. data/lib/fortnox/api/repositories/article.rb +3 -3
  48. data/lib/fortnox/api/repositories/authentication.rb +61 -0
  49. data/lib/fortnox/api/repositories/base/savers.rb +3 -1
  50. data/lib/fortnox/api/repositories/base.rb +25 -38
  51. data/lib/fortnox/api/repositories/customer.rb +3 -3
  52. data/lib/fortnox/api/repositories/invoice.rb +3 -3
  53. data/lib/fortnox/api/repositories/order.rb +3 -3
  54. data/lib/fortnox/api/repositories/project.rb +3 -3
  55. data/lib/fortnox/api/repositories/terms_of_payment.rb +3 -3
  56. data/lib/fortnox/api/repositories/unit.rb +3 -3
  57. data/lib/fortnox/api/repositories.rb +8 -7
  58. data/lib/fortnox/api/request_handling.rb +30 -18
  59. data/lib/fortnox/api/types/default_delivery_types.rb +0 -2
  60. data/lib/fortnox/api/types/default_templates.rb +0 -2
  61. data/lib/fortnox/api/types/document_row.rb +3 -3
  62. data/lib/fortnox/api/types/edi_information.rb +0 -2
  63. data/lib/fortnox/api/types/email_information.rb +0 -2
  64. data/lib/fortnox/api/types/enums.rb +54 -10
  65. data/lib/fortnox/api/types/invoice_row.rb +1 -1
  66. data/lib/fortnox/api/types/model.rb +5 -9
  67. data/lib/fortnox/api/types/nullable.rb +13 -9
  68. data/lib/fortnox/api/types/order_row.rb +1 -1
  69. data/lib/fortnox/api/types/required.rb +3 -3
  70. data/lib/fortnox/api/types/sized.rb +4 -4
  71. data/lib/fortnox/api/types.rb +37 -24
  72. data/lib/fortnox/api/version.rb +1 -1
  73. data/lib/fortnox/api.rb +21 -39
  74. data/spec/fortnox/api/mappers/base/canonical_name_sym_spec.rb +13 -11
  75. data/spec/fortnox/api/mappers/base/from_json_spec.rb +10 -12
  76. data/spec/fortnox/api/mappers/base/to_json_spec.rb +48 -57
  77. data/spec/fortnox/api/mappers/base_spec.rb +4 -7
  78. data/spec/fortnox/api/mappers/contexts/json_conversion.rb +38 -33
  79. data/spec/fortnox/api/mappers/default_delivery_types_spec.rb +1 -1
  80. data/spec/fortnox/api/mappers/examples/mapper.rb +1 -1
  81. data/spec/fortnox/api/mappers/unit_spec.rb +3 -4
  82. data/spec/fortnox/api/models/base_spec.rb +33 -22
  83. data/spec/fortnox/api/models/unit_spec.rb +5 -3
  84. data/spec/fortnox/api/repositories/article_spec.rb +14 -9
  85. data/spec/fortnox/api/repositories/authentication_spec.rb +103 -0
  86. data/spec/fortnox/api/repositories/base_spec.rb +105 -326
  87. data/spec/fortnox/api/repositories/customer_spec.rb +37 -7
  88. data/spec/fortnox/api/repositories/examples/all.rb +0 -1
  89. data/spec/fortnox/api/repositories/examples/find.rb +5 -8
  90. data/spec/fortnox/api/repositories/examples/only.rb +4 -13
  91. data/spec/fortnox/api/repositories/examples/save.rb +32 -18
  92. data/spec/fortnox/api/repositories/examples/save_with_nested_model.rb +0 -5
  93. data/spec/fortnox/api/repositories/examples/save_with_specially_named_attribute.rb +1 -4
  94. data/spec/fortnox/api/repositories/examples/search.rb +4 -7
  95. data/spec/fortnox/api/repositories/invoice_spec.rb +72 -29
  96. data/spec/fortnox/api/repositories/order_spec.rb +11 -9
  97. data/spec/fortnox/api/repositories/project_spec.rb +7 -6
  98. data/spec/fortnox/api/repositories/terms_of_payment_spec.rb +9 -7
  99. data/spec/fortnox/api/repositories/unit_spec.rb +13 -11
  100. data/spec/fortnox/api/types/country_spec.rb +1 -1
  101. data/spec/fortnox/api/types/email_spec.rb +2 -2
  102. data/spec/fortnox/api/types/enums_spec.rb +1 -0
  103. data/spec/fortnox/api/types/examples/document_row.rb +3 -3
  104. data/spec/fortnox/api/types/examples/enum.rb +4 -4
  105. data/spec/fortnox/api/types/examples/types.rb +1 -3
  106. data/spec/fortnox/api/types/housework_types_spec.rb +124 -43
  107. data/spec/fortnox/api/types/model_spec.rb +13 -23
  108. data/spec/fortnox/api/types/nullable_spec.rb +30 -10
  109. data/spec/fortnox/api/types/order_row_spec.rb +2 -2
  110. data/spec/fortnox/api/types/required_spec.rb +7 -15
  111. data/spec/fortnox/api/types/sales_account_spec.rb +57 -0
  112. data/spec/fortnox/api_spec.rb +19 -124
  113. data/spec/spec_helper.rb +0 -14
  114. data/spec/support/helpers/configuration_helper.rb +30 -3
  115. data/spec/support/helpers.rb +1 -1
  116. data/spec/support/matchers/type/attribute_matcher.rb +2 -2
  117. data/spec/support/matchers/type/enum_matcher.rb +1 -1
  118. data/spec/support/matchers/type/have_account_number_matcher.rb +1 -1
  119. data/spec/support/matchers/type/have_email_matcher.rb +1 -1
  120. data/spec/support/matchers/type/have_nullable_date_matcher.rb +7 -5
  121. data/spec/support/matchers/type/have_nullable_matcher.rb +1 -1
  122. data/spec/support/matchers/type/have_nullable_string_matcher.rb +5 -5
  123. data/spec/support/matchers/type/require_attribute_matcher.rb +5 -5
  124. data/spec/support/matchers/type/type_matcher.rb +1 -1
  125. data/spec/support/vcr_setup.rb +16 -0
  126. data/spec/vcr_cassettes/articles/all.yml +41 -42
  127. data/spec/vcr_cassettes/articles/find_by_hash_failure.yml +36 -19
  128. data/spec/vcr_cassettes/articles/find_failure.yml +36 -19
  129. data/spec/vcr_cassettes/articles/find_id_1.yml +38 -20
  130. data/spec/vcr_cassettes/articles/find_new.yml +39 -22
  131. data/spec/vcr_cassettes/articles/multi_param_find_by_hash.yml +38 -21
  132. data/spec/vcr_cassettes/articles/save_new.yml +37 -19
  133. data/spec/vcr_cassettes/articles/save_old.yml +39 -22
  134. data/spec/vcr_cassettes/articles/save_with_specially_named_attribute.yml +37 -19
  135. data/spec/vcr_cassettes/articles/search_by_name.yml +41 -21
  136. data/spec/vcr_cassettes/articles/search_miss.yml +36 -19
  137. data/spec/vcr_cassettes/articles/search_with_special_char.yml +36 -19
  138. data/spec/vcr_cassettes/articles/single_param_find_by_hash.yml +38 -32
  139. data/spec/vcr_cassettes/authentication/expired_token.yml +54 -0
  140. data/spec/vcr_cassettes/authentication/invalid_authorization.yml +57 -0
  141. data/spec/vcr_cassettes/authentication/invalid_refresh_token.yml +58 -0
  142. data/spec/vcr_cassettes/authentication/valid_request.yml +63 -0
  143. data/spec/vcr_cassettes/customers/all.yml +44 -132
  144. data/spec/vcr_cassettes/customers/find_by_hash_failure.yml +36 -19
  145. data/spec/vcr_cassettes/customers/find_failure.yml +36 -19
  146. data/spec/vcr_cassettes/customers/find_id_1.yml +39 -21
  147. data/spec/vcr_cassettes/customers/find_new.yml +38 -21
  148. data/spec/vcr_cassettes/customers/find_with_sales_account.yml +63 -0
  149. data/spec/vcr_cassettes/customers/multi_param_find_by_hash.yml +38 -21
  150. data/spec/vcr_cassettes/customers/save_new.yml +36 -18
  151. data/spec/vcr_cassettes/customers/save_new_with_country_code_SE.yml +32 -24
  152. data/spec/vcr_cassettes/customers/save_new_with_sales_account.yml +63 -0
  153. data/spec/vcr_cassettes/customers/save_old.yml +38 -21
  154. data/spec/vcr_cassettes/customers/save_with_specially_named_attribute.yml +36 -18
  155. data/spec/vcr_cassettes/customers/search_by_name.yml +38 -48
  156. data/spec/vcr_cassettes/customers/search_miss.yml +36 -19
  157. data/spec/vcr_cassettes/customers/search_with_special_char.yml +36 -19
  158. data/spec/vcr_cassettes/customers/single_param_find_by_hash.yml +39 -22
  159. data/spec/vcr_cassettes/invoices/all.yml +71 -114
  160. data/spec/vcr_cassettes/invoices/filter_hit.yml +39 -24
  161. data/spec/vcr_cassettes/invoices/filter_invalid.yml +35 -17
  162. data/spec/vcr_cassettes/invoices/find_by_hash_failure.yml +36 -19
  163. data/spec/vcr_cassettes/invoices/find_failure.yml +36 -19
  164. data/spec/vcr_cassettes/invoices/find_id_1.yml +40 -22
  165. data/spec/vcr_cassettes/invoices/find_new.yml +41 -24
  166. data/spec/vcr_cassettes/invoices/multi_param_find_by_hash.yml +38 -21
  167. data/spec/vcr_cassettes/invoices/row_description_limit.yml +65 -0
  168. data/spec/vcr_cassettes/invoices/save_new.yml +39 -21
  169. data/spec/vcr_cassettes/invoices/save_new_with_comments.yml +39 -21
  170. data/spec/vcr_cassettes/invoices/save_new_with_country.yml +35 -26
  171. data/spec/vcr_cassettes/invoices/save_new_with_country_GB.yml +36 -27
  172. data/spec/vcr_cassettes/invoices/save_new_with_country_Norge.yml +35 -26
  173. data/spec/vcr_cassettes/invoices/save_new_with_country_Norway.yml +35 -26
  174. data/spec/vcr_cassettes/invoices/save_new_with_country_Sverige.yml +35 -26
  175. data/spec/vcr_cassettes/invoices/save_new_with_country_VA.yml +36 -27
  176. data/spec/vcr_cassettes/invoices/save_new_with_country_VI.yml +36 -27
  177. data/spec/vcr_cassettes/invoices/save_new_with_country_empty_string.yml +35 -26
  178. data/spec/vcr_cassettes/invoices/save_new_with_country_nil.yml +35 -26
  179. data/spec/vcr_cassettes/invoices/save_new_with_unsaved_parent.yml +65 -0
  180. data/spec/vcr_cassettes/invoices/save_old.yml +41 -24
  181. data/spec/vcr_cassettes/invoices/save_old_with_empty_comments.yml +41 -24
  182. data/spec/vcr_cassettes/invoices/save_old_with_empty_country.yml +37 -29
  183. data/spec/vcr_cassettes/invoices/save_old_with_nil_comments.yml +41 -24
  184. data/spec/vcr_cassettes/invoices/save_old_with_nil_country.yml +37 -29
  185. data/spec/vcr_cassettes/invoices/save_with_nested_model.yml +40 -21
  186. data/spec/vcr_cassettes/invoices/save_with_specially_named_attribute.yml +39 -20
  187. data/spec/vcr_cassettes/invoices/search_by_name.yml +38 -27
  188. data/spec/vcr_cassettes/invoices/search_miss.yml +36 -19
  189. data/spec/vcr_cassettes/invoices/search_with_special_char.yml +36 -19
  190. data/spec/vcr_cassettes/invoices/single_param_find_by_hash.yml +39 -22
  191. data/spec/vcr_cassettes/orders/all.yml +44 -119
  192. data/spec/vcr_cassettes/orders/filter_hit.yml +39 -26
  193. data/spec/vcr_cassettes/orders/filter_invalid.yml +35 -17
  194. data/spec/vcr_cassettes/orders/find_by_hash_failure.yml +36 -19
  195. data/spec/vcr_cassettes/orders/find_failure.yml +36 -19
  196. data/spec/vcr_cassettes/orders/find_id_1.yml +42 -23
  197. data/spec/vcr_cassettes/orders/find_new.yml +41 -24
  198. data/spec/vcr_cassettes/orders/housework_invalid_tax_reduction_type.yml +61 -0
  199. data/spec/vcr_cassettes/orders/housework_othercoses_invalid.yml +61 -0
  200. data/spec/vcr_cassettes/orders/housework_type_babysitting.yml +40 -21
  201. data/spec/vcr_cassettes/orders/housework_type_cleaning.yml +40 -21
  202. data/spec/vcr_cassettes/orders/housework_type_construction.yml +40 -21
  203. data/spec/vcr_cassettes/orders/housework_type_cooking.yml +36 -18
  204. data/spec/vcr_cassettes/orders/housework_type_electricity.yml +40 -21
  205. data/spec/vcr_cassettes/orders/housework_type_gardening.yml +40 -21
  206. data/spec/vcr_cassettes/orders/housework_type_glassmetalwork.yml +40 -21
  207. data/spec/vcr_cassettes/orders/housework_type_grounddrainagework.yml +40 -21
  208. data/spec/vcr_cassettes/orders/housework_type_hvac.yml +40 -21
  209. data/spec/vcr_cassettes/orders/housework_type_itservices.yml +65 -0
  210. data/spec/vcr_cassettes/orders/housework_type_majorappliancerepair.yml +65 -0
  211. data/spec/vcr_cassettes/orders/housework_type_masonry.yml +40 -21
  212. data/spec/vcr_cassettes/orders/housework_type_movingservices.yml +65 -0
  213. data/spec/vcr_cassettes/orders/housework_type_othercare.yml +40 -21
  214. data/spec/vcr_cassettes/orders/housework_type_othercosts.yml +40 -21
  215. data/spec/vcr_cassettes/orders/housework_type_paintingwallpapering.yml +40 -21
  216. data/spec/vcr_cassettes/orders/housework_type_snowplowing.yml +40 -21
  217. data/spec/vcr_cassettes/orders/housework_type_textileclothing.yml +40 -21
  218. data/spec/vcr_cassettes/orders/housework_type_tutoring.yml +36 -18
  219. data/spec/vcr_cassettes/orders/multi_param_find_by_hash.yml +38 -21
  220. data/spec/vcr_cassettes/orders/save_new.yml +40 -22
  221. data/spec/vcr_cassettes/orders/save_old.yml +41 -24
  222. data/spec/vcr_cassettes/orders/save_with_nested_model.yml +40 -21
  223. data/spec/vcr_cassettes/orders/search_by_name.yml +38 -23
  224. data/spec/vcr_cassettes/orders/search_miss.yml +36 -19
  225. data/spec/vcr_cassettes/orders/search_with_special_char.yml +36 -19
  226. data/spec/vcr_cassettes/orders/single_param_find_by_hash.yml +39 -22
  227. data/spec/vcr_cassettes/projects/all.yml +39 -37
  228. data/spec/vcr_cassettes/projects/find_by_hash_failure.yml +36 -19
  229. data/spec/vcr_cassettes/projects/find_failure.yml +36 -19
  230. data/spec/vcr_cassettes/projects/find_id_1.yml +38 -21
  231. data/spec/vcr_cassettes/projects/find_new.yml +39 -22
  232. data/spec/vcr_cassettes/projects/multi_param_find_by_hash.yml +40 -22
  233. data/spec/vcr_cassettes/projects/save_new.yml +37 -19
  234. data/spec/vcr_cassettes/projects/save_old.yml +39 -22
  235. data/spec/vcr_cassettes/projects/single_param_find_by_hash.yml +38 -21
  236. data/spec/vcr_cassettes/termsofpayments/all.yml +43 -29
  237. data/spec/vcr_cassettes/termsofpayments/find_failure.yml +36 -19
  238. data/spec/vcr_cassettes/termsofpayments/find_id_1.yml +38 -22
  239. data/spec/vcr_cassettes/termsofpayments/find_new.yml +38 -21
  240. data/spec/vcr_cassettes/termsofpayments/save_new.yml +37 -19
  241. data/spec/vcr_cassettes/termsofpayments/save_old.yml +38 -21
  242. data/spec/vcr_cassettes/units/all.yml +38 -26
  243. data/spec/vcr_cassettes/units/find_failure.yml +36 -19
  244. data/spec/vcr_cassettes/units/find_id_1.yml +38 -21
  245. data/spec/vcr_cassettes/units/find_new.yml +38 -21
  246. data/spec/vcr_cassettes/units/save_new.yml +37 -19
  247. data/spec/vcr_cassettes/units/save_old.yml +38 -21
  248. data/spec/vcr_cassettes/units/save_with_specially_named_attribute.yml +37 -19
  249. metadata +133 -252
  250. data/lib/fortnox/api/circular_queue.rb +0 -39
  251. data/spec/fortnox/api/circular_queue_spec.rb +0 -52
  252. data/spec/support/helpers/dummy_class_helper.rb +0 -38
  253. data/spec/support/helpers/when_performing_helper.rb +0 -7
  254. data/spec/vcr_cassettes/invoices/save_new_with_country_KR.yml +0 -57
  255. data/temp.txt +0 -1
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 707b9b050edd8499029c1f2120d11edc923e868847657eb0c108789014a5e3c8
4
- data.tar.gz: 7da764b991529e720f3afbbb01433da52ca4f34800951b05c4f0f1e11f646c6a
3
+ metadata.gz: 843c49685ec54b6f9e9adb7f5a16a67dc827f0d7b5e58b3d8bd8bd9fccced0db
4
+ data.tar.gz: 306a7d66d0b820cc8250b887d14362a7117e8aebbffae5449ba277f30013a06d
5
5
  SHA512:
6
- metadata.gz: 075e852a210ad2313fcf1c4469cb54a857016d46963e353679f16ea9e5daf09b28857491d9ccdc9b20c2a6843d7bc79093122db5419cf4219f1d830665af27b4
7
- data.tar.gz: 35f8989ec19be2bf69c4f703daf54feb8b7d09e4c6bec95455c3483b23e4f8aa74547f781f2874c39d8903761feb769474bba0795ac2b3a21142a27b4ca706dc
6
+ metadata.gz: 1da53b39993c540c59290b111cf30b7ed99b84da62606462671fe178a342dd136f0e64ad552646c2f66d3091088b5a1961c77f9bf18a16e655e9fdfff360bc8f
7
+ data.tar.gz: 293879cf697a4c9fde27fa6fa8e89d2f59d082bd983a00ee5c8b345bc5864a231c61dc4bb256e424d3c721706dd01f851c88ef886b7d8b611e34481a2558ccfe
data/.codeclimate.yml CHANGED
@@ -12,6 +12,7 @@ engines:
12
12
  enabled: false
13
13
  rubocop:
14
14
  enabled: true
15
+ channel: rubocop-1-39-0
15
16
  ratings:
16
17
  paths:
17
18
  - "**.rb"
data/.env.template ADDED
@@ -0,0 +1,7 @@
1
+ FORTNOX_API_REDIRECT_URI=https://example.com
2
+ FORTNOX_API_CLIENT_SECRET=
3
+ FORTNOX_API_SCOPES=article invoice settings customer order project
4
+ FORTNOX_API_CLIENT_ID=
5
+ FORTNOX_API_REFRESH_TOKEN=
6
+ FORTNOX_API_ACCESS_TOKEN=
7
+
data/.env.test CHANGED
@@ -1,3 +1,11 @@
1
- FORTNOX_API_BASE_URL=https://api.fortnox.se/3/
2
- FORTNOX_API_CLIENT_SECRET=9aBA8ZgsvR
3
- FORTNOX_API_ACCESS_TOKEN=ccaef817-d5d8-4b1c-a316-54f3e55c5c54
1
+ DEBUG=false
2
+
3
+ EXPIRED_ACCESS_TOKEN=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VySWQiOjIsInRlbmFudElkIjoxMzY4MjY3LCJjbGllbnRJZCI6ImR2UEE0Mnk0ME9XSiIsInJpZ2h0c0FzSnNvbiI6Ikg0c0lBQUFBQUFBQUE0MVgzVzdyTmd4K2wxNnZlWWVzUlE4SzdPd1VTSWZoWUJnQzJtSWN6WkpvU0hMYTdPbEhXWkl0MlUyd080dWt5SVwvXC84bDhQRmp2cHZMM3VHakQ5dm0xcE5ONDlcL1BMUWlKMDcwd2NvMVNxSk13MWFMeVwvZ3NTWUtMVTNRTWpPZ2JkRUZMblFXVVRObEYwaURcLzhPaDNXZGF1SDNhbmFRQjAwcFFQeEhzQWIyWHBuT1JkYUd4UGFPTmg5WWk2M2ZTWEVpMnlPcnNDS3BrZ2ZKb016OHlCcmdHUTI3c09uUmVrb2xrQVZKZFBmU0xwUThyUGI1SWhlOTB1RHFQK29XVVlHMUpQd05FVmF0TzJCeURicytnUTl5U2NsUVZiaWNSUHdleWlUMmdQWkhWRmY3SmV1MzZLV0N4WU53SlYwR1ozS3dzTkVSOURTNEdKQWxWcGhaMFVrT1h4QjFjc0ZZQW96K1RsZjlpME4wakRsK0JyMjhFV0ZzazZ1UXE5UFdwU053NlpsSXZNYk40UWV0Vms1bVYzVml6Rmx2aUtsSVNsalRQVHFReXlBaU1xRldVcUZtMHRzSktTQmRLcDFoVlR0UkIyV1NtSW1RZkZMVTkzNU1rN25qQnVVS2ZNSjY1djhoZUZYVTVKQzNLNGN1YUtwd2pxbUpNcDlNRUpKQUxIOEtSQzFCWEY4aUtXVGJXZjBrQklVcGx2dkZkZWQ3d2lxdnNWY2t1NFpVbUozTHR5YnBOTXBEaW11V1FnYXZBNTI5RlpsQ2p1OVZaK3ZxWWtzQktRTVFMWlpUQzBZN21HSkdWaERPMlwvVXIrR01wa2tVbGZQU2d1UHJCeTFNY3dYYjhpTFwvZHFzaEpVMkFUUG85QnZCUXVSd2tBYzhtaVBYQ2lPekRRTElqMzBHSVAxNExPTDZ5QUgybzJRVmFvZGgwRkRZVDkyVWo1NStDeE9vUzlZeVVwSEtHYmVRaWRFNFhielYwVU40VWxicXFJUDVQeUVNQ3lvcVZWVlo2ZDBhekRjRTgrb0pNOFFpYTVncFdMNWZsdGlVR0RlWW5NZFBMZnNPMlRZU1lEM1l4bVFSRVVoXC9hdHBHS1Y0b3BpbXhJbkY4MlpKakJQUUh6WnRtZGxpdEhaSElxcDROUzN4MXUyK0VZa3ZmTHJGSHNhd3JSeHV0SWFwK0hhTHFSbU1DbkdQUzMzZTJJOStDYm5iNVZYeE5QS28wbWlMZlB5UFc0ZHhHUGp0c0w3RnBXbjlPRHgyb3hRWXNubDlwdGRwS3JCM0J6OHRKblpWVDJVRUhHNDlnTGtXT1VuTXFheFwvZkpndFI0UHQwY2UwbHNKUDhpTGIzMGZkVElXWk9JcWE1cm9jNXlXMXN2SmtVZkRDWVdkTFE5UndIeTFuanJXZlkxb3FPR2kzNTlVVkZMUjU4eVIrYU9wbjZhQlJLUFpDXC9NYkQwYmhjc2pkcVwvWDZkMzYzeGJYMVwvWGR2ckNsSGJZYTF1dm1uNk1MYTVXRlBSOWF2aHZ6eGYrcmhNbHFYQUJNV1RnM2NtbDFUcjArVnBXVlZDaGo1ZFpZK25FV2RvekxNaWlzU242OEN2b2lRVnAxVHhMT2lyZFZXWmlQU01wR0tWRDhCb0tYNnNJOVRmaTFBWWZIY01iZ0JIQXFkbHNQUVBab0U2Q292UERDNUhPQlhMT243VmVYN3JWVlJwbUJxZTJaWHo5WE5wQTV5ZkhWeUFmc0hicHVtUjBsdStrM0ltamNnR3N5RlBnbmd5aGtYOFF2WTluSmdxWU5kWkdzT0lBS04yNEJpSU9cL0tMb1Nha2RWOVEwaEFPaW0xYWt0elU3MUpqSklVZTJDc1ZmbWJjUWsxd2ZnVW5IWE8zeERcLzVHWWo3NzVGUmQ1WmZ0ZERmXC93RTV2eUZHbWcwQUFBPT0iLCJzY29wZXMiOlsiYXJ0aWNsZSIsImludm9pY2UiLCJzZXR0aW5ncyIsImN1c3RvbWVyIiwib3JkZXIiLCJwcm9qZWN0Il0sImF1dGhzb3VyY2UiOiJPQVVUSDIiLCJpZCI6IjRiNThjM2M2ZDEwOTU3Njc0ZTQwNzE3Y2ZkODdkOGZkNzExMDQ0YTYiLCJqdGkiOiI0YjU4YzNjNmQxMDk1NzY3NGU0MDcxN2NmZDg3ZDhmZDcxMTA0NGE2IiwiaXNzIjoiaHR0cHM6XC9cL2FwaS5mb3J0bm94LnNlXC9vYXV0aDIiLCJhdWQiOiJkdlBBNDJ5NDBPV0oiLCJzdWIiOiIyQDEzNjgyNjciLCJleHAiOjE2NzUxMDI0MjEsImlhdCI6MTY3NTA5ODgyMSwidG9rZW5fdHlwZSI6ImJlYXJlciIsInNjb3BlIjoiYXJ0aWNsZSBpbnZvaWNlIHNldHRpbmdzIGN1c3RvbWVyIG9yZGVyIHByb2plY3QifQ.wW3fBY0ZkZkBNaGrNSwJlJzNa7EmSGCKhY_QLEAcmIA
4
+
5
+ # VCR: Real credentials are required when renewing authentication cassettes
6
+ FORTNOX_API_CLIENT_ID=test_client_id
7
+ FORTNOX_API_CLIENT_SECRET=test_client_secret
8
+ FORTNOX_API_REFRESH_TOKEN=test_refresh_token
9
+
10
+ # VCR: Valid token is required for rerecording cassettes
11
+ FORTNOX_API_ACCESS_TOKEN=test_access_token
data/.gitignore CHANGED
@@ -7,8 +7,14 @@ Gemfile.lock
7
7
  # Vim swap files
8
8
  *.swp
9
9
 
10
- # rbenv Ruby version file
10
+ # Ruby version files
11
11
  .ruby-version
12
12
 
13
13
  # Simplecov
14
14
  coverage/
15
+
16
+ # Dotenv
17
+ .env
18
+
19
+ # Rake
20
+ .rake_tasks~
data/.rubocop.yml CHANGED
@@ -1,8 +1,9 @@
1
1
  require: rubocop-rspec
2
2
 
3
3
  AllCops:
4
- TargetRubyVersion: 2.3
4
+ TargetRubyVersion: 2.7
5
5
  DisplayCopNames: true
6
+ NewCops: enable
6
7
 
7
8
  RSpec/FilePath:
8
9
  Enabled: false
@@ -13,7 +14,7 @@ RSpec/NestedGroups:
13
14
  Style/Documentation:
14
15
  Enabled: false
15
16
 
16
- Metrics/LineLength:
17
+ Layout/LineLength:
17
18
  Max: 120
18
19
 
19
20
  Metrics/BlockLength:
@@ -23,3 +24,18 @@ Metrics/BlockLength:
23
24
  Naming/PredicateName:
24
25
  Exclude:
25
26
  - 'spec/support/matchers/**/*'
27
+
28
+ Naming/RescuedExceptionsVariableName:
29
+ PreferredName: exception
30
+
31
+ Style/WordArray:
32
+ EnforcedStyle: brackets
33
+
34
+ RSpec/MultipleMemoizedHelpers:
35
+ Max: 7
36
+
37
+ Lint/RaiseException:
38
+ # You must specify the nearest module, not the fully qualified name
39
+ AllowedImplicitNamespaces:
40
+ - 'API'
41
+ - 'Repository'
data/.tool-versions ADDED
@@ -0,0 +1 @@
1
+ ruby 3.2.0
data/.travis.yml CHANGED
@@ -1,35 +1,31 @@
1
1
  env:
2
2
  global:
3
- - CC_TEST_REPORTER_ID=43ea0acb059b164537ce31bf67e03e1cb552d63df1ad3e9bd95dc3d844697bb4
3
+ - CC_TEST_REPORTER_ID=43ea0acb059b164537ce31bf67e03e1cb552d63df1ad3e9bd95dc3d844697bb4
4
4
  language: ruby
5
+ dist: focal
5
6
  rvm:
6
- - 2.4.0
7
- - 2.4.1
8
- - 2.4.2
9
- - 2.4.3
10
- - 2.4.6
11
- - 2.5.0
12
- - 2.5.5
13
- - 2.6.0
14
- - 2.6.3
15
- - 2.7.0-preview1
7
+ - 2.7.7
8
+ - 3.0.5
9
+ - 3.1.3
10
+ - 3.2.0
11
+
16
12
  notifications:
17
13
  slack:
18
14
  secure: UEYDtwLaQgAoMRY7ct1y0Uu5HbInMwrLo+TiYRc3rjDrzqDfDyInEr3bpckyPJ79lnzccrFezMdY4jWzRjmsvQzvYMu+DWJ1mAWOa/9Ws4YZ8nHd5KqXxVQ0EqPWuWwMOyOdyy3DK/MjUOobGSc0//Pv5DeaAAEBKLJzN+e1BQM=
19
15
  email: false
20
16
  before_install:
21
- - gem update --system
22
- - gem install bundler
17
+ - gem update --system
18
+ - gem install bundler
23
19
  cache: bundler
24
20
  before_script:
25
- - curl -L https://codeclimate.com/downloads/test-reporter/test-reporter-latest-linux-amd64
26
- > ./cc-test-reporter
27
- - chmod +x ./cc-test-reporter
28
- - "./cc-test-reporter before-build"
21
+ - curl -L https://codeclimate.com/downloads/test-reporter/test-reporter-latest-linux-amd64
22
+ > ./cc-test-reporter
23
+ - chmod +x ./cc-test-reporter
24
+ - "./cc-test-reporter before-build"
29
25
  script:
30
- - bundle exec rspec
26
+ - bundle exec rspec
31
27
  after_script:
32
- - "./cc-test-reporter after-build --exit-code $TRAVIS_TEST_RESULT"
28
+ - "./cc-test-reporter after-build --exit-code $TRAVIS_TEST_RESULT"
33
29
  branches:
34
30
  only:
35
31
  - master
data/CHANGELOG.md CHANGED
@@ -1,37 +1,102 @@
1
1
  # Changelog
2
+
2
3
  All notable changes to this project will be documented in this file.
3
4
 
4
5
  The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/)
5
- and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html).
6
+ and this project adheres to
7
+ [Semantic Versioning](http://semver.org/spec/v2.0.0.html).
8
+
9
+ ## [Unreleased]
10
+
11
+ ## [0.9.0]
12
+
13
+ ### Added
14
+
15
+ - Script in `bin/get_tokens` to issue access and refresh tokens
16
+ - Script in `bin/renew_tokens` (convenience feature for developers)
17
+ - `Fortnox::API::Repository::Authentication.renew_token`, used for token renewal
18
+
19
+ ### Changed
20
+
21
+ - **Breaking** The auth process is rewritten to support
22
+ [the new auth flow](https://developer.fortnox.se/general/authentication/) that
23
+ Fortnox has implemented. You also need to set the access token explicitly with
24
+ `Fortnox::API.access_token ' your token'`. See [README](README.md) for more
25
+ instructions.
26
+
27
+ ### Fixed
28
+
29
+ - Missing runtime dependencies `dry-configurable` and `dry-container` is added.
30
+ Those were indirect dependencies before via other dry libs, but we use them
31
+ explicitly in the gem, so they should be included as real dependencies. Also,
32
+ newer versions of these gems did actually break the gem.
33
+ - Not trying to update resource if diff against parent is an empty object
34
+ (#238).
35
+
36
+ ### Removed
37
+
38
+ - **Breaking** Drops support for Ruby 2.6 since it's reached end of life
39
+ - Token rotation is removed since Fortnox counts rate limit on tenant and client
40
+ id. Before, you could get around this by using multiple access tokens. That's
41
+ not possible anymore, so token rotation is simply removed.
42
+ - **Breaking** Removes `client_id` and `client_secret` from configuration. These
43
+ value are only used for token renewal, so they are now arguments to the
44
+ `Authentication` repository. This means there are no longer any required
45
+ configuration to set in `Fortnox::API.configuration`.
46
+
47
+ ## [0.8.0]
48
+
49
+ ### Changed
50
+
51
+ - `Fortnox::API::CURRENT_HOUSEWORK_TYPES` is now renamed to `HOUSEWORK_TYPES`
52
+ and is instead a Hash with keys for the different categories of types. It also
53
+ includes legacy types, which means `Fortnox::API::LEGACY_HOUSEWORK_TYPES` is
54
+ removed.
55
+
56
+ ### Removed
57
+
58
+ - Drops support for Ruby < `2.5.0` since they are deprecated
6
59
 
7
60
  ## [0.7.2]
61
+
8
62
  ### Fixed
63
+
9
64
  - Invalid validation for Customer's account number attribute
10
65
 
11
66
  ## [0.7.1]
67
+
12
68
  ### Fixed
69
+
13
70
  - Invalid validation for Customer's country attributes
14
71
 
15
72
  ## [0.7.0]
73
+
16
74
  ### Added
75
+
17
76
  - Adds build test for Ruby `2.6.0`, `2.6.3` and `2.7.0-preview`.
18
77
 
19
78
  ### Removed
79
+
20
80
  - Drops support for Ruby < `2.4.0` since they are deprecated
21
81
 
22
82
  ### Fixed
83
+
23
84
  - Country attribute for `Invoice` and `Order` is now validated correctly.
24
85
  - Fixes deprecation warnings
25
86
  - Unlocks pinned `HTTParty` version
26
87
  - Invalid email validation
27
88
 
28
89
  ## [0.6.3]
90
+
29
91
  ### Changed
92
+
30
93
  - Pins `dry-types` to `< 0.13.0` due to breaking changes
31
94
 
32
95
  ### Fixed
96
+
33
97
  - Model attribute `url` is no longer null
34
98
 
99
+ [0.8.0]: https://github.com/accodeing/fortnox-api/compare/v0.7.2...v0.8.0
35
100
  [0.7.2]: https://github.com/accodeing/fortnox-api/compare/v0.7.1...v0.7.2
36
101
  [0.7.1]: https://github.com/accodeing/fortnox-api/compare/v0.7.0...v0.7.1
37
102
  [0.7.0]: https://github.com/accodeing/fortnox-api/compare/v0.6.3...v0.7.0
data/CONTRIBUTE.md CHANGED
@@ -1,24 +1,36 @@
1
- 1. Fork it ( http://github.com/my-codeworks/fortnox-api/fork )
2
- 2. Clone your fork (`git clone https://github.com/<your GitHub user
3
- name>/fortnox-api.git`)
1
+ # Contribute to the project
2
+
3
+ If you want to participate in the development somehow, please send us an email
4
+ at info@accodeing.com and let us know. Both small and large contributions are
5
+ appreciated. We have a Slack channel where developers are more than welcome :)
6
+
7
+ Please start with reading the [DEVELOPER_README](DEVELOPER_README.md).
8
+
9
+ To contribute:
10
+
11
+ 1. Fork it ( http://github.com/accodeing/fortnox-api/fork )
12
+ 2. Clone your fork
13
+ (`git clone https://github.com/<your GitHub user name>/fortnox-api.git`)
4
14
  3. Create your feature branch (`git checkout -b my-new-feature`)
5
15
  4. Commit your changes (`git commit -am 'Add some feature'`)
6
16
  5. Push to the branch (`git push origin my-new-feature`)
7
- 6. Create new Pull Request
17
+ 6. Create new Pull Request against our `development` branch
8
18
 
9
- ### Adding upstream remote
19
+ # Adding upstream remote
10
20
 
11
21
  If you want to keep contributing, it is a good idea to add the original repo as
12
- remote server to your clone ( `git remote add upstream
13
- https://github.com/my-codeworks/fortnox-api` ). Then you can do something like
14
- this to update your fork:
22
+ remote server to your clone (
23
+ `git remote add upstream https://github.com/accodeing/fortnox-api` ). Then you
24
+ can do something like this to update your fork:
15
25
 
16
26
  1. Fetch branches from upstream (`git fetch upstream`)
17
27
  2. Checkout your master branch (`git checkout master`)
18
28
  3. Update it (`git rebase upstream/master`)
19
- 4. And push it to your fork (`git push origin master`)
29
+ 4. And push it to your fork (`git push origin master`) (might need a `--force`
30
+ if branches have diverged)
20
31
 
21
32
  If you want to update another branch:
33
+
22
34
  ```
23
35
  git checkout branch-name
24
36
  git rebase upstream/branch-name
@@ -0,0 +1,72 @@
1
+ # Readme for Developers
2
+
3
+ ## Testing
4
+
5
+ This gem has integration tests to verify the code against the real API. It uses
6
+ [vcr](https://github.com/vcr/vcr) to record API endpoint responses. These
7
+ responses are stored locally and are called vcr cassettes. If no cassettes are
8
+ available, vcr will record new ones for you. Once in a while, it's good to throw
9
+ away all cassettes and rerecord them. Fortnox updates their endpoints and we
10
+ need to keep our code up to date with the reality. There's a handy rake task for
11
+ removing all cassettes, see `rake -T`. Note that when rerecording all cassettes,
12
+ do it one repository at a time, otherwise you'll definitely get
13
+ `429 Too Many Requests` from Fortnox. Run them manually with something like
14
+ `bundle exec rspec spec/fortnox/api/repositories/article_spec.rb`. Also, you
15
+ will need to update some test data in specs, see notes in specs.
16
+
17
+ ### Test environment variables
18
+
19
+ `.env.test` includes environment variables used for testing. If you want to run
20
+ tests against a real (or test) Fortnox account you need to provide valid
21
+ credentials in `.env`. See [Get tokens](get-tokens) for how to issue valid
22
+ tokens and `.env.template` for which values you need to provide. Then, you must
23
+ move these into `.env.test` since that's the environment file used for testing.
24
+
25
+ If you want the gem to refresh your tokens during testing, you can enable that
26
+ feature by setting the environment variable `REFRESH_TOKENS=true`.
27
+
28
+ ### Seeding
29
+
30
+ There's a Rake task for seeding the Test Fortnox instance with data that the
31
+ test suite needs. See `rake -T` to find the task.
32
+
33
+ ### Debug mode while running tests
34
+
35
+ There's a `DEBUG` environment variable to set if you want to debug during
36
+ testing.
37
+
38
+ ## Rubocop
39
+
40
+ When updating Rubocop in `fortnox-api.gemspec`, you need to set the explicit
41
+ version that codeclimate runs in `.codeclimate.yml`
42
+
43
+ ## Updating Ruby version
44
+
45
+ When updating the required Ruby version, you need to do the following:
46
+
47
+ - Bump Ruby version in `fortnox-api.gemspec`
48
+ - Update gems if needed
49
+ - Verify that the test suite is passing
50
+ - Bump `TargetRubyVersion` in `.rubocop.yml` and verify that the Rubocop version
51
+ we are using is supporting that Ruby version. Otherwise you need to upgrade
52
+ Rubocop as well, see [Rubocop instructions](#rubocop). The version here should
53
+ be the lowest version we support.
54
+ - Update `.tool-versions` to the **newest version we support**
55
+ - Update `.travis.yml` with the new Ruby versions
56
+ - Update required Ruby version in the readme
57
+ - Verify that all GitHub integrations works in the pull request you are creating
58
+
59
+ # Release
60
+
61
+ 1. Update `CHANGELOG.md`
62
+ 2. Bump version in `lib/fortnox/api/version.rb`
63
+ 3. Release gem with `gem build fortnox-api.gemspec` and
64
+ `gem push fortnox-api-[VERSION].gem`
65
+
66
+ # Contributing
67
+
68
+ See the [CONTRIBUTE](CONTRIBUTE.md) readme.
69
+
70
+ # Dummy trigger
71
+
72
+ A dummy trigger: 1
data/Guardfile CHANGED
@@ -1,7 +1,16 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- guard :rspec, cmd: 'bundle exec rspec --color', all_after_pass: true do
4
- watch(%r{^spec/.+_spec\.rb$})
5
- watch(%r{^lib/(.+)\.rb$}) { |m| "spec/#{m[1]}_spec.rb" }
6
- watch('spec/spec_helper.rb') { 'spec' }
3
+ group :rspec do
4
+ guard :rspec, cmd: 'bundle exec rspec --color', all_after_pass: true do
5
+ watch(%r{^spec/.+_spec\.rb$})
6
+ watch(%r{^lib/(.+)\.rb$}) { |m| "spec/#{m[1]}_spec.rb" }
7
+ watch('spec/spec_helper.rb') { 'spec' }
8
+ end
9
+ end
10
+
11
+ group :rubocop do
12
+ guard :rubocop, cli: ['--display-cop-names'] do
13
+ watch(/.+\.rb$/)
14
+ watch(%r{(?:.+/)?\.rubocop(?:_todo)?\.yml$}) { |m| File.dirname(m[0]) }
15
+ end
7
16
  end