fortnox-api 0.6.3 → 0.7.0

Sign up to get free protection for your applications and to get access to all the features.
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