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
data/fortnox-api.gemspec CHANGED
@@ -1,44 +1,50 @@
1
-
2
1
  # frozen_string_literal: true
3
2
 
4
- lib = File.expand_path('../lib', __FILE__)
3
+ lib = File.expand_path('lib', __dir__)
5
4
  $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
6
- require 'fortnox/api/version'
5
+ require_relative 'lib/fortnox/api/version'
7
6
 
8
- Gem::Specification.new do |spec| # rubocop:disable Metrics/BlockLength
7
+ Gem::Specification.new do |spec|
9
8
  spec.name = 'fortnox-api'
10
9
  spec.version = Fortnox::API::VERSION
11
- spec.authors = ['Jonas Schubert Erlandsson', 'Hannes Elvemyr', 'Felix Holmgren']
10
+ spec.authors = ['Jonas Schubert Erlandsson', 'Hannes Elvemyr', 'Felix Holmgren', 'Mike Eirih']
12
11
  spec.email = ['info@accodeing.com']
13
12
  spec.summary = 'Gem to use Fortnox REST API in Ruby.'
14
- spec.description = 'This gem uses the HTTParty library to abstract away the REST calls. It gives you access to a '\
15
- 'number of objects that behave a lot like ActiveRecord instances, giving you access to methods '\
16
- 'like `all`, `find`, `find_by_...` and so on. And each individual instance can be easily'\
17
- 'persistable to Fortnox again using the `save` method.'
13
+ spec.description = 'This gem uses the HTTParty library to abstract away the REST calls. It gives you access to a ' \
14
+ 'number of objects that behave a lot like ActiveRecord instances, giving you access to ' \
15
+ 'methods like `all`, `find`, `find_by_...` and so on. And each individual instance can be' \
16
+ 'easily persistable to Fortnox again using the `save` method.'
18
17
  spec.homepage = 'http://github.com/accodeing/fortnox-api'
19
18
  spec.license = 'LGPL-3.0'
19
+ spec.metadata = {
20
+ 'rubygems_mfa_required' => 'true'
21
+ }
20
22
 
21
23
  spec.files = `git ls-files -z`.split("\x0")
22
24
  spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
23
- spec.test_files = spec.files.grep(%r{^(spec)/})
24
25
  spec.require_paths = ['lib']
25
26
 
26
- spec.required_ruby_version = '>= 2.5'
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'
30
- spec.add_dependency 'httparty', '~> 0.17'
27
+ spec.required_ruby_version = '>= 2.7'
28
+ spec.add_dependency 'countries', '~> 5.0'
29
+ spec.add_dependency 'dry-configurable', '~> 1.0'
30
+ spec.add_dependency 'dry-container', '~> 0.10'
31
+ spec.add_dependency 'dry-struct', '~> 1.6'
32
+ spec.add_dependency 'dry-types', '~> 1.7'
33
+ spec.add_dependency 'httparty', '~> 0.21'
34
+ spec.add_dependency 'jwt', '~> 2.3'
31
35
 
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'
36
+ spec.add_development_dependency 'bundler', '~> 2.4'
37
+ spec.add_development_dependency 'dotenv', '~> 2.8'
38
+ spec.add_development_dependency 'guard', '~> 2.18'
39
+ spec.add_development_dependency 'guard-rspec', '~> 4.7'
40
+ spec.add_development_dependency 'guard-rubocop', '~> 1.5'
35
41
  spec.add_development_dependency 'pry', '~> 0'
36
- spec.add_development_dependency 'rake', '>= 12.3.3'
37
- spec.add_development_dependency 'rspec', '~> 3.2'
42
+ spec.add_development_dependency 'rake', '~> 13.0'
43
+ spec.add_development_dependency 'rspec', '~> 3.12'
38
44
  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'
45
+ spec.add_development_dependency 'rubocop', '~> 1.39.0'
46
+ spec.add_development_dependency 'rubocop-rspec', '~> 2.16.0'
47
+ spec.add_development_dependency 'simplecov', '~> 0.22'
48
+ spec.add_development_dependency 'vcr', '~> 6.1'
49
+ spec.add_development_dependency 'webmock', '~> 3.18'
44
50
  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
@@ -4,7 +4,7 @@ module Fortnox
4
4
  module API
5
5
  module Mapper
6
6
  module FromJSON
7
- class MissingModelOrMapperException < StandardError
7
+ class MissingModelOrMapperException < Fortnox::API::Exception
8
8
  end
9
9
 
10
10
  def wrapped_json_collection_to_entities_hash(json_collection_hash)
@@ -45,12 +45,13 @@ module Fortnox
45
45
  # Raise exception during test run if this happens so that we can
46
46
  # add it before a new release.
47
47
 
48
- message = "for #{key} (#{mapper_name}, #{Fortnox::API::Mapper::DefaultTemplates.canonical_name_sym}) with"\
49
- " #{collection}"
48
+ message = "for #{key} (#{mapper_name}, #{Fortnox::API::Mapper::DefaultTemplates.canonical_name_sym}) " \
49
+ "with #{collection}"
50
50
 
51
51
  raise MissingModelOrMapperException, message if ENV['RUBY_ENV']
52
+
52
53
  Fortnox::API.logger.warn("Missing Model or Mapper implementation for #{key} with attributes: #{collection}")
53
- return convert_hash_keys_from_json_format(collection, {})
54
+ convert_hash_keys_from_json_format(collection, {})
54
55
  end
55
56
  end
56
57
 
@@ -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
 
@@ -35,13 +35,12 @@ module Fortnox
35
35
  end
36
36
 
37
37
  def default_key_to_json_transform(key)
38
- key.to_s.split('_').map(&:capitalize).join('')
38
+ key.to_s.split('_').map(&:capitalize).join
39
39
  end
40
40
 
41
41
  def sanitise(hash, keys_to_filter)
42
42
  hash.reject do |key, value|
43
- next false if keys_to_filter.include?(key)
44
- value.nil?
43
+ keys_to_filter.include?(key) || value.nil?
45
44
  end
46
45
  end
47
46
  end
@@ -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
@@ -25,8 +26,8 @@ module Fortnox
25
26
  obj = preserve_meta_properties(hash) do
26
27
  super(hash)
27
28
  end
28
- rescue Dry::Struct::Error => e
29
- raise Fortnox::API::AttributeError, e
29
+ rescue Dry::Struct::Error => exception
30
+ raise Fortnox::API::AttributeError, exception
30
31
  end
31
32
 
32
33
  IceNine.deep_freeze(obj)
@@ -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,25 +52,30 @@ 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) # rubocop:disable Style/OptionalBooleanParameter
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 send("#{key.name}?")
61
+ end
52
62
  end
53
63
 
54
64
  def update(hash)
55
65
  old_attributes = to_hash
56
- new_attributes = old_attributes.merge(hash)
66
+ new_attributes = old_attributes.merge(hash).compact
57
67
 
58
68
  return self if new_attributes == old_attributes
59
69
 
60
- new_hash = new_attributes.delete_if { |_, value| value.nil? }
61
- new_hash[:new] = @new
62
- new_hash[:parent] = self
63
- self.class.new(new_hash)
70
+ new_attributes[:new] = @new
71
+ new_attributes[:parent] = self
72
+ self.class.new(new_attributes)
64
73
  end
65
74
 
66
75
  # Generic comparison, by value, use .eql? or .equal? for object identity.
67
76
  def ==(other)
68
77
  return false unless other.is_a? self.class
78
+
69
79
  to_hash == other.to_hash
70
80
  end
71
81
 
@@ -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 }
@@ -115,6 +115,8 @@ module Fortnox
115
115
  obj
116
116
  end
117
117
 
118
+ private_class_method :preserve_meta_properties
119
+
118
120
  private
119
121
 
120
122
  def private_attributes