fortnox-api 0.8.0 → 0.9.0

Sign up to get free protection for your applications and to get access to all the features.
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 -12
  9. data/CHANGELOG.md +58 -3
  10. data/CONTRIBUTE.md +21 -9
  11. data/DEVELOPER_README.md +72 -0
  12. data/Guardfile +13 -4
  13. data/README.md +226 -64
  14. data/Rakefile +128 -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 +5 -4
  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 +2 -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 +27 -11
  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 +31 -23
  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 +64 -21
  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/examples/document_row.rb +3 -3
  103. data/spec/fortnox/api/types/examples/enum.rb +4 -4
  104. data/spec/fortnox/api/types/examples/types.rb +1 -3
  105. data/spec/fortnox/api/types/housework_types_spec.rb +54 -90
  106. data/spec/fortnox/api/types/model_spec.rb +13 -23
  107. data/spec/fortnox/api/types/nullable_spec.rb +30 -10
  108. data/spec/fortnox/api/types/order_row_spec.rb +2 -2
  109. data/spec/fortnox/api/types/required_spec.rb +7 -15
  110. data/spec/fortnox/api/types/sales_account_spec.rb +57 -0
  111. data/spec/fortnox/api_spec.rb +19 -124
  112. data/spec/spec_helper.rb +0 -14
  113. data/spec/support/helpers/configuration_helper.rb +30 -3
  114. data/spec/support/helpers.rb +1 -1
  115. data/spec/support/matchers/type/attribute_matcher.rb +2 -2
  116. data/spec/support/matchers/type/enum_matcher.rb +1 -1
  117. data/spec/support/matchers/type/have_account_number_matcher.rb +1 -1
  118. data/spec/support/matchers/type/have_email_matcher.rb +1 -1
  119. data/spec/support/matchers/type/have_nullable_date_matcher.rb +7 -5
  120. data/spec/support/matchers/type/have_nullable_matcher.rb +1 -1
  121. data/spec/support/matchers/type/have_nullable_string_matcher.rb +5 -5
  122. data/spec/support/matchers/type/require_attribute_matcher.rb +5 -5
  123. data/spec/support/matchers/type/type_matcher.rb +1 -1
  124. data/spec/support/vcr_setup.rb +16 -0
  125. data/spec/vcr_cassettes/articles/all.yml +32 -49
  126. data/spec/vcr_cassettes/articles/find_by_hash_failure.yml +27 -23
  127. data/spec/vcr_cassettes/articles/find_failure.yml +27 -23
  128. data/spec/vcr_cassettes/articles/find_id_1.yml +29 -24
  129. data/spec/vcr_cassettes/articles/find_new.yml +30 -26
  130. data/spec/vcr_cassettes/articles/multi_param_find_by_hash.yml +29 -25
  131. data/spec/vcr_cassettes/articles/save_new.yml +29 -25
  132. data/spec/vcr_cassettes/articles/save_old.yml +30 -26
  133. data/spec/vcr_cassettes/articles/save_with_specially_named_attribute.yml +29 -25
  134. data/spec/vcr_cassettes/articles/search_by_name.yml +32 -25
  135. data/spec/vcr_cassettes/articles/search_miss.yml +27 -23
  136. data/spec/vcr_cassettes/articles/search_with_special_char.yml +27 -23
  137. data/spec/vcr_cassettes/articles/single_param_find_by_hash.yml +29 -36
  138. data/spec/vcr_cassettes/authentication/expired_token.yml +54 -0
  139. data/spec/vcr_cassettes/authentication/invalid_authorization.yml +57 -0
  140. data/spec/vcr_cassettes/authentication/invalid_refresh_token.yml +58 -0
  141. data/spec/vcr_cassettes/authentication/valid_request.yml +63 -0
  142. data/spec/vcr_cassettes/customers/all.yml +35 -136
  143. data/spec/vcr_cassettes/customers/find_by_hash_failure.yml +27 -23
  144. data/spec/vcr_cassettes/customers/find_failure.yml +27 -23
  145. data/spec/vcr_cassettes/customers/find_id_1.yml +30 -25
  146. data/spec/vcr_cassettes/customers/find_new.yml +29 -25
  147. data/spec/vcr_cassettes/customers/find_with_sales_account.yml +63 -0
  148. data/spec/vcr_cassettes/customers/multi_param_find_by_hash.yml +29 -25
  149. data/spec/vcr_cassettes/customers/save_new.yml +28 -24
  150. data/spec/vcr_cassettes/customers/save_new_with_country_code_SE.yml +28 -24
  151. data/spec/vcr_cassettes/customers/save_new_with_sales_account.yml +63 -0
  152. data/spec/vcr_cassettes/customers/save_old.yml +29 -25
  153. data/spec/vcr_cassettes/customers/save_with_specially_named_attribute.yml +28 -24
  154. data/spec/vcr_cassettes/customers/search_by_name.yml +29 -53
  155. data/spec/vcr_cassettes/customers/search_miss.yml +27 -23
  156. data/spec/vcr_cassettes/customers/search_with_special_char.yml +27 -23
  157. data/spec/vcr_cassettes/customers/single_param_find_by_hash.yml +30 -26
  158. data/spec/vcr_cassettes/invoices/all.yml +62 -121
  159. data/spec/vcr_cassettes/invoices/filter_hit.yml +30 -28
  160. data/spec/vcr_cassettes/invoices/filter_invalid.yml +27 -23
  161. data/spec/vcr_cassettes/invoices/find_by_hash_failure.yml +27 -23
  162. data/spec/vcr_cassettes/invoices/find_failure.yml +27 -23
  163. data/spec/vcr_cassettes/invoices/find_id_1.yml +31 -26
  164. data/spec/vcr_cassettes/invoices/find_new.yml +32 -28
  165. data/spec/vcr_cassettes/invoices/multi_param_find_by_hash.yml +29 -25
  166. data/spec/vcr_cassettes/invoices/row_description_limit.yml +65 -0
  167. data/spec/vcr_cassettes/invoices/save_new.yml +31 -27
  168. data/spec/vcr_cassettes/invoices/save_new_with_comments.yml +31 -27
  169. data/spec/vcr_cassettes/invoices/save_new_with_country.yml +31 -26
  170. data/spec/vcr_cassettes/invoices/save_new_with_country_GB.yml +32 -27
  171. data/spec/vcr_cassettes/invoices/save_new_with_country_Norge.yml +31 -26
  172. data/spec/vcr_cassettes/invoices/save_new_with_country_Norway.yml +31 -26
  173. data/spec/vcr_cassettes/invoices/save_new_with_country_Sverige.yml +31 -26
  174. data/spec/vcr_cassettes/invoices/save_new_with_country_VA.yml +32 -27
  175. data/spec/vcr_cassettes/invoices/save_new_with_country_VI.yml +32 -27
  176. data/spec/vcr_cassettes/invoices/save_new_with_country_empty_string.yml +31 -26
  177. data/spec/vcr_cassettes/invoices/save_new_with_country_nil.yml +31 -26
  178. data/spec/vcr_cassettes/invoices/save_new_with_unsaved_parent.yml +65 -0
  179. data/spec/vcr_cassettes/invoices/save_old.yml +32 -28
  180. data/spec/vcr_cassettes/invoices/save_old_with_empty_comments.yml +32 -28
  181. data/spec/vcr_cassettes/invoices/save_old_with_empty_country.yml +32 -27
  182. data/spec/vcr_cassettes/invoices/save_old_with_nil_comments.yml +32 -28
  183. data/spec/vcr_cassettes/invoices/save_old_with_nil_country.yml +32 -27
  184. data/spec/vcr_cassettes/invoices/save_with_nested_model.yml +32 -27
  185. data/spec/vcr_cassettes/invoices/save_with_specially_named_attribute.yml +31 -26
  186. data/spec/vcr_cassettes/invoices/search_by_name.yml +29 -31
  187. data/spec/vcr_cassettes/invoices/search_miss.yml +27 -23
  188. data/spec/vcr_cassettes/invoices/search_with_special_char.yml +27 -23
  189. data/spec/vcr_cassettes/invoices/single_param_find_by_hash.yml +30 -26
  190. data/spec/vcr_cassettes/orders/all.yml +35 -123
  191. data/spec/vcr_cassettes/orders/filter_hit.yml +30 -30
  192. data/spec/vcr_cassettes/orders/filter_invalid.yml +27 -23
  193. data/spec/vcr_cassettes/orders/find_by_hash_failure.yml +27 -23
  194. data/spec/vcr_cassettes/orders/find_failure.yml +27 -23
  195. data/spec/vcr_cassettes/orders/find_id_1.yml +33 -27
  196. data/spec/vcr_cassettes/orders/find_new.yml +32 -28
  197. data/spec/vcr_cassettes/orders/housework_invalid_tax_reduction_type.yml +28 -24
  198. data/spec/vcr_cassettes/orders/housework_othercoses_invalid.yml +28 -24
  199. data/spec/vcr_cassettes/orders/housework_type_babysitting.yml +32 -27
  200. data/spec/vcr_cassettes/orders/housework_type_cleaning.yml +32 -27
  201. data/spec/vcr_cassettes/orders/housework_type_construction.yml +32 -27
  202. data/spec/vcr_cassettes/orders/housework_type_cooking.yml +28 -24
  203. data/spec/vcr_cassettes/orders/housework_type_electricity.yml +32 -27
  204. data/spec/vcr_cassettes/orders/housework_type_gardening.yml +32 -27
  205. data/spec/vcr_cassettes/orders/housework_type_glassmetalwork.yml +32 -27
  206. data/spec/vcr_cassettes/orders/housework_type_grounddrainagework.yml +32 -27
  207. data/spec/vcr_cassettes/orders/housework_type_hvac.yml +32 -27
  208. data/spec/vcr_cassettes/orders/housework_type_itservices.yml +32 -27
  209. data/spec/vcr_cassettes/orders/housework_type_majorappliancerepair.yml +32 -27
  210. data/spec/vcr_cassettes/orders/housework_type_masonry.yml +32 -27
  211. data/spec/vcr_cassettes/orders/housework_type_movingservices.yml +32 -27
  212. data/spec/vcr_cassettes/orders/housework_type_othercare.yml +32 -27
  213. data/spec/vcr_cassettes/orders/housework_type_othercosts.yml +32 -27
  214. data/spec/vcr_cassettes/orders/housework_type_paintingwallpapering.yml +32 -27
  215. data/spec/vcr_cassettes/orders/housework_type_snowplowing.yml +32 -27
  216. data/spec/vcr_cassettes/orders/housework_type_textileclothing.yml +32 -27
  217. data/spec/vcr_cassettes/orders/housework_type_tutoring.yml +28 -24
  218. data/spec/vcr_cassettes/orders/multi_param_find_by_hash.yml +29 -25
  219. data/spec/vcr_cassettes/orders/save_new.yml +32 -28
  220. data/spec/vcr_cassettes/orders/save_old.yml +32 -28
  221. data/spec/vcr_cassettes/orders/save_with_nested_model.yml +32 -27
  222. data/spec/vcr_cassettes/orders/search_by_name.yml +29 -27
  223. data/spec/vcr_cassettes/orders/search_miss.yml +27 -23
  224. data/spec/vcr_cassettes/orders/search_with_special_char.yml +27 -23
  225. data/spec/vcr_cassettes/orders/single_param_find_by_hash.yml +30 -26
  226. data/spec/vcr_cassettes/projects/all.yml +30 -43
  227. data/spec/vcr_cassettes/projects/find_by_hash_failure.yml +27 -23
  228. data/spec/vcr_cassettes/projects/find_failure.yml +27 -23
  229. data/spec/vcr_cassettes/projects/find_id_1.yml +29 -25
  230. data/spec/vcr_cassettes/projects/find_new.yml +30 -26
  231. data/spec/vcr_cassettes/projects/multi_param_find_by_hash.yml +31 -26
  232. data/spec/vcr_cassettes/projects/save_new.yml +29 -25
  233. data/spec/vcr_cassettes/projects/save_old.yml +30 -26
  234. data/spec/vcr_cassettes/projects/single_param_find_by_hash.yml +29 -25
  235. data/spec/vcr_cassettes/termsofpayments/all.yml +32 -32
  236. data/spec/vcr_cassettes/termsofpayments/find_failure.yml +27 -23
  237. data/spec/vcr_cassettes/termsofpayments/find_id_1.yml +29 -26
  238. data/spec/vcr_cassettes/termsofpayments/find_new.yml +29 -25
  239. data/spec/vcr_cassettes/termsofpayments/save_new.yml +29 -25
  240. data/spec/vcr_cassettes/termsofpayments/save_old.yml +29 -25
  241. data/spec/vcr_cassettes/units/all.yml +29 -32
  242. data/spec/vcr_cassettes/units/find_failure.yml +27 -23
  243. data/spec/vcr_cassettes/units/find_id_1.yml +29 -25
  244. data/spec/vcr_cassettes/units/find_new.yml +29 -25
  245. data/spec/vcr_cassettes/units/save_new.yml +29 -25
  246. data/spec/vcr_cassettes/units/save_old.yml +29 -25
  247. data/spec/vcr_cassettes/units/save_with_specially_named_attribute.yml +29 -25
  248. metadata +130 -261
  249. data/lib/fortnox/api/circular_queue.rb +0 -39
  250. data/spec/fortnox/api/circular_queue_spec.rb +0 -52
  251. data/spec/support/helpers/dummy_class_helper.rb +0 -38
  252. data/spec/support/helpers/when_performing_helper.rb +0 -7
  253. data/spec/vcr_cassettes/invoices/save_new_with_country_KR.yml +0 -61
  254. data/spec/vcr_cassettes/orders/housework_without_tax_reduction_type.yml +0 -57
  255. data/temp.txt +0 -1
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 02c5fbd6c659d3c6cc4e9ed8dfef6e739ded62fc33107623f4dddc13d33f6672
4
- data.tar.gz: 14f0815a2fd32e98055d71ef231da2b6fac4b95ecfd9dfcda59b88d1c1445c63
3
+ metadata.gz: 843c49685ec54b6f9e9adb7f5a16a67dc827f0d7b5e58b3d8bd8bd9fccced0db
4
+ data.tar.gz: 306a7d66d0b820cc8250b887d14362a7117e8aebbffae5449ba277f30013a06d
5
5
  SHA512:
6
- metadata.gz: 293665ff9e0b860e88c7c6c78fbcfdd0b8a8047444f23cd0560d504442e1a0ac3439c52349413cac63e0c5973d1db74dabcf7ebdd9c10bc3f1b7de922db58cbc
7
- data.tar.gz: 011b4785ce46af9c4cd57939431f6b09dc6ab44d650023616fe7b0784dcde890727999eb918ac3c3db311afaaff8785d240c54e5c30f198a630b9a1bf41483b7
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.5
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,28 +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.5.8
7
- - 2.6.6
8
- - 2.7.1
7
+ - 2.7.7
8
+ - 3.0.5
9
+ - 3.1.3
10
+ - 3.2.0
11
+
9
12
  notifications:
10
13
  slack:
11
14
  secure: UEYDtwLaQgAoMRY7ct1y0Uu5HbInMwrLo+TiYRc3rjDrzqDfDyInEr3bpckyPJ79lnzccrFezMdY4jWzRjmsvQzvYMu+DWJ1mAWOa/9Ws4YZ8nHd5KqXxVQ0EqPWuWwMOyOdyy3DK/MjUOobGSc0//Pv5DeaAAEBKLJzN+e1BQM=
12
15
  email: false
13
16
  before_install:
14
- - gem update --system
15
- - gem install bundler
17
+ - gem update --system
18
+ - gem install bundler
16
19
  cache: bundler
17
20
  before_script:
18
- - curl -L https://codeclimate.com/downloads/test-reporter/test-reporter-latest-linux-amd64
19
- > ./cc-test-reporter
20
- - chmod +x ./cc-test-reporter
21
- - "./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"
22
25
  script:
23
- - bundle exec rspec
26
+ - bundle exec rspec
24
27
  after_script:
25
- - "./cc-test-reporter after-build --exit-code $TRAVIS_TEST_RESULT"
28
+ - "./cc-test-reporter after-build --exit-code $TRAVIS_TEST_RESULT"
26
29
  branches:
27
30
  only:
28
31
  - master
data/CHANGELOG.md CHANGED
@@ -1,44 +1,99 @@
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`.
6
46
 
7
47
  ## [0.8.0]
48
+
8
49
  ### Changed
50
+
9
51
  - `Fortnox::API::CURRENT_HOUSEWORK_TYPES` is now renamed to `HOUSEWORK_TYPES`
10
- and is instead a Hash with keys for the different categories of types.
11
- It also includes legacy types, which means `Fortnox::API::LEGACY_HOUSEWORK_TYPES` is removed.
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.
12
55
 
13
56
  ### Removed
57
+
14
58
  - Drops support for Ruby < `2.5.0` since they are deprecated
15
59
 
16
60
  ## [0.7.2]
61
+
17
62
  ### Fixed
63
+
18
64
  - Invalid validation for Customer's account number attribute
19
65
 
20
66
  ## [0.7.1]
67
+
21
68
  ### Fixed
69
+
22
70
  - Invalid validation for Customer's country attributes
23
71
 
24
72
  ## [0.7.0]
73
+
25
74
  ### Added
75
+
26
76
  - Adds build test for Ruby `2.6.0`, `2.6.3` and `2.7.0-preview`.
27
77
 
28
78
  ### Removed
79
+
29
80
  - Drops support for Ruby < `2.4.0` since they are deprecated
30
81
 
31
82
  ### Fixed
83
+
32
84
  - Country attribute for `Invoice` and `Order` is now validated correctly.
33
85
  - Fixes deprecation warnings
34
86
  - Unlocks pinned `HTTParty` version
35
87
  - Invalid email validation
36
88
 
37
89
  ## [0.6.3]
90
+
38
91
  ### Changed
92
+
39
93
  - Pins `dry-types` to `< 0.13.0` due to breaking changes
40
94
 
41
95
  ### Fixed
96
+
42
97
  - Model attribute `url` is no longer null
43
98
 
44
99
  [0.8.0]: https://github.com/accodeing/fortnox-api/compare/v0.7.2...v0.8.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