fortnox-api 0.8.2 → 0.9.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (205) 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 +22 -8
  8. data/CONTRIBUTE.md +21 -9
  9. data/DEVELOPER_README.md +72 -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/base.rb +12 -10
  19. data/lib/fortnox/api/models/customer.rb +55 -55
  20. data/lib/fortnox/api/models/label.rb +2 -2
  21. data/lib/fortnox/api/repositories/authentication.rb +61 -0
  22. data/lib/fortnox/api/repositories/base/savers.rb +3 -1
  23. data/lib/fortnox/api/repositories/base.rb +21 -35
  24. data/lib/fortnox/api/repositories.rb +1 -0
  25. data/lib/fortnox/api/request_handling.rb +30 -18
  26. data/lib/fortnox/api/types/document_row.rb +3 -3
  27. data/lib/fortnox/api/types/enums.rb +27 -11
  28. data/lib/fortnox/api/types/model.rb +1 -4
  29. data/lib/fortnox/api/types/sized.rb +2 -2
  30. data/lib/fortnox/api/types.rb +14 -1
  31. data/lib/fortnox/api/version.rb +1 -1
  32. data/lib/fortnox/api.rb +12 -32
  33. data/spec/fortnox/api/mappers/base/canonical_name_sym_spec.rb +4 -4
  34. data/spec/fortnox/api/mappers/base/from_json_spec.rb +10 -12
  35. data/spec/fortnox/api/mappers/base/to_json_spec.rb +48 -57
  36. data/spec/fortnox/api/mappers/base_spec.rb +4 -7
  37. data/spec/fortnox/api/mappers/contexts/json_conversion.rb +38 -33
  38. data/spec/fortnox/api/mappers/unit_spec.rb +3 -4
  39. data/spec/fortnox/api/models/base_spec.rb +27 -16
  40. data/spec/fortnox/api/models/unit_spec.rb +5 -3
  41. data/spec/fortnox/api/repositories/article_spec.rb +14 -9
  42. data/spec/fortnox/api/repositories/authentication_spec.rb +103 -0
  43. data/spec/fortnox/api/repositories/base_spec.rb +106 -319
  44. data/spec/fortnox/api/repositories/customer_spec.rb +37 -7
  45. data/spec/fortnox/api/repositories/examples/all.rb +0 -1
  46. data/spec/fortnox/api/repositories/examples/find.rb +5 -8
  47. data/spec/fortnox/api/repositories/examples/only.rb +4 -13
  48. data/spec/fortnox/api/repositories/examples/save.rb +32 -18
  49. data/spec/fortnox/api/repositories/examples/save_with_nested_model.rb +0 -5
  50. data/spec/fortnox/api/repositories/examples/save_with_specially_named_attribute.rb +1 -4
  51. data/spec/fortnox/api/repositories/examples/search.rb +4 -7
  52. data/spec/fortnox/api/repositories/invoice_spec.rb +64 -15
  53. data/spec/fortnox/api/repositories/order_spec.rb +11 -9
  54. data/spec/fortnox/api/repositories/project_spec.rb +7 -6
  55. data/spec/fortnox/api/repositories/terms_of_payment_spec.rb +9 -7
  56. data/spec/fortnox/api/repositories/unit_spec.rb +13 -11
  57. data/spec/fortnox/api/types/country_spec.rb +1 -1
  58. data/spec/fortnox/api/types/email_spec.rb +2 -2
  59. data/spec/fortnox/api/types/examples/document_row.rb +3 -3
  60. data/spec/fortnox/api/types/examples/enum.rb +4 -4
  61. data/spec/fortnox/api/types/examples/types.rb +1 -3
  62. data/spec/fortnox/api/types/housework_types_spec.rb +54 -61
  63. data/spec/fortnox/api/types/model_spec.rb +3 -27
  64. data/spec/fortnox/api/types/order_row_spec.rb +2 -2
  65. data/spec/fortnox/api/types/required_spec.rb +6 -11
  66. data/spec/fortnox/api/types/sales_account_spec.rb +57 -0
  67. data/spec/fortnox/api_spec.rb +19 -124
  68. data/spec/spec_helper.rb +0 -14
  69. data/spec/support/helpers/configuration_helper.rb +30 -3
  70. data/spec/support/helpers.rb +1 -1
  71. data/spec/support/matchers/type/attribute_matcher.rb +2 -2
  72. data/spec/support/matchers/type/have_nullable_date_matcher.rb +6 -4
  73. data/spec/support/matchers/type/have_nullable_matcher.rb +1 -1
  74. data/spec/support/matchers/type/have_nullable_string_matcher.rb +5 -5
  75. data/spec/support/matchers/type/require_attribute_matcher.rb +5 -5
  76. data/spec/support/matchers/type/type_matcher.rb +1 -1
  77. data/spec/support/vcr_setup.rb +16 -0
  78. data/spec/vcr_cassettes/articles/all.yml +16 -43
  79. data/spec/vcr_cassettes/articles/find_by_hash_failure.yml +10 -12
  80. data/spec/vcr_cassettes/articles/find_failure.yml +10 -12
  81. data/spec/vcr_cassettes/articles/find_id_1.yml +13 -14
  82. data/spec/vcr_cassettes/articles/find_new.yml +14 -16
  83. data/spec/vcr_cassettes/articles/multi_param_find_by_hash.yml +13 -15
  84. data/spec/vcr_cassettes/articles/save_new.yml +13 -15
  85. data/spec/vcr_cassettes/articles/save_old.yml +14 -16
  86. data/spec/vcr_cassettes/articles/save_with_specially_named_attribute.yml +13 -15
  87. data/spec/vcr_cassettes/articles/search_by_name.yml +16 -15
  88. data/spec/vcr_cassettes/articles/search_miss.yml +10 -12
  89. data/spec/vcr_cassettes/articles/search_with_special_char.yml +10 -12
  90. data/spec/vcr_cassettes/articles/single_param_find_by_hash.yml +13 -27
  91. data/spec/vcr_cassettes/authentication/expired_token.yml +54 -0
  92. data/spec/vcr_cassettes/authentication/invalid_authorization.yml +57 -0
  93. data/spec/vcr_cassettes/authentication/invalid_refresh_token.yml +58 -0
  94. data/spec/vcr_cassettes/authentication/valid_request.yml +63 -0
  95. data/spec/vcr_cassettes/customers/all.yml +20 -127
  96. data/spec/vcr_cassettes/customers/find_by_hash_failure.yml +10 -12
  97. data/spec/vcr_cassettes/customers/find_failure.yml +10 -12
  98. data/spec/vcr_cassettes/customers/find_id_1.yml +14 -15
  99. data/spec/vcr_cassettes/customers/find_new.yml +13 -15
  100. data/spec/vcr_cassettes/customers/find_with_sales_account.yml +63 -0
  101. data/spec/vcr_cassettes/customers/multi_param_find_by_hash.yml +13 -15
  102. data/spec/vcr_cassettes/customers/save_new.yml +12 -14
  103. data/spec/vcr_cassettes/customers/save_new_with_country_code_SE.yml +12 -14
  104. data/spec/vcr_cassettes/customers/save_new_with_sales_account.yml +63 -0
  105. data/spec/vcr_cassettes/customers/save_old.yml +13 -15
  106. data/spec/vcr_cassettes/customers/save_with_specially_named_attribute.yml +12 -14
  107. data/spec/vcr_cassettes/customers/search_by_name.yml +13 -45
  108. data/spec/vcr_cassettes/customers/search_miss.yml +10 -12
  109. data/spec/vcr_cassettes/customers/search_with_special_char.yml +10 -12
  110. data/spec/vcr_cassettes/customers/single_param_find_by_hash.yml +14 -16
  111. data/spec/vcr_cassettes/invoices/all.yml +47 -112
  112. data/spec/vcr_cassettes/invoices/filter_hit.yml +14 -18
  113. data/spec/vcr_cassettes/invoices/filter_invalid.yml +10 -12
  114. data/spec/vcr_cassettes/invoices/find_by_hash_failure.yml +10 -12
  115. data/spec/vcr_cassettes/invoices/find_failure.yml +10 -12
  116. data/spec/vcr_cassettes/invoices/find_id_1.yml +15 -16
  117. data/spec/vcr_cassettes/invoices/find_new.yml +16 -18
  118. data/spec/vcr_cassettes/invoices/multi_param_find_by_hash.yml +13 -15
  119. data/spec/vcr_cassettes/invoices/row_description_limit.yml +65 -0
  120. data/spec/vcr_cassettes/invoices/save_new.yml +14 -16
  121. data/spec/vcr_cassettes/invoices/save_new_with_comments.yml +14 -16
  122. data/spec/vcr_cassettes/invoices/save_new_with_country.yml +14 -15
  123. data/spec/vcr_cassettes/invoices/save_new_with_country_GB.yml +15 -16
  124. data/spec/vcr_cassettes/invoices/save_new_with_country_Norge.yml +14 -15
  125. data/spec/vcr_cassettes/invoices/save_new_with_country_Norway.yml +14 -15
  126. data/spec/vcr_cassettes/invoices/save_new_with_country_Sverige.yml +14 -15
  127. data/spec/vcr_cassettes/invoices/save_new_with_country_VA.yml +15 -16
  128. data/spec/vcr_cassettes/invoices/save_new_with_country_VI.yml +15 -16
  129. data/spec/vcr_cassettes/invoices/save_new_with_country_empty_string.yml +14 -15
  130. data/spec/vcr_cassettes/invoices/save_new_with_country_nil.yml +14 -15
  131. data/spec/vcr_cassettes/invoices/save_new_with_unsaved_parent.yml +65 -0
  132. data/spec/vcr_cassettes/invoices/save_old.yml +16 -18
  133. data/spec/vcr_cassettes/invoices/save_old_with_empty_comments.yml +16 -18
  134. data/spec/vcr_cassettes/invoices/save_old_with_empty_country.yml +16 -17
  135. data/spec/vcr_cassettes/invoices/save_old_with_nil_comments.yml +16 -18
  136. data/spec/vcr_cassettes/invoices/save_old_with_nil_country.yml +16 -17
  137. data/spec/vcr_cassettes/invoices/save_with_nested_model.yml +15 -16
  138. data/spec/vcr_cassettes/invoices/save_with_specially_named_attribute.yml +14 -15
  139. data/spec/vcr_cassettes/invoices/search_by_name.yml +13 -21
  140. data/spec/vcr_cassettes/invoices/search_miss.yml +10 -12
  141. data/spec/vcr_cassettes/invoices/search_with_special_char.yml +10 -12
  142. data/spec/vcr_cassettes/invoices/single_param_find_by_hash.yml +14 -16
  143. data/spec/vcr_cassettes/orders/all.yml +19 -113
  144. data/spec/vcr_cassettes/orders/filter_hit.yml +14 -20
  145. data/spec/vcr_cassettes/orders/filter_invalid.yml +10 -12
  146. data/spec/vcr_cassettes/orders/find_by_hash_failure.yml +10 -12
  147. data/spec/vcr_cassettes/orders/find_failure.yml +10 -12
  148. data/spec/vcr_cassettes/orders/find_id_1.yml +17 -17
  149. data/spec/vcr_cassettes/orders/find_new.yml +16 -18
  150. data/spec/vcr_cassettes/orders/housework_invalid_tax_reduction_type.yml +11 -13
  151. data/spec/vcr_cassettes/orders/housework_othercoses_invalid.yml +11 -13
  152. data/spec/vcr_cassettes/orders/housework_type_babysitting.yml +15 -16
  153. data/spec/vcr_cassettes/orders/housework_type_cleaning.yml +15 -16
  154. data/spec/vcr_cassettes/orders/housework_type_construction.yml +15 -16
  155. data/spec/vcr_cassettes/orders/housework_type_cooking.yml +11 -13
  156. data/spec/vcr_cassettes/orders/housework_type_electricity.yml +15 -16
  157. data/spec/vcr_cassettes/orders/housework_type_gardening.yml +15 -16
  158. data/spec/vcr_cassettes/orders/housework_type_glassmetalwork.yml +15 -16
  159. data/spec/vcr_cassettes/orders/housework_type_grounddrainagework.yml +15 -16
  160. data/spec/vcr_cassettes/orders/housework_type_hvac.yml +15 -16
  161. data/spec/vcr_cassettes/orders/housework_type_itservices.yml +15 -16
  162. data/spec/vcr_cassettes/orders/housework_type_majorappliancerepair.yml +15 -16
  163. data/spec/vcr_cassettes/orders/housework_type_masonry.yml +15 -16
  164. data/spec/vcr_cassettes/orders/housework_type_movingservices.yml +15 -16
  165. data/spec/vcr_cassettes/orders/housework_type_othercare.yml +15 -16
  166. data/spec/vcr_cassettes/orders/housework_type_othercosts.yml +15 -16
  167. data/spec/vcr_cassettes/orders/housework_type_paintingwallpapering.yml +15 -16
  168. data/spec/vcr_cassettes/orders/housework_type_snowplowing.yml +15 -16
  169. data/spec/vcr_cassettes/orders/housework_type_textileclothing.yml +15 -16
  170. data/spec/vcr_cassettes/orders/housework_type_tutoring.yml +11 -13
  171. data/spec/vcr_cassettes/orders/multi_param_find_by_hash.yml +13 -15
  172. data/spec/vcr_cassettes/orders/save_new.yml +16 -18
  173. data/spec/vcr_cassettes/orders/save_old.yml +16 -18
  174. data/spec/vcr_cassettes/orders/save_with_nested_model.yml +15 -16
  175. data/spec/vcr_cassettes/orders/search_by_name.yml +13 -17
  176. data/spec/vcr_cassettes/orders/search_miss.yml +10 -12
  177. data/spec/vcr_cassettes/orders/search_with_special_char.yml +10 -12
  178. data/spec/vcr_cassettes/orders/single_param_find_by_hash.yml +14 -16
  179. data/spec/vcr_cassettes/projects/all.yml +14 -37
  180. data/spec/vcr_cassettes/projects/find_by_hash_failure.yml +10 -12
  181. data/spec/vcr_cassettes/projects/find_failure.yml +10 -12
  182. data/spec/vcr_cassettes/projects/find_id_1.yml +13 -15
  183. data/spec/vcr_cassettes/projects/find_new.yml +14 -16
  184. data/spec/vcr_cassettes/projects/multi_param_find_by_hash.yml +15 -16
  185. data/spec/vcr_cassettes/projects/save_new.yml +13 -15
  186. data/spec/vcr_cassettes/projects/save_old.yml +14 -16
  187. data/spec/vcr_cassettes/projects/single_param_find_by_hash.yml +12 -14
  188. data/spec/vcr_cassettes/termsofpayments/all.yml +16 -23
  189. data/spec/vcr_cassettes/termsofpayments/find_failure.yml +10 -12
  190. data/spec/vcr_cassettes/termsofpayments/find_id_1.yml +13 -16
  191. data/spec/vcr_cassettes/termsofpayments/find_new.yml +12 -14
  192. data/spec/vcr_cassettes/termsofpayments/save_new.yml +12 -14
  193. data/spec/vcr_cassettes/termsofpayments/save_old.yml +12 -14
  194. data/spec/vcr_cassettes/units/all.yml +13 -24
  195. data/spec/vcr_cassettes/units/find_failure.yml +10 -12
  196. data/spec/vcr_cassettes/units/find_id_1.yml +13 -15
  197. data/spec/vcr_cassettes/units/find_new.yml +12 -14
  198. data/spec/vcr_cassettes/units/save_new.yml +12 -14
  199. data/spec/vcr_cassettes/units/save_old.yml +12 -14
  200. data/spec/vcr_cassettes/units/save_with_specially_named_attribute.yml +12 -14
  201. metadata +39 -230
  202. data/lib/fortnox/api/circular_queue.rb +0 -39
  203. data/spec/fortnox/api/circular_queue_spec.rb +0 -52
  204. data/spec/support/helpers/when_performing_helper.rb +0 -7
  205. data/temp.txt +0 -1
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 345228c827e624083ca2557504b5c426f3e4719a9252e35bb31d87e44fe9f7f7
4
- data.tar.gz: 3b9fc903f0f5dc8b7e98ae5610af503dd09c6cc218af6c7339e197de23c39e08
3
+ metadata.gz: 843c49685ec54b6f9e9adb7f5a16a67dc827f0d7b5e58b3d8bd8bd9fccced0db
4
+ data.tar.gz: 306a7d66d0b820cc8250b887d14362a7117e8aebbffae5449ba277f30013a06d
5
5
  SHA512:
6
- metadata.gz: 8f74bbe0e82253b3addac22a96fc2cde1892ff8b2d0a48bab032b3b7306bb6e215646b2e365622f9671eeecc90167531b7fa9dc92227b83e4dfd6aaefe04f202
7
- data.tar.gz: 0f1f3b7a1702950973bdd23d4bda90fdfb03ac2532031067f15f84d4abf6d2f629a7bda54cc2a405e868629627785a722c4f32dd5d719f3f6f36d5593cbc39da
6
+ metadata.gz: 1da53b39993c540c59290b111cf30b7ed99b84da62606462671fe178a342dd136f0e64ad552646c2f66d3091088b5a1961c77f9bf18a16e655e9fdfff360bc8f
7
+ data.tar.gz: 293879cf697a4c9fde27fa6fa8e89d2f59d082bd983a00ee5c8b345bc5864a231c61dc4bb256e424d3c721706dd01f851c88ef886b7d8b611e34481a2558ccfe
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
@@ -3,6 +3,7 @@ require: rubocop-rspec
3
3
  AllCops:
4
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/.travis.yml CHANGED
@@ -1,7 +1,8 @@
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
7
  - 2.7.7
7
8
  - 3.0.5
@@ -13,18 +14,18 @@ notifications:
13
14
  secure: UEYDtwLaQgAoMRY7ct1y0Uu5HbInMwrLo+TiYRc3rjDrzqDfDyInEr3bpckyPJ79lnzccrFezMdY4jWzRjmsvQzvYMu+DWJ1mAWOa/9Ws4YZ8nHd5KqXxVQ0EqPWuWwMOyOdyy3DK/MjUOobGSc0//Pv5DeaAAEBKLJzN+e1BQM=
14
15
  email: false
15
16
  before_install:
16
- - gem update --system
17
- - gem install bundler
17
+ - gem update --system
18
+ - gem install bundler
18
19
  cache: bundler
19
20
  before_script:
20
- - curl -L https://codeclimate.com/downloads/test-reporter/test-reporter-latest-linux-amd64
21
- > ./cc-test-reporter
22
- - chmod +x ./cc-test-reporter
23
- - "./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"
24
25
  script:
25
- - bundle exec rspec
26
+ - bundle exec rspec
26
27
  after_script:
27
- - "./cc-test-reporter after-build --exit-code $TRAVIS_TEST_RESULT"
28
+ - "./cc-test-reporter after-build --exit-code $TRAVIS_TEST_RESULT"
28
29
  branches:
29
30
  only:
30
31
  - master
data/CHANGELOG.md CHANGED
@@ -6,20 +6,32 @@ The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/)
6
6
  and this project adheres to
7
7
  [Semantic Versioning](http://semver.org/spec/v2.0.0.html).
8
8
 
9
- ## [0.8.2]
9
+ ## [Unreleased]
10
10
 
11
- ### Fixed
12
- - Restored undocumented support for string keys in model attributes,
13
- which was inadvertently removed in `v0.8.1`.
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
14
20
 
15
- ## [0.8.1]
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.
16
26
 
17
27
  ### Fixed
18
28
 
19
- - Missing runtime dependencies dry-configurable and dry-container is added.
29
+ - Missing runtime dependencies `dry-configurable` and `dry-container` is added.
20
30
  Those were indirect dependencies before via other dry libs, but we use them
21
31
  explicitly in the gem, so they should be included as real dependencies. Also,
22
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).
23
35
 
24
36
  ### Removed
25
37
 
@@ -27,6 +39,10 @@ and this project adheres to
27
39
  - Token rotation is removed since Fortnox counts rate limit on tenant and client
28
40
  id. Before, you could get around this by using multiple access tokens. That's
29
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`.
30
46
 
31
47
  ## [0.8.0]
32
48
 
@@ -80,8 +96,6 @@ and this project adheres to
80
96
 
81
97
  - Model attribute `url` is no longer null
82
98
 
83
- [0.8.2]: https://github.com/accodeing/fortnox-api/compare/v0.8.1...v0.8.2
84
- [0.8.1]: https://github.com/accodeing/fortnox-api/compare/v0.8.0...v0.8.1
85
99
  [0.8.0]: https://github.com/accodeing/fortnox-api/compare/v0.7.2...v0.8.0
86
100
  [0.7.2]: https://github.com/accodeing/fortnox-api/compare/v0.7.1...v0.7.2
87
101
  [0.7.1]: https://github.com/accodeing/fortnox-api/compare/v0.7.0...v0.7.1
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