fortnox-api 0.7.2 → 0.8.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (201) hide show
  1. checksums.yaml +4 -4
  2. data/.codeclimate.yml +1 -0
  3. data/.rubocop.yml +1 -1
  4. data/.tool-versions +1 -0
  5. data/.travis.yml +5 -10
  6. data/CHANGELOG.md +45 -1
  7. data/README.md +7 -4
  8. data/Rakefile +5 -0
  9. data/fortnox-api.gemspec +22 -17
  10. data/lib/fortnox/api/mappers/article.rb +1 -1
  11. data/lib/fortnox/api/mappers/base/from_json.rb +3 -3
  12. data/lib/fortnox/api/mappers/base/to_json.rb +2 -2
  13. data/lib/fortnox/api/mappers/base.rb +3 -3
  14. data/lib/fortnox/api/mappers/customer.rb +1 -1
  15. data/lib/fortnox/api/mappers/default_delivery_types.rb +1 -1
  16. data/lib/fortnox/api/mappers/default_templates.rb +1 -1
  17. data/lib/fortnox/api/mappers/edi_information.rb +1 -1
  18. data/lib/fortnox/api/mappers/email_information.rb +1 -1
  19. data/lib/fortnox/api/mappers/invoice.rb +4 -4
  20. data/lib/fortnox/api/mappers/invoice_row.rb +1 -1
  21. data/lib/fortnox/api/mappers/order.rb +4 -4
  22. data/lib/fortnox/api/mappers/order_row.rb +1 -1
  23. data/lib/fortnox/api/mappers/project.rb +1 -1
  24. data/lib/fortnox/api/mappers/terms_of_payment.rb +1 -1
  25. data/lib/fortnox/api/mappers/unit.rb +1 -1
  26. data/lib/fortnox/api/mappers/value/country_string.rb +1 -1
  27. data/lib/fortnox/api/mappers.rb +18 -18
  28. data/lib/fortnox/api/models/article.rb +2 -2
  29. data/lib/fortnox/api/models/base.rb +14 -14
  30. data/lib/fortnox/api/models/customer.rb +2 -2
  31. data/lib/fortnox/api/models/document.rb +5 -2
  32. data/lib/fortnox/api/models/invoice.rb +2 -2
  33. data/lib/fortnox/api/models/label.rb +1 -1
  34. data/lib/fortnox/api/models/order.rb +2 -2
  35. data/lib/fortnox/api/models/project.rb +2 -2
  36. data/lib/fortnox/api/models/terms_of_payment.rb +2 -2
  37. data/lib/fortnox/api/models/unit.rb +2 -2
  38. data/lib/fortnox/api/models.rb +7 -7
  39. data/lib/fortnox/api/repositories/article.rb +3 -3
  40. data/lib/fortnox/api/repositories/base.rb +4 -3
  41. data/lib/fortnox/api/repositories/customer.rb +3 -3
  42. data/lib/fortnox/api/repositories/invoice.rb +3 -3
  43. data/lib/fortnox/api/repositories/order.rb +3 -3
  44. data/lib/fortnox/api/repositories/project.rb +3 -3
  45. data/lib/fortnox/api/repositories/terms_of_payment.rb +3 -3
  46. data/lib/fortnox/api/repositories/unit.rb +3 -3
  47. data/lib/fortnox/api/repositories.rb +7 -7
  48. data/lib/fortnox/api/types/default_delivery_types.rb +0 -2
  49. data/lib/fortnox/api/types/default_templates.rb +0 -2
  50. data/lib/fortnox/api/types/edi_information.rb +0 -2
  51. data/lib/fortnox/api/types/email_information.rb +0 -2
  52. data/lib/fortnox/api/types/enums.rb +36 -8
  53. data/lib/fortnox/api/types/invoice_row.rb +1 -1
  54. data/lib/fortnox/api/types/model.rb +4 -6
  55. data/lib/fortnox/api/types/nullable.rb +13 -9
  56. data/lib/fortnox/api/types/order_row.rb +1 -1
  57. data/lib/fortnox/api/types/required.rb +3 -3
  58. data/lib/fortnox/api/types/sized.rb +2 -2
  59. data/lib/fortnox/api/types.rb +23 -23
  60. data/lib/fortnox/api/version.rb +1 -1
  61. data/lib/fortnox/api.rb +18 -16
  62. data/spec/fortnox/api/circular_queue_spec.rb +3 -3
  63. data/spec/fortnox/api/mappers/base/canonical_name_sym_spec.rb +9 -7
  64. data/spec/fortnox/api/mappers/default_delivery_types_spec.rb +1 -1
  65. data/spec/fortnox/api/mappers/examples/mapper.rb +1 -1
  66. data/spec/fortnox/api/models/base_spec.rb +8 -8
  67. data/spec/fortnox/api/repositories/article_spec.rb +2 -2
  68. data/spec/fortnox/api/repositories/base_spec.rb +4 -12
  69. data/spec/fortnox/api/repositories/customer_spec.rb +1 -1
  70. data/spec/fortnox/api/repositories/invoice_spec.rb +13 -19
  71. data/spec/fortnox/api/repositories/project_spec.rb +1 -1
  72. data/spec/fortnox/api/repositories/terms_of_payment_spec.rb +2 -2
  73. data/spec/fortnox/api/repositories/unit_spec.rb +3 -3
  74. data/spec/fortnox/api/types/enums_spec.rb +1 -0
  75. data/spec/fortnox/api/types/housework_types_spec.rb +122 -34
  76. data/spec/fortnox/api/types/model_spec.rb +11 -17
  77. data/spec/fortnox/api/types/nullable_spec.rb +30 -10
  78. data/spec/fortnox/api/types/required_spec.rb +1 -4
  79. data/spec/support/matchers/type/enum_matcher.rb +1 -1
  80. data/spec/support/matchers/type/have_account_number_matcher.rb +1 -1
  81. data/spec/support/matchers/type/have_email_matcher.rb +1 -1
  82. data/spec/support/matchers/type/have_nullable_date_matcher.rb +5 -5
  83. data/spec/support/matchers/type/have_nullable_string_matcher.rb +3 -3
  84. data/spec/vcr_cassettes/articles/all.yml +43 -17
  85. data/spec/vcr_cassettes/articles/find_by_hash_failure.yml +34 -15
  86. data/spec/vcr_cassettes/articles/find_failure.yml +34 -15
  87. data/spec/vcr_cassettes/articles/find_id_1.yml +35 -16
  88. data/spec/vcr_cassettes/articles/find_new.yml +37 -18
  89. data/spec/vcr_cassettes/articles/multi_param_find_by_hash.yml +34 -15
  90. data/spec/vcr_cassettes/articles/save_new.yml +35 -15
  91. data/spec/vcr_cassettes/articles/save_old.yml +37 -18
  92. data/spec/vcr_cassettes/articles/save_with_specially_named_attribute.yml +35 -15
  93. data/spec/vcr_cassettes/articles/search_by_name.yml +34 -15
  94. data/spec/vcr_cassettes/articles/search_miss.yml +34 -15
  95. data/spec/vcr_cassettes/articles/search_with_special_char.yml +34 -15
  96. data/spec/vcr_cassettes/articles/single_param_find_by_hash.yml +38 -18
  97. data/spec/vcr_cassettes/customers/all.yml +36 -17
  98. data/spec/vcr_cassettes/customers/find_by_hash_failure.yml +34 -15
  99. data/spec/vcr_cassettes/customers/find_failure.yml +34 -15
  100. data/spec/vcr_cassettes/customers/find_id_1.yml +34 -15
  101. data/spec/vcr_cassettes/customers/find_new.yml +36 -17
  102. data/spec/vcr_cassettes/customers/multi_param_find_by_hash.yml +34 -15
  103. data/spec/vcr_cassettes/customers/save_new.yml +34 -14
  104. data/spec/vcr_cassettes/customers/save_new_with_country_code_SE.yml +30 -20
  105. data/spec/vcr_cassettes/customers/save_old.yml +36 -17
  106. data/spec/vcr_cassettes/customers/save_with_specially_named_attribute.yml +34 -14
  107. data/spec/vcr_cassettes/customers/search_by_name.yml +38 -16
  108. data/spec/vcr_cassettes/customers/search_miss.yml +34 -15
  109. data/spec/vcr_cassettes/customers/search_with_special_char.yml +34 -15
  110. data/spec/vcr_cassettes/customers/single_param_find_by_hash.yml +34 -15
  111. data/spec/vcr_cassettes/invoices/all.yml +39 -17
  112. data/spec/vcr_cassettes/invoices/filter_hit.yml +34 -15
  113. data/spec/vcr_cassettes/invoices/filter_invalid.yml +33 -13
  114. data/spec/vcr_cassettes/invoices/find_by_hash_failure.yml +34 -15
  115. data/spec/vcr_cassettes/invoices/find_failure.yml +34 -15
  116. data/spec/vcr_cassettes/invoices/find_id_1.yml +36 -17
  117. data/spec/vcr_cassettes/invoices/find_new.yml +39 -20
  118. data/spec/vcr_cassettes/invoices/multi_param_find_by_hash.yml +34 -15
  119. data/spec/vcr_cassettes/invoices/save_new.yml +37 -17
  120. data/spec/vcr_cassettes/invoices/save_new_with_comments.yml +37 -17
  121. data/spec/vcr_cassettes/invoices/save_new_with_country.yml +32 -22
  122. data/spec/vcr_cassettes/invoices/save_new_with_country_GB.yml +33 -23
  123. data/spec/vcr_cassettes/invoices/save_new_with_country_Norge.yml +32 -22
  124. data/spec/vcr_cassettes/invoices/save_new_with_country_Norway.yml +32 -22
  125. data/spec/vcr_cassettes/invoices/save_new_with_country_Sverige.yml +32 -22
  126. data/spec/vcr_cassettes/invoices/save_new_with_country_VA.yml +33 -23
  127. data/spec/vcr_cassettes/invoices/save_new_with_country_VI.yml +33 -23
  128. data/spec/vcr_cassettes/invoices/save_new_with_country_empty_string.yml +32 -22
  129. data/spec/vcr_cassettes/invoices/save_new_with_country_nil.yml +32 -22
  130. data/spec/vcr_cassettes/invoices/save_old.yml +39 -20
  131. data/spec/vcr_cassettes/invoices/save_old_with_empty_comments.yml +39 -20
  132. data/spec/vcr_cassettes/invoices/save_old_with_empty_country.yml +34 -25
  133. data/spec/vcr_cassettes/invoices/save_old_with_nil_comments.yml +39 -20
  134. data/spec/vcr_cassettes/invoices/save_old_with_nil_country.yml +34 -25
  135. data/spec/vcr_cassettes/invoices/save_with_nested_model.yml +36 -16
  136. data/spec/vcr_cassettes/invoices/save_with_specially_named_attribute.yml +36 -16
  137. data/spec/vcr_cassettes/invoices/search_by_name.yml +34 -15
  138. data/spec/vcr_cassettes/invoices/search_miss.yml +34 -15
  139. data/spec/vcr_cassettes/invoices/search_with_special_char.yml +34 -15
  140. data/spec/vcr_cassettes/invoices/single_param_find_by_hash.yml +34 -15
  141. data/spec/vcr_cassettes/orders/all.yml +35 -16
  142. data/spec/vcr_cassettes/orders/filter_hit.yml +34 -15
  143. data/spec/vcr_cassettes/orders/filter_invalid.yml +33 -13
  144. data/spec/vcr_cassettes/orders/find_by_hash_failure.yml +34 -15
  145. data/spec/vcr_cassettes/orders/find_failure.yml +34 -15
  146. data/spec/vcr_cassettes/orders/find_id_1.yml +35 -16
  147. data/spec/vcr_cassettes/orders/find_new.yml +38 -19
  148. data/spec/vcr_cassettes/orders/housework_invalid_tax_reduction_type.yml +63 -0
  149. data/spec/vcr_cassettes/orders/housework_othercoses_invalid.yml +63 -0
  150. data/spec/vcr_cassettes/orders/housework_type_babysitting.yml +37 -17
  151. data/spec/vcr_cassettes/orders/housework_type_cleaning.yml +37 -17
  152. data/spec/vcr_cassettes/orders/housework_type_construction.yml +37 -17
  153. data/spec/vcr_cassettes/orders/housework_type_cooking.yml +34 -14
  154. data/spec/vcr_cassettes/orders/housework_type_electricity.yml +37 -17
  155. data/spec/vcr_cassettes/orders/housework_type_gardening.yml +37 -17
  156. data/spec/vcr_cassettes/orders/housework_type_glassmetalwork.yml +37 -17
  157. data/spec/vcr_cassettes/orders/housework_type_grounddrainagework.yml +37 -17
  158. data/spec/vcr_cassettes/orders/housework_type_hvac.yml +37 -17
  159. data/spec/vcr_cassettes/orders/housework_type_itservices.yml +66 -0
  160. data/spec/vcr_cassettes/orders/housework_type_majorappliancerepair.yml +66 -0
  161. data/spec/vcr_cassettes/orders/housework_type_masonry.yml +37 -17
  162. data/spec/vcr_cassettes/orders/housework_type_movingservices.yml +66 -0
  163. data/spec/vcr_cassettes/orders/housework_type_othercare.yml +37 -17
  164. data/spec/vcr_cassettes/orders/housework_type_othercosts.yml +37 -17
  165. data/spec/vcr_cassettes/orders/housework_type_paintingwallpapering.yml +37 -17
  166. data/spec/vcr_cassettes/orders/housework_type_snowplowing.yml +37 -17
  167. data/spec/vcr_cassettes/orders/housework_type_textileclothing.yml +37 -17
  168. data/spec/vcr_cassettes/orders/housework_type_tutoring.yml +34 -14
  169. data/spec/vcr_cassettes/orders/multi_param_find_by_hash.yml +34 -15
  170. data/spec/vcr_cassettes/orders/save_new.yml +36 -16
  171. data/spec/vcr_cassettes/orders/save_old.yml +38 -19
  172. data/spec/vcr_cassettes/orders/save_with_nested_model.yml +36 -16
  173. data/spec/vcr_cassettes/orders/search_by_name.yml +34 -15
  174. data/spec/vcr_cassettes/orders/search_miss.yml +34 -15
  175. data/spec/vcr_cassettes/orders/search_with_special_char.yml +34 -15
  176. data/spec/vcr_cassettes/orders/single_param_find_by_hash.yml +34 -15
  177. data/spec/vcr_cassettes/projects/all.yml +58 -33
  178. data/spec/vcr_cassettes/projects/find_by_hash_failure.yml +34 -15
  179. data/spec/vcr_cassettes/projects/find_failure.yml +34 -15
  180. data/spec/vcr_cassettes/projects/find_id_1.yml +34 -15
  181. data/spec/vcr_cassettes/projects/find_new.yml +37 -18
  182. data/spec/vcr_cassettes/projects/multi_param_find_by_hash.yml +36 -17
  183. data/spec/vcr_cassettes/projects/save_new.yml +35 -15
  184. data/spec/vcr_cassettes/projects/save_old.yml +37 -18
  185. data/spec/vcr_cassettes/projects/single_param_find_by_hash.yml +36 -17
  186. data/spec/vcr_cassettes/termsofpayments/all.yml +46 -25
  187. data/spec/vcr_cassettes/termsofpayments/find_failure.yml +34 -15
  188. data/spec/vcr_cassettes/termsofpayments/find_id_1.yml +35 -16
  189. data/spec/vcr_cassettes/termsofpayments/find_new.yml +36 -17
  190. data/spec/vcr_cassettes/termsofpayments/save_new.yml +35 -15
  191. data/spec/vcr_cassettes/termsofpayments/save_old.yml +36 -17
  192. data/spec/vcr_cassettes/units/all.yml +45 -22
  193. data/spec/vcr_cassettes/units/find_failure.yml +34 -15
  194. data/spec/vcr_cassettes/units/find_id_1.yml +35 -16
  195. data/spec/vcr_cassettes/units/find_new.yml +36 -17
  196. data/spec/vcr_cassettes/units/save_new.yml +35 -15
  197. data/spec/vcr_cassettes/units/save_old.yml +36 -17
  198. data/spec/vcr_cassettes/units/save_with_specially_named_attribute.yml +35 -15
  199. metadata +115 -43
  200. data/spec/support/helpers/dummy_class_helper.rb +0 -38
  201. data/spec/vcr_cassettes/invoices/save_new_with_country_KR.yml +0 -57
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 707b9b050edd8499029c1f2120d11edc923e868847657eb0c108789014a5e3c8
4
- data.tar.gz: 7da764b991529e720f3afbbb01433da52ca4f34800951b05c4f0f1e11f646c6a
3
+ metadata.gz: 7d28f8cb3667dac63023e514d6c5203ba795a8c1c2598bbf538e49f58528cbc1
4
+ data.tar.gz: 127841e8b5d6a64d2b37408960e9659da918fcc9135d821098d281d508e337ca
5
5
  SHA512:
6
- metadata.gz: 075e852a210ad2313fcf1c4469cb54a857016d46963e353679f16ea9e5daf09b28857491d9ccdc9b20c2a6843d7bc79093122db5419cf4219f1d830665af27b4
7
- data.tar.gz: 35f8989ec19be2bf69c4f703daf54feb8b7d09e4c6bec95455c3483b23e4f8aa74547f781f2874c39d8903761feb769474bba0795ac2b3a21142a27b4ca706dc
6
+ metadata.gz: 4a9557fb4ecacf5d545c26d8894953793268b37a3c8a603a8095e239536d97871712140a6c3bc1f0596708913f369584633fee7e903a3f8ae4be99c47297418d
7
+ data.tar.gz: 244727089a11d031ec9e8afafa93d80c4b3ee87d1eb9c7f6ff57a8d26751d78304bc34073c095328f61edc580abeff44dba3f275e28346dea024b292e114126a
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/.rubocop.yml CHANGED
@@ -1,7 +1,7 @@
1
1
  require: rubocop-rspec
2
2
 
3
3
  AllCops:
4
- TargetRubyVersion: 2.3
4
+ TargetRubyVersion: 2.7
5
5
  DisplayCopNames: true
6
6
 
7
7
  RSpec/FilePath:
data/.tool-versions ADDED
@@ -0,0 +1 @@
1
+ ruby 3.2.0
data/.travis.yml CHANGED
@@ -3,16 +3,11 @@ env:
3
3
  - CC_TEST_REPORTER_ID=43ea0acb059b164537ce31bf67e03e1cb552d63df1ad3e9bd95dc3d844697bb4
4
4
  language: ruby
5
5
  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
6
+ - 2.7.7
7
+ - 3.0.5
8
+ - 3.1.3
9
+ - 3.2.0
10
+
16
11
  notifications:
17
12
  slack:
18
13
  secure: UEYDtwLaQgAoMRY7ct1y0Uu5HbInMwrLo+TiYRc3rjDrzqDfDyInEr3bpckyPJ79lnzccrFezMdY4jWzRjmsvQzvYMu+DWJ1mAWOa/9Ws4YZ8nHd5KqXxVQ0EqPWuWwMOyOdyy3DK/MjUOobGSc0//Pv5DeaAAEBKLJzN+e1BQM=
data/CHANGELOG.md CHANGED
@@ -1,37 +1,81 @@
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
+ ## [0.8.1]
10
+
11
+ ### Fixed
12
+
13
+ - Missing runtime dependencies dry-configurable and dry-container is added.
14
+ Those were indirect dependencies before via other dry libs, but we use them
15
+ explicitly in the gem, so they should be included as real dependencies. Also,
16
+ newer versions of these gems did actually break the gem.
17
+
18
+ ### Removed
19
+
20
+ - **Breaking** Drops support for Ruby 2.6 since it's reached end of life
21
+ - Token rotation is removed since Fortnox counts rate limit on tenant and client
22
+ id. Before, you could get around this by using multiple access tokens. That's
23
+ not possible anymore, so token rotation is simply removed.
24
+
25
+ ## [0.8.0]
26
+
27
+ ### Changed
28
+
29
+ - `Fortnox::API::CURRENT_HOUSEWORK_TYPES` is now renamed to `HOUSEWORK_TYPES`
30
+ and is instead a Hash with keys for the different categories of types. It also
31
+ includes legacy types, which means `Fortnox::API::LEGACY_HOUSEWORK_TYPES` is
32
+ removed.
33
+
34
+ ### Removed
35
+
36
+ - Drops support for Ruby < `2.5.0` since they are deprecated
6
37
 
7
38
  ## [0.7.2]
39
+
8
40
  ### Fixed
41
+
9
42
  - Invalid validation for Customer's account number attribute
10
43
 
11
44
  ## [0.7.1]
45
+
12
46
  ### Fixed
47
+
13
48
  - Invalid validation for Customer's country attributes
14
49
 
15
50
  ## [0.7.0]
51
+
16
52
  ### Added
53
+
17
54
  - Adds build test for Ruby `2.6.0`, `2.6.3` and `2.7.0-preview`.
18
55
 
19
56
  ### Removed
57
+
20
58
  - Drops support for Ruby < `2.4.0` since they are deprecated
21
59
 
22
60
  ### Fixed
61
+
23
62
  - Country attribute for `Invoice` and `Order` is now validated correctly.
24
63
  - Fixes deprecation warnings
25
64
  - Unlocks pinned `HTTParty` version
26
65
  - Invalid email validation
27
66
 
28
67
  ## [0.6.3]
68
+
29
69
  ### Changed
70
+
30
71
  - Pins `dry-types` to `< 0.13.0` due to breaking changes
31
72
 
32
73
  ### Fixed
74
+
33
75
  - Model attribute `url` is no longer null
34
76
 
77
+ [0.8.1]: https://github.com/accodeing/fortnox-api/compare/v0.8.0...v0.8.1
78
+ [0.8.0]: https://github.com/accodeing/fortnox-api/compare/v0.7.2...v0.8.0
35
79
  [0.7.2]: https://github.com/accodeing/fortnox-api/compare/v0.7.1...v0.7.2
36
80
  [0.7.1]: https://github.com/accodeing/fortnox-api/compare/v0.7.0...v0.7.1
37
81
  [0.7.0]: https://github.com/accodeing/fortnox-api/compare/v0.6.3...v0.7.0
data/README.md CHANGED
@@ -10,14 +10,13 @@
10
10
  [![Maintainability](https://api.codeclimate.com/v1/badges/89d30a43fedf210d470b/maintainability)](https://codeclimate.com/github/accodeing/fortnox-api/maintainability)
11
11
  [![Test Coverage](https://api.codeclimate.com/v1/badges/89d30a43fedf210d470b/test_coverage)](https://codeclimate.com/github/accodeing/fortnox-api/test_coverage)
12
12
 
13
- The rough status of this project is as follows (as of October 2018):
13
+ The rough status of this project is as follows (as of December 2020):
14
14
  * Development is not as active as it used to be, but the project is not forgotten. We have an app running this gem in production and it works like a charm for what we do.
15
- * We are planning on generalize REST API's in general with our [rest_easy gem](https://github.com/accodeing/rest_easy).
15
+ * We hope to be able to continue with our work with [rest_easy gem](https://github.com/accodeing/rest_easy), which generalize REST API's in general.
16
16
  * Basic structure complete. Things like getting customers and invoices, updating and saving etc.
17
17
  * Some advanced features implemented, for instance support for multiple Access Tokens and filtering entities.
18
18
  * We have ideas for more advanced features, like sorting entities, pagination of results but nothing in the pipeline right now.
19
19
  * A few models implemented. Right now we pretty good support for `Customer`, `Invoice`, `Order`, `Article`, `Label` and `Project`. Adding more models in general is quick and easy (that's the whole point with this gem), see the developer guide further down.
20
- * Massive refactorings no longer occurs weekly :)
21
20
 
22
21
  # Architecture overview
23
22
  The gem is structured with distinct models for the tasks of data, JSON mapping and saving state. These are called: model, type, mapper and repository.
@@ -81,7 +80,7 @@ These are responsible for the mapping between our plain old Ruby object models a
81
80
 
82
81
  # Requirements
83
82
 
84
- This gem is build for Ruby 2.4 or higher (see Travis configuration file for what versions we are testing against).
83
+ This gem is built for Ruby 2.5 or higher (see Travis configuration file for what versions we are testing against).
85
84
 
86
85
  ## Installation
87
86
 
@@ -191,5 +190,9 @@ updated_customer.name #=> "Ned Stark"
191
190
 
192
191
  The update method takes an implicit hash of attributes to update, so you can update as many as you like in one go.
193
192
 
193
+ # Development
194
+ ## Testing
195
+ This gem has integration tests to verify the code against the real API. It uses [vcr](https://github.com/vcr/vcr) to record API endpoint responses. These responses are stored locally and are called vcr cassettes. If no cassettes are available, vcr will record new ones for you. Once in a while, it's good to throw away all cassettes and rerecord them. Fortnox updates their endpoints and we need to keep our code up to date with the reality. There's a handy rake task for removing all cassettes, see `rake -T`. Note that when rerecording all cassettes, do it one repository at a time, otherwise you'll definitely get `429 Too Many Requests` from Fortnox. Run them manually with something like `bundle exec rspec spec/fortnox/api/repositories/article_spec.rb`. Also, you will need to update some test data in specs, see notes in specs.
196
+
194
197
  # Contributing
195
198
  See the [CONTRIBUTE](CONTRIBUTE.md) readme.
data/Rakefile CHANGED
@@ -5,3 +5,8 @@ require 'rspec/core/rake_task'
5
5
  RSpec::Core::RakeTask.new(:spec)
6
6
 
7
7
  task default: :spec
8
+
9
+ desc 'Remove all VCR cassettes so we can rerecord them'
10
+ task :throw_vcr_cassettes do
11
+ FileUtils.rm_rf(Dir.glob('spec/vcr_cassettes/**'))
12
+ end
data/fortnox-api.gemspec CHANGED
@@ -3,12 +3,12 @@
3
3
 
4
4
  lib = File.expand_path('../lib', __FILE__)
5
5
  $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
6
- require 'fortnox/api/version'
6
+ require_relative 'lib/fortnox/api/version'
7
7
 
8
- Gem::Specification.new do |spec| # rubocop:disable Metrics/BlockLength
8
+ Gem::Specification.new do |spec|
9
9
  spec.name = 'fortnox-api'
10
10
  spec.version = Fortnox::API::VERSION
11
- spec.authors = ['Jonas Schubert Erlandsson', 'Hannes Elvemyr', 'Felix Holmgren']
11
+ spec.authors = ['Jonas Schubert Erlandsson', 'Hannes Elvemyr', 'Felix Holmgren', 'Mike Eirih']
12
12
  spec.email = ['info@accodeing.com']
13
13
  spec.summary = 'Gem to use Fortnox REST API in Ruby.'
14
14
  spec.description = 'This gem uses the HTTParty library to abstract away the REST calls. It gives you access to a '\
@@ -23,22 +23,27 @@ Gem::Specification.new do |spec| # rubocop:disable Metrics/BlockLength
23
23
  spec.test_files = spec.files.grep(%r{^(spec)/})
24
24
  spec.require_paths = ['lib']
25
25
 
26
- spec.required_ruby_version = '>= 2.4'
27
- spec.add_dependency 'countries', '~> 3.0'
28
- spec.add_dependency 'dry-struct', '~> 0.1'
29
- spec.add_dependency 'dry-types', '~> 0.8', '< 0.13.0'
26
+ spec.required_ruby_version = '>= 2.7'
27
+ spec.add_dependency 'countries', '~> 5.0'
28
+ spec.add_dependency 'dry-configurable', '~> 1.0'
29
+ spec.add_dependency 'dry-container', '~> 0.10'
30
+ spec.add_dependency 'dry-struct', '~> 1.6'
31
+ spec.add_dependency 'dry-types', '~> 1.7'
30
32
  spec.add_dependency 'httparty', '~> 0.17'
33
+ spec.add_dependency 'jwt', '~> 2.3'
31
34
 
32
- spec.add_development_dependency 'bundler', '~> 2.0'
33
- spec.add_development_dependency 'guard', '~> 2.12'
34
- spec.add_development_dependency 'guard-rspec', '~> 4.5'
35
+ spec.add_development_dependency 'bundler', '~> 2.4'
36
+ spec.add_development_dependency 'dotenv', '~> 2.8'
37
+ spec.add_development_dependency 'guard', '~> 2.18'
38
+ spec.add_development_dependency 'guard-rspec', '~> 4.7'
35
39
  spec.add_development_dependency 'pry', '~> 0'
36
- spec.add_development_dependency 'rake', '~> 10.4'
37
- spec.add_development_dependency 'rspec', '~> 3.2'
40
+ spec.add_development_dependency 'rake', '~> 13.0'
41
+ spec.add_development_dependency 'rspec', '~> 3.12'
38
42
  spec.add_development_dependency 'rspec-collection_matchers', '~> 0'
39
- spec.add_development_dependency 'rubocop', '~> 0.52.0'
40
- spec.add_development_dependency 'rubocop-rspec', '~> 1.22.2'
41
- spec.add_development_dependency 'simplecov', '~> 0.15'
42
- spec.add_development_dependency 'vcr', '~> 4.0'
43
- spec.add_development_dependency 'webmock', '~> 3.5'
43
+ spec.add_development_dependency 'rubocop', '~> 1.39.0'
44
+ spec.add_development_dependency 'rubocop-rspec', '~> 2.16.0'
45
+ spec.add_development_dependency 'simplecov', '~> 0.22'
46
+ spec.add_development_dependency 'timecop', '~> 0.9.6'
47
+ spec.add_development_dependency 'vcr', '~> 6.1'
48
+ spec.add_development_dependency 'webmock', '~> 3.18'
44
49
  end
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'fortnox/api/mappers/base'
3
+ require_relative 'base'
4
4
 
5
5
  module Fortnox
6
6
  module API
@@ -50,7 +50,7 @@ module Fortnox
50
50
 
51
51
  raise MissingModelOrMapperException, message if ENV['RUBY_ENV']
52
52
  Fortnox::API.logger.warn("Missing Model or Mapper implementation for #{key} with attributes: #{collection}")
53
- return convert_hash_keys_from_json_format(collection, {})
53
+ convert_hash_keys_from_json_format(collection, {})
54
54
  end
55
55
  end
56
56
 
@@ -72,8 +72,8 @@ module Fortnox
72
72
 
73
73
  def default_key_from_json_transform(key)
74
74
  key = key.to_s
75
- key = camelcase_to_underscore(key) unless key =~ /\A[A-Z]+\z/
76
- key = strip_at_symbol(key) if key =~ /\A@.*\z/
75
+ key = camelcase_to_underscore(key) unless key.match?(/\A[A-Z]+\z/)
76
+ key = strip_at_symbol(key) if key.match?(/\A@.*\z/)
77
77
  key.downcase.to_sym
78
78
  end
79
79
 
@@ -25,8 +25,8 @@ module Fortnox
25
25
  # PRIVATE
26
26
 
27
27
  def convert_hash_keys_to_json_format(hash)
28
- hash.each_with_object({}) do |(key, value), json_hash|
29
- json_hash[convert_key_to_json(key)] = value
28
+ hash.transform_keys do |key|
29
+ convert_key_to_json(key)
30
30
  end
31
31
  end
32
32
 
@@ -1,8 +1,8 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'fortnox/api/mappers/base/canonical_name_sym'
4
- require 'fortnox/api/mappers/base/from_json'
5
- require 'fortnox/api/mappers/base/to_json'
3
+ require_relative 'base/canonical_name_sym'
4
+ require_relative 'base/from_json'
5
+ require_relative 'base/to_json'
6
6
 
7
7
  module Fortnox
8
8
  module API
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'fortnox/api/mappers/base'
3
+ require_relative 'base'
4
4
 
5
5
  module Fortnox
6
6
  module API
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'fortnox/api/mappers/base'
3
+ require_relative 'base'
4
4
 
5
5
  module Fortnox
6
6
  module API
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'fortnox/api/mappers/base'
3
+ require_relative 'base'
4
4
 
5
5
  module Fortnox
6
6
  module API
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'fortnox/api/mappers/base'
3
+ require_relative 'base'
4
4
 
5
5
  module Fortnox
6
6
  module API
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'fortnox/api/mappers/base'
3
+ require_relative 'base'
4
4
 
5
5
  module Fortnox
6
6
  module API
@@ -1,9 +1,9 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'fortnox/api/mappers/base'
4
- require 'fortnox/api/mappers/edi_information'
5
- require 'fortnox/api/mappers/email_information'
6
- require 'fortnox/api/mappers/invoice_row'
3
+ require_relative 'base'
4
+ require_relative 'edi_information'
5
+ require_relative 'email_information'
6
+ require_relative 'invoice_row'
7
7
 
8
8
  module Fortnox
9
9
  module API
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'fortnox/api/mappers/base'
3
+ require_relative 'base'
4
4
 
5
5
  module Fortnox
6
6
  module API
@@ -1,9 +1,9 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'fortnox/api/mappers/base'
4
- require 'fortnox/api/mappers/edi_information'
5
- require 'fortnox/api/mappers/email_information'
6
- require 'fortnox/api/mappers/order_row'
3
+ require_relative 'base'
4
+ require_relative 'edi_information'
5
+ require_relative 'email_information'
6
+ require_relative 'order_row'
7
7
 
8
8
  module Fortnox
9
9
  module API
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'fortnox/api/mappers/base'
3
+ require_relative 'base'
4
4
 
5
5
  module Fortnox
6
6
  module API
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'fortnox/api/mappers/base'
3
+ require_relative 'base'
4
4
 
5
5
  module Fortnox
6
6
  module API
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'fortnox/api/mappers/base'
3
+ require_relative 'base'
4
4
 
5
5
  module Fortnox
6
6
  module API
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'fortnox/api/mappers/base'
3
+ require_relative 'base'
4
4
 
5
5
  module Fortnox
6
6
  module API
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'fortnox/api/mappers/base/canonical_name_sym'
3
+ require_relative '../base/canonical_name_sym'
4
4
 
5
5
  module Fortnox
6
6
  module API
@@ -1,21 +1,21 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'fortnox/api/types'
3
+ require_relative 'types'
4
4
 
5
- require 'fortnox/api/mappers/value/array'
6
- require 'fortnox/api/mappers/value/country_string'
7
- require 'fortnox/api/mappers/value/date'
8
- require 'fortnox/api/mappers/value/hash'
9
- require 'fortnox/api/mappers/value/identity'
10
- require 'fortnox/api/mappers/customer'
11
- require 'fortnox/api/mappers/default_delivery_types'
12
- require 'fortnox/api/mappers/default_templates'
13
- require 'fortnox/api/mappers/edi_information'
14
- require 'fortnox/api/mappers/email_information'
15
- require 'fortnox/api/mappers/invoice_row'
16
- require 'fortnox/api/mappers/invoice'
17
- require 'fortnox/api/mappers/order_row'
18
- require 'fortnox/api/mappers/order'
19
- require 'fortnox/api/mappers/project'
20
- require 'fortnox/api/mappers/unit'
21
- require 'fortnox/api/mappers/terms_of_payment'
5
+ require_relative 'mappers/value/array'
6
+ require_relative 'mappers/value/country_string'
7
+ require_relative 'mappers/value/date'
8
+ require_relative 'mappers/value/hash'
9
+ require_relative 'mappers/value/identity'
10
+ require_relative 'mappers/customer'
11
+ require_relative 'mappers/default_delivery_types'
12
+ require_relative 'mappers/default_templates'
13
+ require_relative 'mappers/edi_information'
14
+ require_relative 'mappers/email_information'
15
+ require_relative 'mappers/invoice_row'
16
+ require_relative 'mappers/invoice'
17
+ require_relative 'mappers/order_row'
18
+ require_relative 'mappers/order'
19
+ require_relative 'mappers/project'
20
+ require_relative 'mappers/unit'
21
+ require_relative 'mappers/terms_of_payment'
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'fortnox/api/types'
4
- require 'fortnox/api/models/base'
3
+ require_relative 'base'
4
+ require_relative '../types'
5
5
 
6
6
  module Fortnox
7
7
  module API
@@ -1,8 +1,9 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'fortnox/api/types'
4
3
  require 'ice_nine'
5
4
 
5
+ require_relative '../types'
6
+
6
7
  module Fortnox
7
8
  module API
8
9
  module Model
@@ -36,6 +37,10 @@ module Fortnox
36
37
  new(self::STUB.dup)
37
38
  end
38
39
 
40
+ def unique_id
41
+ send(self.class::UNIQUE_ID)
42
+ end
43
+
39
44
  # This filtering logic could be improved since it is currently O(N*M).
40
45
  def attributes(*options)
41
46
  return self.class.schema if options.nil?
@@ -47,8 +52,13 @@ module Fortnox
47
52
  end
48
53
  end
49
54
 
50
- def unique_id
51
- send(self.class::UNIQUE_ID)
55
+ def to_hash(recursive = false)
56
+ return super() if recursive
57
+
58
+ self.class.schema.each_with_object({}) do |key, result|
59
+ # Only output attributes that have a value set
60
+ result[key.name] = self[key.name] if self.send("#{key.name}?")
61
+ end
52
62
  end
53
63
 
54
64
  def update(hash)
@@ -85,19 +95,9 @@ module Fortnox
85
95
  @parent || self.class.new(self.class::STUB.dup)
86
96
  end
87
97
 
88
- def to_hash(recursive = false)
89
- return super() if recursive
90
-
91
- self.class.schema.keys.each_with_object({}) do |key, result|
92
- result[key] = self[key]
93
- end
94
- end
95
-
96
- private_class_method
97
-
98
98
  # dry-types filter anything that isn't specified as an attribute on the
99
99
  # class that is being instantiated. This wrapper preserves the meta
100
- # properties we need to track object state during that initilisation and
100
+ # properties we need to track object state during that initialisation and
101
101
  # sets them on the object after dry-types is done with it.
102
102
  def self.preserve_meta_properties(hash)
103
103
  is_unsaved = hash.delete(:unsaved) { true }
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'fortnox/api/types'
4
- require 'fortnox/api/models/base'
3
+ require_relative 'base'
4
+ require_relative '../types'
5
5
 
6
6
  module Fortnox
7
7
  module API
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'fortnox/api/types'
4
- require 'fortnox/api/models/label'
3
+ require_relative '../types'
4
+ require_relative 'label'
5
5
 
6
6
  module Fortnox
7
7
  module API
@@ -154,6 +154,9 @@ module Fortnox
154
154
  # TaxReduction The amount of tax reduction.
155
155
  attribute :tax_reduction, Types::Nullable::Integer.is(:read_only)
156
156
 
157
+ # TaxReductionType Tax Reduction Type
158
+ attribute :tax_reduction_type, Types::TaxReductionType
159
+
157
160
  # TermsOfDelivery Code of the terms of delivery.
158
161
  attribute :terms_of_delivery, Types::Nullable::String
159
162
 
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'fortnox/api/models/base'
4
- require 'fortnox/api/models/document'
3
+ require_relative 'base'
4
+ require_relative 'document'
5
5
 
6
6
  module Fortnox
7
7
  module API
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'fortnox/api/types'
3
+ require_relative '../types'
4
4
 
5
5
  module Fortnox
6
6
  module API
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'fortnox/api/models/base'
4
- require 'fortnox/api/models/document'
3
+ require_relative 'base'
4
+ require_relative 'document'
5
5
 
6
6
  module Fortnox
7
7
  module API
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'fortnox/api/types'
4
- require 'fortnox/api/models/base'
3
+ require_relative 'base'
4
+ require_relative '../types'
5
5
 
6
6
  module Fortnox
7
7
  module API
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'fortnox/api/types'
4
- require 'fortnox/api/models/base'
3
+ require_relative '../types'
4
+ require_relative '../models/base'
5
5
 
6
6
  module Fortnox
7
7
  module API
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'fortnox/api/types'
4
- require 'fortnox/api/models/base'
3
+ require_relative 'base'
4
+ require_relative '../types'
5
5
 
6
6
  module Fortnox
7
7
  module API