fortnox-api 0.6.3 → 0.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (153) hide show
  1. checksums.yaml +5 -5
  2. data/.rubocop.yml +4 -0
  3. data/.travis.yml +20 -15
  4. data/CHANGELOG.md +18 -0
  5. data/README.md +11 -19
  6. data/fortnox-api.gemspec +6 -6
  7. data/lib/fortnox/api/mappers.rb +5 -38
  8. data/lib/fortnox/api/mappers/base.rb +2 -24
  9. data/lib/fortnox/api/mappers/base/canonical_name_sym.rb +21 -0
  10. data/lib/fortnox/api/mappers/value/array.rb +18 -0
  11. data/lib/fortnox/api/mappers/value/country_code_string.rb +24 -0
  12. data/lib/fortnox/api/mappers/value/date.rb +11 -0
  13. data/lib/fortnox/api/mappers/value/hash.rb +16 -0
  14. data/lib/fortnox/api/mappers/value/identity.rb +18 -0
  15. data/lib/fortnox/api/models/document.rb +1 -1
  16. data/lib/fortnox/api/models/invoice.rb +1 -1
  17. data/lib/fortnox/api/models/order.rb +1 -1
  18. data/lib/fortnox/api/repositories/base.rb +9 -11
  19. data/lib/fortnox/api/request_handling.rb +0 -1
  20. data/lib/fortnox/api/types.rb +19 -3
  21. data/lib/fortnox/api/types/enums.rb +0 -23
  22. data/lib/fortnox/api/types/shim/country_code_string.rb +10 -0
  23. data/lib/fortnox/api/types/sized.rb +3 -16
  24. data/lib/fortnox/api/version.rb +1 -1
  25. data/spec/fortnox/api/circular_queue_spec.rb +52 -0
  26. data/spec/fortnox/api/mappers/base/canonical_name_sym_spec.rb +34 -0
  27. data/spec/fortnox/api/mappers/base_spec.rb +33 -43
  28. data/spec/fortnox/api/mappers/contexts/json_conversion.rb +1 -1
  29. data/spec/fortnox/api/repositories/article_spec.rb +4 -2
  30. data/spec/fortnox/api/repositories/base_spec.rb +28 -8
  31. data/spec/fortnox/api/repositories/customer_spec.rb +2 -1
  32. data/spec/fortnox/api/repositories/invoice_spec.rb +147 -3
  33. data/spec/fortnox/api/repositories/order_spec.rb +2 -2
  34. data/spec/fortnox/api/repositories/project_spec.rb +1 -1
  35. data/spec/fortnox/api/repositories/terms_of_payment_spec.rb +4 -2
  36. data/spec/fortnox/api/repositories/unit_spec.rb +6 -3
  37. data/spec/fortnox/api/types/country_code_spec.rb +76 -0
  38. data/spec/fortnox/api/types/email_spec.rb +8 -7
  39. data/spec/fortnox/api/types/enums_spec.rb +0 -1
  40. data/spec/fortnox/api/types/examples/document_row.rb +1 -1
  41. data/spec/fortnox/api_spec.rb +3 -1
  42. data/spec/vcr_cassettes/articles/all.yml +22 -8
  43. data/spec/vcr_cassettes/articles/find_by_hash_failure.yml +6 -6
  44. data/spec/vcr_cassettes/articles/find_failure.yml +6 -6
  45. data/spec/vcr_cassettes/articles/find_id_1.yml +7 -7
  46. data/spec/vcr_cassettes/articles/find_new.yml +9 -9
  47. data/spec/vcr_cassettes/articles/multi_param_find_by_hash.yml +6 -6
  48. data/spec/vcr_cassettes/articles/save_new.yml +8 -8
  49. data/spec/vcr_cassettes/articles/save_old.yml +9 -9
  50. data/spec/vcr_cassettes/articles/save_with_specially_named_attribute.yml +8 -8
  51. data/spec/vcr_cassettes/articles/search_by_name.yml +6 -6
  52. data/spec/vcr_cassettes/articles/search_miss.yml +6 -6
  53. data/spec/vcr_cassettes/articles/search_with_special_char.yml +6 -6
  54. data/spec/vcr_cassettes/articles/single_param_find_by_hash.yml +18 -8
  55. data/spec/vcr_cassettes/customers/all.yml +9 -9
  56. data/spec/vcr_cassettes/customers/find_by_hash_failure.yml +6 -6
  57. data/spec/vcr_cassettes/customers/find_failure.yml +6 -6
  58. data/spec/vcr_cassettes/customers/find_id_1.yml +7 -7
  59. data/spec/vcr_cassettes/customers/find_new.yml +9 -9
  60. data/spec/vcr_cassettes/customers/multi_param_find_by_hash.yml +5 -5
  61. data/spec/vcr_cassettes/customers/save_new.yml +7 -7
  62. data/spec/vcr_cassettes/customers/save_old.yml +8 -8
  63. data/spec/vcr_cassettes/customers/save_with_specially_named_attribute.yml +7 -7
  64. data/spec/vcr_cassettes/customers/search_by_name.yml +16 -8
  65. data/spec/vcr_cassettes/customers/search_miss.yml +6 -6
  66. data/spec/vcr_cassettes/customers/search_with_special_char.yml +6 -6
  67. data/spec/vcr_cassettes/customers/single_param_find_by_hash.yml +7 -7
  68. data/spec/vcr_cassettes/invoices/all.yml +100 -65
  69. data/spec/vcr_cassettes/invoices/filter_hit.yml +11 -8
  70. data/spec/vcr_cassettes/invoices/filter_invalid.yml +6 -6
  71. data/spec/vcr_cassettes/invoices/find_by_hash_failure.yml +6 -6
  72. data/spec/vcr_cassettes/invoices/find_failure.yml +6 -6
  73. data/spec/vcr_cassettes/invoices/find_id_1.yml +7 -7
  74. data/spec/vcr_cassettes/invoices/find_new.yml +11 -12
  75. data/spec/vcr_cassettes/invoices/multi_param_find_by_hash.yml +8 -8
  76. data/spec/vcr_cassettes/invoices/save_new.yml +9 -10
  77. data/spec/vcr_cassettes/invoices/save_new_with_comments.yml +47 -0
  78. data/spec/vcr_cassettes/invoices/save_new_with_country.yml +46 -0
  79. data/spec/vcr_cassettes/invoices/save_new_with_country_GB.yml +47 -0
  80. data/spec/vcr_cassettes/invoices/save_new_with_country_KR.yml +47 -0
  81. data/spec/vcr_cassettes/invoices/save_new_with_country_Norge.yml +46 -0
  82. data/spec/vcr_cassettes/invoices/save_new_with_country_Norway.yml +46 -0
  83. data/spec/vcr_cassettes/invoices/save_new_with_country_Sverige.yml +46 -0
  84. data/spec/vcr_cassettes/invoices/save_new_with_country_VA.yml +47 -0
  85. data/spec/vcr_cassettes/invoices/save_new_with_country_VI.yml +47 -0
  86. data/spec/vcr_cassettes/invoices/save_new_with_country_empty_string.yml +46 -0
  87. data/spec/vcr_cassettes/invoices/save_new_with_country_nil.yml +46 -0
  88. data/spec/vcr_cassettes/invoices/save_old.yml +10 -11
  89. data/spec/vcr_cassettes/invoices/save_old_with_empty_comments.yml +48 -0
  90. data/spec/vcr_cassettes/invoices/save_old_with_empty_country.yml +47 -0
  91. data/spec/vcr_cassettes/invoices/save_old_with_nil_comments.yml +48 -0
  92. data/spec/vcr_cassettes/invoices/save_old_with_nil_country.yml +47 -0
  93. data/spec/vcr_cassettes/invoices/save_with_nested_model.yml +9 -10
  94. data/spec/vcr_cassettes/invoices/save_with_specially_named_attribute.yml +9 -10
  95. data/spec/vcr_cassettes/invoices/search_by_name.yml +13 -9
  96. data/spec/vcr_cassettes/invoices/search_miss.yml +6 -6
  97. data/spec/vcr_cassettes/invoices/search_with_special_char.yml +6 -6
  98. data/spec/vcr_cassettes/invoices/single_param_find_by_hash.yml +9 -9
  99. data/spec/vcr_cassettes/orders/all.yml +105 -105
  100. data/spec/vcr_cassettes/orders/filter_hit.yml +13 -10
  101. data/spec/vcr_cassettes/orders/filter_invalid.yml +6 -6
  102. data/spec/vcr_cassettes/orders/find_by_hash_failure.yml +6 -6
  103. data/spec/vcr_cassettes/orders/find_failure.yml +6 -6
  104. data/spec/vcr_cassettes/orders/find_id_1.yml +8 -8
  105. data/spec/vcr_cassettes/orders/find_new.yml +11 -12
  106. data/spec/vcr_cassettes/orders/housework_type_babysitting.yml +9 -9
  107. data/spec/vcr_cassettes/orders/housework_type_cleaning.yml +9 -9
  108. data/spec/vcr_cassettes/orders/housework_type_construction.yml +9 -9
  109. data/spec/vcr_cassettes/orders/housework_type_cooking.yml +6 -6
  110. data/spec/vcr_cassettes/orders/housework_type_electricity.yml +9 -9
  111. data/spec/vcr_cassettes/orders/housework_type_gardening.yml +9 -9
  112. data/spec/vcr_cassettes/orders/housework_type_glassmetalwork.yml +9 -9
  113. data/spec/vcr_cassettes/orders/housework_type_grounddrainagework.yml +9 -9
  114. data/spec/vcr_cassettes/orders/housework_type_hvac.yml +9 -9
  115. data/spec/vcr_cassettes/orders/housework_type_masonry.yml +9 -9
  116. data/spec/vcr_cassettes/orders/housework_type_othercare.yml +9 -9
  117. data/spec/vcr_cassettes/orders/housework_type_othercosts.yml +9 -9
  118. data/spec/vcr_cassettes/orders/housework_type_paintingwallpapering.yml +9 -9
  119. data/spec/vcr_cassettes/orders/housework_type_snowplowing.yml +9 -9
  120. data/spec/vcr_cassettes/orders/housework_type_textileclothing.yml +9 -9
  121. data/spec/vcr_cassettes/orders/housework_type_tutoring.yml +6 -6
  122. data/spec/vcr_cassettes/orders/multi_param_find_by_hash.yml +7 -7
  123. data/spec/vcr_cassettes/orders/save_new.yml +9 -10
  124. data/spec/vcr_cassettes/orders/save_old.yml +10 -11
  125. data/spec/vcr_cassettes/orders/save_with_nested_model.yml +9 -10
  126. data/spec/vcr_cassettes/orders/search_by_name.yml +9 -8
  127. data/spec/vcr_cassettes/orders/search_miss.yml +6 -6
  128. data/spec/vcr_cassettes/orders/search_with_special_char.yml +6 -6
  129. data/spec/vcr_cassettes/orders/single_param_find_by_hash.yml +8 -8
  130. data/spec/vcr_cassettes/projects/all.yml +18 -8
  131. data/spec/vcr_cassettes/projects/find_by_hash_failure.yml +6 -6
  132. data/spec/vcr_cassettes/projects/find_failure.yml +6 -6
  133. data/spec/vcr_cassettes/projects/find_id_1.yml +6 -6
  134. data/spec/vcr_cassettes/projects/find_new.yml +9 -9
  135. data/spec/vcr_cassettes/projects/multi_param_find_by_hash.yml +7 -7
  136. data/spec/vcr_cassettes/projects/save_new.yml +8 -8
  137. data/spec/vcr_cassettes/projects/save_old.yml +8 -8
  138. data/spec/vcr_cassettes/projects/single_param_find_by_hash.yml +7 -7
  139. data/spec/vcr_cassettes/termsofpayments/all.yml +10 -7
  140. data/spec/vcr_cassettes/termsofpayments/find_failure.yml +6 -6
  141. data/spec/vcr_cassettes/termsofpayments/find_id_1.yml +6 -6
  142. data/spec/vcr_cassettes/termsofpayments/find_new.yml +8 -8
  143. data/spec/vcr_cassettes/termsofpayments/save_new.yml +8 -8
  144. data/spec/vcr_cassettes/termsofpayments/save_old.yml +8 -8
  145. data/spec/vcr_cassettes/units/all.yml +14 -10
  146. data/spec/vcr_cassettes/units/find_failure.yml +6 -6
  147. data/spec/vcr_cassettes/units/find_id_1.yml +6 -6
  148. data/spec/vcr_cassettes/units/find_new.yml +8 -10
  149. data/spec/vcr_cassettes/units/save_new.yml +8 -10
  150. data/spec/vcr_cassettes/units/save_old.yml +8 -10
  151. data/spec/vcr_cassettes/units/save_with_specially_named_attribute.yml +8 -10
  152. data/temp.txt +1 -0
  153. metadata +71 -13
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: a0367007a797c6a5e054927933fb9e4cb9e897b1
4
- data.tar.gz: 280be6192fd9f9d9678b02c18f84d1da45dcb969
2
+ SHA256:
3
+ metadata.gz: a174ee3cf9c8f2a5ee1a43ce636806e017e1462263eddfdd5e91968025144fb4
4
+ data.tar.gz: d5f3c46c81e25009be272bee9bdfafe64e657f4ff5b7a131c272a49b8f9382f5
5
5
  SHA512:
6
- metadata.gz: 55041f7e183aa01f3757feaf79135bd415665983f5475186a41cf2199dbf8be2933f4fe1a705b6d839eb60883a9f1a4aa2777c19324bcc7b41a654a64a5d3599
7
- data.tar.gz: a1e060065d65878d653dcd34f7b78dfff30ef341617e05653853a7af5f524a4e3261be7c03708e7c8ebad182bffcdcf17ecb48214e6ded8033d8fd2acdc5eb69
6
+ metadata.gz: 942b59f8380781117425fbcdb713bbf05c3e4651779e517c89b1c1cd339bc521a19a79ca2df9c02098a472eabc31a5b9ae9f1b69945bd21c54e727075d4c66f9
7
+ data.tar.gz: 598dd75a8a6d7f8af1b84e70a331192df243ebddad2174b09f43161767ab84b0e4c08dc8c020e55b9fa8928d8d3419f6ba7a99e2b5c6d21d541691d0eaacda17
data/.rubocop.yml CHANGED
@@ -19,3 +19,7 @@ Metrics/LineLength:
19
19
  Metrics/BlockLength:
20
20
  Exclude:
21
21
  - 'spec/**/*'
22
+
23
+ Naming/PredicateName:
24
+ Exclude:
25
+ - 'spec/support/matchers/**/*'
data/.travis.yml CHANGED
@@ -1,31 +1,36 @@
1
1
  env:
2
2
  global:
3
- - CC_TEST_REPORTER_ID=397c19af63ca3467cff6fd640b0460b691f687118332b5989f530d28f82adcb8
3
+ - CC_TEST_REPORTER_ID=43ea0acb059b164537ce31bf67e03e1cb552d63df1ad3e9bd95dc3d844697bb4
4
4
  language: ruby
5
5
  rvm:
6
- - 2.3.0
7
- - 2.3.1
8
- - 2.3.2
9
- - 2.3.3
10
- - 2.3.4
11
- - 2.3.5
12
- - 2.3.6
13
6
  - 2.4.0
14
7
  - 2.4.1
15
8
  - 2.4.2
16
9
  - 2.4.3
10
+ - 2.4.6
17
11
  - 2.5.0
18
- addons:
19
- code_climate:
20
- repo_token: 397c19af63ca3467cff6fd640b0460b691f687118332b5989f530d28f82adcb8
12
+ - 2.5.5
13
+ - 2.6.0
14
+ - 2.6.3
15
+ - 2.7.0-preview1
21
16
  notifications:
22
- slack: my-codeworks:fwKO4YfipnmNKJQL3cRSEoKB
17
+ slack:
18
+ secure: UEYDtwLaQgAoMRY7ct1y0Uu5HbInMwrLo+TiYRc3rjDrzqDfDyInEr3bpckyPJ79lnzccrFezMdY4jWzRjmsvQzvYMu+DWJ1mAWOa/9Ws4YZ8nHd5KqXxVQ0EqPWuWwMOyOdyy3DK/MjUOobGSc0//Pv5DeaAAEBKLJzN+e1BQM=
23
19
  email: false
20
+ before_install:
21
+ - gem update --system
22
+ - gem install bundler
23
+ cache: bundler
24
24
  before_script:
25
- - curl -L https://codeclimate.com/downloads/test-reporter/test-reporter-latest-linux-amd64 > ./cc-test-reporter
25
+ - curl -L https://codeclimate.com/downloads/test-reporter/test-reporter-latest-linux-amd64
26
+ > ./cc-test-reporter
26
27
  - chmod +x ./cc-test-reporter
27
- - ./cc-test-reporter before-build
28
+ - "./cc-test-reporter before-build"
28
29
  script:
29
30
  - bundle exec rspec
30
31
  after_script:
31
- - ./cc-test-reporter after-build --exit-code $TRAVIS_TEST_RESULT
32
+ - "./cc-test-reporter after-build --exit-code $TRAVIS_TEST_RESULT"
33
+ branches:
34
+ only:
35
+ - master
36
+ - development
data/CHANGELOG.md ADDED
@@ -0,0 +1,18 @@
1
+ # Changelog
2
+ All notable changes to this project will be documented in this file.
3
+
4
+ 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
+
7
+ ## [0.7.0]
8
+ ### Added
9
+ - Adds build test for Ruby 2.6.0, 2.6.3 and 2.7.0-preview.
10
+
11
+ ### Removed
12
+ - Drops support for Ruby < 2.4.0 since they are deprecated
13
+
14
+ ### Fixed
15
+ - Country attribute for Invoice and Order is now validated correctly.
16
+ - Fixes deprecation warnings
17
+
18
+ [0.7.0]: https://github.com/accodeing/fortnox-api/compare/v0.7.0...v0.6.3
data/README.md CHANGED
@@ -3,24 +3,21 @@
3
3
 
4
4
  # Status for master
5
5
  [![Gem version](https://img.shields.io/gem/v/fortnox-api.svg?style=flat-square)](https://rubygems.org/gems/fortnox-api)
6
- [![Build status](https://img.shields.io/travis/my-codeworks/fortnox-api/master.svg?style=flat-square)](https://travis-ci.org/my-codeworks/fortnox-api)
7
- [![Dependency status](https://img.shields.io/gemnasium/my-codeworks/fortnox-api.svg?style=flat-square)](https://gemnasium.com/my-codeworks/fortnox-api)
6
+ [![Build Status](https://travis-ci.com/accodeing/fortnox-api.svg?branch=master)](https://travis-ci.com/accodeing/fortnox-api)
8
7
 
9
8
  # Status for development
10
- [![Build status](https://img.shields.io/travis/my-codeworks/fortnox-api/development.svg?style=flat-square)](https://travis-ci.org/my-codeworks/fortnox-api)
11
- [![Maintainability](https://api.codeclimate.com/v1/badges/50d44a1d00620b4a6bde/maintainability)](https://codeclimate.com/github/my-codeworks/fortnox-api/maintainability)
12
- [![Test Coverage](https://api.codeclimate.com/v1/badges/50d44a1d00620b4a6bde/test_coverage)](https://codeclimate.com/github/my-codeworks/fortnox-api/test_coverage)
9
+ [![Build Status](https://travis-ci.com/accodeing/fortnox-api.svg?branch=development)](https://travis-ci.com/accodeing/fortnox-api)
10
+ [![Maintainability](https://api.codeclimate.com/v1/badges/89d30a43fedf210d470b/maintainability)](https://codeclimate.com/github/accodeing/fortnox-api/maintainability)
11
+ [![Test Coverage](https://api.codeclimate.com/v1/badges/89d30a43fedf210d470b/test_coverage)](https://codeclimate.com/github/accodeing/fortnox-api/test_coverage)
13
12
 
14
- The rough status of this project is as follows (as of October 2017):
15
- * In active development (just check out the commit log)
16
- * Three developers. At least thrice as good as one.
13
+ The rough status of this project is as follows (as of October 2018):
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).
17
16
  * Basic structure complete. Things like getting customers and invoices, updating and saving etc.
18
17
  * Some advanced features implemented, for instance support for multiple Access Tokens and filtering entities.
19
- * Advanced features around the corner. Things like sorting entities, pagination of results etc.
20
- * A few models implemented. Right now we have nearly full support for `Customer`, `Invoice`, `Order`, `Article`, `Label` and `Project`. Adding more models in general is quick and easy, see the developer guide further down.
21
- * Massive refactorings no longer occurs weekly :) We are running this gem in production for live test.
22
-
23
- The goal is to have a production ready version that covers at least the `Invoice`, `Order`, `Customer` and `Project` models by January.
18
+ * We have ideas for more advanced features, like sorting entities, pagination of results but nothing in the pipeline right now.
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 :)
24
21
 
25
22
  # Architecture overview
26
23
  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.
@@ -84,12 +81,7 @@ These are responsible for the mapping between our plain old Ruby object models a
84
81
 
85
82
  # Requirements
86
83
 
87
- This gem is build for Ruby 2.2 or higher, it's tested agains Ruby 2.2.5, 2.3.0 and 2.3.1. Since it uses the keywords argument feature and since Ruby 2.1
88
- is [officially outdated and unsupported](https://www.ruby-lang.org/en/news/2016/03/30/ruby-2-1-9-released/)
89
- it won't work on older versions.
90
-
91
- If you want or need Ruby 1.9 compatibility please submit a pull request.
92
- Instructions can be found below :)
84
+ This gem is build for Ruby 2.4 or higher (see Travis configuration file for what versions we are testing against).
93
85
 
94
86
  ## Installation
95
87
 
data/fortnox-api.gemspec CHANGED
@@ -23,13 +23,13 @@ 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.3'
26
+ spec.required_ruby_version = '>= 2.4'
27
+ spec.add_dependency 'countries', '~> 3.0'
27
28
  spec.add_dependency 'dry-struct', '~> 0.1'
28
29
  spec.add_dependency 'dry-types', '~> 0.8', '< 0.13.0'
29
- # TODO: Temporary lockdown. See issue #103 for more info.
30
- spec.add_dependency 'httparty', '~> 0.14.0'
30
+ spec.add_dependency 'httparty', '~> 0.17'
31
31
 
32
- spec.add_development_dependency 'bundler', '~> 1.9'
32
+ spec.add_development_dependency 'bundler', '~> 2.0'
33
33
  spec.add_development_dependency 'guard', '~> 2.12'
34
34
  spec.add_development_dependency 'guard-rspec', '~> 4.5'
35
35
  spec.add_development_dependency 'pry', '~> 0'
@@ -39,6 +39,6 @@ Gem::Specification.new do |spec| # rubocop:disable Metrics/BlockLength
39
39
  spec.add_development_dependency 'rubocop', '~> 0.52.0'
40
40
  spec.add_development_dependency 'rubocop-rspec', '~> 1.22.2'
41
41
  spec.add_development_dependency 'simplecov', '~> 0.15'
42
- spec.add_development_dependency 'vcr', '~> 3.0'
43
- spec.add_development_dependency 'webmock', '~> 1.21'
42
+ spec.add_development_dependency 'vcr', '~> 4.0'
43
+ spec.add_development_dependency 'webmock', '~> 3.5'
44
44
  end
@@ -2,44 +2,11 @@
2
2
 
3
3
  require 'fortnox/api/types'
4
4
 
5
- module Fortnox
6
- module API
7
- module Mapper
8
- Identity = ->(value) { value }
9
-
10
- Date = ->(value) { value.to_s }
11
-
12
- Array = lambda do |array|
13
- array.each_with_object([]) do |item, converted_array|
14
- name = Fortnox::API::Mapper::Base.canonical_name_sym(item)
15
- converted_array << Fortnox::API::Registry[name].call(item)
16
- end
17
- end
18
-
19
- Registry.register(:integer, Fortnox::API::Mapper::Identity)
20
- Registry.register(:int, Fortnox::API::Mapper::Identity)
21
- Registry.register(:float, Fortnox::API::Mapper::Identity)
22
- Registry.register(:string, Fortnox::API::Mapper::Identity)
23
- Registry.register(:boolean, Fortnox::API::Mapper::Identity)
24
- Registry.register(:falseclass, Fortnox::API::Mapper::Identity)
25
- Registry.register(:trueclass, Fortnox::API::Mapper::Identity)
26
- Registry.register(:nilclass, Fortnox::API::Mapper::Identity)
27
- Registry.register(:array, Fortnox::API::Mapper::Array)
28
- Registry.register(:date, Fortnox::API::Mapper::Date)
29
-
30
- Registry.register(:account_number, Fortnox::API::Mapper::Identity)
31
- Registry.register(:country_code, Fortnox::API::Mapper::Identity)
32
- Registry.register(:currency, Fortnox::API::Mapper::Identity)
33
- Registry.register(:customer_type, Fortnox::API::Mapper::Identity)
34
- Registry.register(:discount_type, Fortnox::API::Mapper::Identity)
35
- Registry.register(:email, Fortnox::API::Mapper::Identity)
36
- Registry.register(:housework_type, Fortnox::API::Mapper::Identity)
37
- Registry.register(:vat_type, Fortnox::API::Mapper::Identity)
38
- Registry.register(:labels, Fortnox::API::Mapper::Array)
39
- end
40
- end
41
- end
42
-
5
+ require 'fortnox/api/mappers/value/array'
6
+ require 'fortnox/api/mappers/value/country_code_string'
7
+ require 'fortnox/api/mappers/value/date'
8
+ require 'fortnox/api/mappers/value/hash'
9
+ require 'fortnox/api/mappers/value/identity'
43
10
  require 'fortnox/api/mappers/customer'
44
11
  require 'fortnox/api/mappers/default_delivery_types'
45
12
  require 'fortnox/api/mappers/default_templates'
@@ -1,5 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require 'fortnox/api/mappers/base/canonical_name_sym'
3
4
  require 'fortnox/api/mappers/base/from_json'
4
5
  require 'fortnox/api/mappers/base/to_json'
5
6
 
@@ -9,30 +10,7 @@ module Fortnox
9
10
  class Base
10
11
  include FromJSON
11
12
  include ToJSON
12
-
13
- Hash = lambda do |hash|
14
- hash.each do |key, value|
15
- name = Fortnox::API::Mapper::Base.canonical_name_sym(value)
16
- hash[key] = Fortnox::API::Registry[name].call(value)
17
- end
18
- end
19
-
20
- Registry.register(:hash, Fortnox::API::Mapper::Base::Hash)
21
-
22
- def self.canonical_name_sym(*values)
23
- klass = if values.empty?
24
- self
25
- elsif values.first.is_a? Class
26
- values.first
27
- else
28
- values.first.class
29
- end
30
-
31
- # For Ruby < 2.4, make sure we don't pass Bignum and Fixnum around
32
- klass = Integer if %w[Bignum Fixnum].include?(klass.to_s) # Stringify to avoid warnings on 2.4
33
-
34
- klass.name.split('::').last.downcase.to_sym
35
- end
13
+ extend CanonicalNameSym
36
14
 
37
15
  def diff(entity_hash, parent_hash)
38
16
  hash_diff(entity_hash[self.class::JSON_ENTITY_WRAPPER],
@@ -0,0 +1,21 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Fortnox
4
+ module API
5
+ module Mapper
6
+ module CanonicalNameSym
7
+ def canonical_name_sym(*values)
8
+ klass = if values.empty?
9
+ self
10
+ elsif values.first.is_a? Class
11
+ values.first
12
+ else
13
+ values.first.class
14
+ end
15
+
16
+ klass.name.split('::').last.downcase.to_sym
17
+ end
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,18 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Fortnox
4
+ module API
5
+ module Mapper
6
+ Array = lambda do |array|
7
+ array.each_with_object([]) do |item, converted_array|
8
+ name = Fortnox::API::Mapper::Base.canonical_name_sym(item)
9
+ converted_array << Fortnox::API::Registry[name].call(item)
10
+ end
11
+ end
12
+
13
+ Registry.register(:array, Fortnox::API::Mapper::Array)
14
+
15
+ Registry.register(:labels, Fortnox::API::Mapper::Array)
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,24 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'fortnox/api/mappers/base/canonical_name_sym'
4
+
5
+ module Fortnox
6
+ module API
7
+ module Mapper
8
+ class CountryCodeString
9
+ extend CanonicalNameSym
10
+
11
+ CountryCodeMapper = lambda do |code|
12
+ next code if code.nil? || code == ''
13
+
14
+ # Fortnox only supports Swedish country name for Sweden
15
+ next 'Sverige' if code == 'SE'
16
+
17
+ ::ISO3166::Country[code].translations['en']
18
+ end
19
+
20
+ Registry.register(canonical_name_sym, CountryCodeMapper)
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,11 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Fortnox
4
+ module API
5
+ module Mapper
6
+ Date = ->(value) { value.to_s }
7
+
8
+ Registry.register(:date, Fortnox::API::Mapper::Date)
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,16 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Fortnox
4
+ module API
5
+ module Mapper
6
+ Hash = lambda do |hash|
7
+ hash.each do |key, value|
8
+ name = Fortnox::API::Mapper::Base.canonical_name_sym(value)
9
+ hash[key] = Fortnox::API::Registry[name].call(value)
10
+ end
11
+ end
12
+
13
+ Registry.register(:hash, Hash)
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,18 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Fortnox
4
+ module API
5
+ module Mapper
6
+ Identity = ->(value) { value }
7
+
8
+ Registry.register(:integer, Fortnox::API::Mapper::Identity)
9
+ Registry.register(:int, Fortnox::API::Mapper::Identity)
10
+ Registry.register(:float, Fortnox::API::Mapper::Identity)
11
+ Registry.register(:string, Fortnox::API::Mapper::Identity)
12
+ Registry.register(:boolean, Fortnox::API::Mapper::Identity)
13
+ Registry.register(:falseclass, Fortnox::API::Mapper::Identity)
14
+ Registry.register(:trueclass, Fortnox::API::Mapper::Identity)
15
+ Registry.register(:nilclass, Fortnox::API::Mapper::Identity)
16
+ end
17
+ end
18
+ end
@@ -109,7 +109,7 @@ module Fortnox
109
109
  # HouseWork If there is any row of the document marked "housework".
110
110
  attribute :housework, Types::Nullable::Boolean.is(:read_only)
111
111
 
112
- attribute :labels, Types::Strict::Array.member(Label)
112
+ attribute :labels, Types::Strict::Array.of(Label)
113
113
 
114
114
  # Net Net amount
115
115
  attribute :net, Types::Nullable::Float.is(:read_only)
@@ -50,7 +50,7 @@ module Fortnox
50
50
  attribute :invoice_period_end, Types::Nullable::Date.is(:read_only)
51
51
 
52
52
  # InvoiceRows Separate object
53
- attribute :invoice_rows, Types::Strict::Array.member(Types::InvoiceRow)
53
+ attribute :invoice_rows, Types::Strict::Array.of(Types::InvoiceRow)
54
54
 
55
55
  # InvoiceType The type of invoice.
56
56
  attribute :invoice_type, Types::Nullable::String
@@ -20,7 +20,7 @@ module Fortnox
20
20
  attribute :order_date, Types::Nullable::Date
21
21
 
22
22
  # OrderRows Separate object
23
- attribute :order_rows, Types::Strict::Array.member(Types::OrderRow)
23
+ attribute :order_rows, Types::Strict::Array.of(Types::OrderRow)
24
24
  end
25
25
  end
26
26
  end
@@ -16,10 +16,10 @@ module Fortnox
16
16
 
17
17
  HTTParty::Parser::SupportedFormats['text/html'] = :json
18
18
 
19
- DEFAULT_HEADERS = {
19
+ headers(
20
20
  'Content-Type' => 'application/json',
21
21
  'Accept' => 'application/json'
22
- }.freeze
22
+ )
23
23
 
24
24
  HTTP_METHODS = %i[get put post delete].freeze
25
25
 
@@ -31,21 +31,19 @@ module Fortnox
31
31
  end
32
32
 
33
33
  HTTP_METHODS.each do |method|
34
- define_method method do |*args|
35
- headers['Access-Token'] = next_access_token
34
+ define_method method do |path, options = {}, &block|
35
+ provided_headers = options[:headers] || {}
36
+ provided_headers['Client-Secret'] = client_secret
37
+ provided_headers['Access-Token'] = next_access_token
38
+ options[:headers] = provided_headers
39
+ options[:base_uri] ||= base_url
36
40
  execute do |remote|
37
- remote.send(method, *args)
41
+ remote.send(method, path, options, &block)
38
42
  end
39
43
  end
40
44
  end
41
45
 
42
46
  def initialize(keys_filtered_on_save: [:url], token_store: :default)
43
- self.class.base_uri(base_url)
44
-
45
- self.headers = DEFAULT_HEADERS.merge(
46
- 'Client-Secret' => client_secret
47
- )
48
-
49
47
  @keys_filtered_on_save = keys_filtered_on_save
50
48
  @token_store = token_store
51
49
  @mapper = Registry[Mapper::Base.canonical_name_sym(self.class::MODEL)].new