fortnox-api 0.6.2 → 0.8.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (165) hide show
  1. checksums.yaml +5 -5
  2. data/.rubocop.yml +5 -1
  3. data/.travis.yml +20 -22
  4. data/CHANGELOG.md +48 -0
  5. data/README.md +14 -19
  6. data/Rakefile +5 -0
  7. data/fortnox-api.gemspec +10 -10
  8. data/lib/fortnox/api/mappers.rb +5 -38
  9. data/lib/fortnox/api/mappers/base.rb +2 -24
  10. data/lib/fortnox/api/mappers/base/canonical_name_sym.rb +21 -0
  11. data/lib/fortnox/api/mappers/base/from_json.rb +6 -1
  12. data/lib/fortnox/api/mappers/value/array.rb +18 -0
  13. data/lib/fortnox/api/mappers/value/country_string.rb +24 -0
  14. data/lib/fortnox/api/mappers/value/date.rb +11 -0
  15. data/lib/fortnox/api/mappers/value/hash.rb +16 -0
  16. data/lib/fortnox/api/mappers/value/identity.rb +18 -0
  17. data/lib/fortnox/api/models/document.rb +6 -3
  18. data/lib/fortnox/api/models/invoice.rb +1 -1
  19. data/lib/fortnox/api/models/order.rb +1 -1
  20. data/lib/fortnox/api/repositories/base.rb +9 -11
  21. data/lib/fortnox/api/request_handling.rb +0 -1
  22. data/lib/fortnox/api/types.rb +40 -3
  23. data/lib/fortnox/api/types/enums.rb +36 -31
  24. data/lib/fortnox/api/types/shim/country_string.rb +10 -0
  25. data/lib/fortnox/api/version.rb +1 -1
  26. data/spec/fortnox/api/circular_queue_spec.rb +52 -0
  27. data/spec/fortnox/api/mappers/base/canonical_name_sym_spec.rb +34 -0
  28. data/spec/fortnox/api/mappers/base_spec.rb +33 -43
  29. data/spec/fortnox/api/mappers/contexts/json_conversion.rb +1 -1
  30. data/spec/fortnox/api/repositories/article_spec.rb +4 -2
  31. data/spec/fortnox/api/repositories/base_spec.rb +28 -8
  32. data/spec/fortnox/api/repositories/customer_spec.rb +29 -1
  33. data/spec/fortnox/api/repositories/invoice_spec.rb +147 -3
  34. data/spec/fortnox/api/repositories/order_spec.rb +2 -2
  35. data/spec/fortnox/api/repositories/project_spec.rb +1 -1
  36. data/spec/fortnox/api/repositories/terms_of_payment_spec.rb +4 -2
  37. data/spec/fortnox/api/repositories/unit_spec.rb +6 -3
  38. data/spec/fortnox/api/types/account_number_spec.rb +19 -15
  39. data/spec/fortnox/api/types/country_code_spec.rb +42 -0
  40. data/spec/fortnox/api/types/country_spec.rb +67 -0
  41. data/spec/fortnox/api/types/email_spec.rb +8 -7
  42. data/spec/fortnox/api/types/enums_spec.rb +1 -1
  43. data/spec/fortnox/api/types/examples/document_row.rb +1 -1
  44. data/spec/fortnox/api/types/housework_types_spec.rb +151 -34
  45. data/spec/fortnox/api_spec.rb +3 -1
  46. data/spec/vcr_cassettes/articles/all.yml +40 -10
  47. data/spec/vcr_cassettes/articles/find_by_hash_failure.yml +21 -8
  48. data/spec/vcr_cassettes/articles/find_failure.yml +21 -8
  49. data/spec/vcr_cassettes/articles/find_id_1.yml +22 -9
  50. data/spec/vcr_cassettes/articles/find_new.yml +24 -11
  51. data/spec/vcr_cassettes/articles/multi_param_find_by_hash.yml +21 -8
  52. data/spec/vcr_cassettes/articles/save_new.yml +22 -8
  53. data/spec/vcr_cassettes/articles/save_old.yml +24 -11
  54. data/spec/vcr_cassettes/articles/save_with_specially_named_attribute.yml +22 -8
  55. data/spec/vcr_cassettes/articles/search_by_name.yml +21 -8
  56. data/spec/vcr_cassettes/articles/search_miss.yml +21 -8
  57. data/spec/vcr_cassettes/articles/search_with_special_char.yml +21 -8
  58. data/spec/vcr_cassettes/articles/single_param_find_by_hash.yml +33 -10
  59. data/spec/vcr_cassettes/customers/all.yml +26 -13
  60. data/spec/vcr_cassettes/customers/find_by_hash_failure.yml +21 -8
  61. data/spec/vcr_cassettes/customers/find_failure.yml +21 -8
  62. data/spec/vcr_cassettes/customers/find_id_1.yml +22 -9
  63. data/spec/vcr_cassettes/customers/find_new.yml +24 -11
  64. data/spec/vcr_cassettes/customers/multi_param_find_by_hash.yml +21 -8
  65. data/spec/vcr_cassettes/customers/save_new.yml +21 -7
  66. data/spec/vcr_cassettes/customers/save_new_with_country_code_SE.yml +60 -0
  67. data/spec/vcr_cassettes/customers/save_old.yml +23 -10
  68. data/spec/vcr_cassettes/customers/save_with_specially_named_attribute.yml +21 -7
  69. data/spec/vcr_cassettes/customers/search_by_name.yml +32 -10
  70. data/spec/vcr_cassettes/customers/search_miss.yml +21 -8
  71. data/spec/vcr_cassettes/customers/search_with_special_char.yml +21 -8
  72. data/spec/vcr_cassettes/customers/single_param_find_by_hash.yml +22 -9
  73. data/spec/vcr_cassettes/invoices/all.yml +118 -67
  74. data/spec/vcr_cassettes/invoices/filter_hit.yml +26 -10
  75. data/spec/vcr_cassettes/invoices/filter_invalid.yml +20 -6
  76. data/spec/vcr_cassettes/invoices/find_by_hash_failure.yml +21 -8
  77. data/spec/vcr_cassettes/invoices/find_failure.yml +21 -8
  78. data/spec/vcr_cassettes/invoices/find_id_1.yml +23 -10
  79. data/spec/vcr_cassettes/invoices/find_new.yml +26 -14
  80. data/spec/vcr_cassettes/invoices/multi_param_find_by_hash.yml +23 -10
  81. data/spec/vcr_cassettes/invoices/save_new.yml +23 -10
  82. data/spec/vcr_cassettes/invoices/save_new_with_comments.yml +61 -0
  83. data/spec/vcr_cassettes/invoices/save_new_with_country.yml +60 -0
  84. data/spec/vcr_cassettes/invoices/save_new_with_country_GB.yml +61 -0
  85. data/spec/vcr_cassettes/invoices/save_new_with_country_KR.yml +61 -0
  86. data/spec/vcr_cassettes/invoices/save_new_with_country_Norge.yml +60 -0
  87. data/spec/vcr_cassettes/invoices/save_new_with_country_Norway.yml +60 -0
  88. data/spec/vcr_cassettes/invoices/save_new_with_country_Sverige.yml +60 -0
  89. data/spec/vcr_cassettes/invoices/save_new_with_country_VA.yml +61 -0
  90. data/spec/vcr_cassettes/invoices/save_new_with_country_VI.yml +61 -0
  91. data/spec/vcr_cassettes/invoices/save_new_with_country_empty_string.yml +60 -0
  92. data/spec/vcr_cassettes/invoices/save_new_with_country_nil.yml +60 -0
  93. data/spec/vcr_cassettes/invoices/save_old.yml +25 -13
  94. data/spec/vcr_cassettes/invoices/save_old_with_empty_comments.yml +61 -0
  95. data/spec/vcr_cassettes/invoices/save_old_with_empty_country.yml +60 -0
  96. data/spec/vcr_cassettes/invoices/save_old_with_nil_comments.yml +61 -0
  97. data/spec/vcr_cassettes/invoices/save_old_with_nil_country.yml +60 -0
  98. data/spec/vcr_cassettes/invoices/save_with_nested_model.yml +23 -10
  99. data/spec/vcr_cassettes/invoices/save_with_specially_named_attribute.yml +23 -10
  100. data/spec/vcr_cassettes/invoices/search_by_name.yml +28 -11
  101. data/spec/vcr_cassettes/invoices/search_miss.yml +21 -8
  102. data/spec/vcr_cassettes/invoices/search_with_special_char.yml +21 -8
  103. data/spec/vcr_cassettes/invoices/single_param_find_by_hash.yml +24 -11
  104. data/spec/vcr_cassettes/orders/all.yml +120 -107
  105. data/spec/vcr_cassettes/orders/filter_hit.yml +28 -12
  106. data/spec/vcr_cassettes/orders/filter_invalid.yml +20 -6
  107. data/spec/vcr_cassettes/orders/find_by_hash_failure.yml +21 -8
  108. data/spec/vcr_cassettes/orders/find_failure.yml +21 -8
  109. data/spec/vcr_cassettes/orders/find_id_1.yml +23 -10
  110. data/spec/vcr_cassettes/orders/find_new.yml +26 -14
  111. data/spec/vcr_cassettes/orders/housework_invalid_tax_reduction_type.yml +57 -0
  112. data/spec/vcr_cassettes/orders/housework_othercoses_invalid.yml +57 -0
  113. data/spec/vcr_cassettes/orders/housework_type_babysitting.yml +24 -10
  114. data/spec/vcr_cassettes/orders/housework_type_cleaning.yml +24 -10
  115. data/spec/vcr_cassettes/orders/housework_type_construction.yml +24 -10
  116. data/spec/vcr_cassettes/orders/housework_type_cooking.yml +21 -7
  117. data/spec/vcr_cassettes/orders/housework_type_electricity.yml +24 -10
  118. data/spec/vcr_cassettes/orders/housework_type_gardening.yml +24 -10
  119. data/spec/vcr_cassettes/orders/housework_type_glassmetalwork.yml +24 -10
  120. data/spec/vcr_cassettes/orders/housework_type_grounddrainagework.yml +24 -10
  121. data/spec/vcr_cassettes/orders/housework_type_hvac.yml +24 -10
  122. data/spec/vcr_cassettes/orders/housework_type_itservices.yml +60 -0
  123. data/spec/vcr_cassettes/orders/housework_type_majorappliancerepair.yml +60 -0
  124. data/spec/vcr_cassettes/orders/housework_type_masonry.yml +24 -10
  125. data/spec/vcr_cassettes/orders/housework_type_movingservices.yml +60 -0
  126. data/spec/vcr_cassettes/orders/housework_type_othercare.yml +24 -10
  127. data/spec/vcr_cassettes/orders/housework_type_othercosts.yml +24 -10
  128. data/spec/vcr_cassettes/orders/housework_type_paintingwallpapering.yml +24 -10
  129. data/spec/vcr_cassettes/orders/housework_type_snowplowing.yml +24 -10
  130. data/spec/vcr_cassettes/orders/housework_type_textileclothing.yml +24 -10
  131. data/spec/vcr_cassettes/orders/housework_type_tutoring.yml +21 -7
  132. data/spec/vcr_cassettes/orders/housework_without_tax_reduction_type.yml +57 -0
  133. data/spec/vcr_cassettes/orders/multi_param_find_by_hash.yml +22 -9
  134. data/spec/vcr_cassettes/orders/save_new.yml +23 -10
  135. data/spec/vcr_cassettes/orders/save_old.yml +25 -13
  136. data/spec/vcr_cassettes/orders/save_with_nested_model.yml +23 -10
  137. data/spec/vcr_cassettes/orders/search_by_name.yml +25 -11
  138. data/spec/vcr_cassettes/orders/search_miss.yml +21 -8
  139. data/spec/vcr_cassettes/orders/search_with_special_char.yml +21 -8
  140. data/spec/vcr_cassettes/orders/single_param_find_by_hash.yml +23 -10
  141. data/spec/vcr_cassettes/projects/all.yml +41 -16
  142. data/spec/vcr_cassettes/projects/find_by_hash_failure.yml +21 -8
  143. data/spec/vcr_cassettes/projects/find_failure.yml +21 -8
  144. data/spec/vcr_cassettes/projects/find_id_1.yml +21 -8
  145. data/spec/vcr_cassettes/projects/find_new.yml +24 -11
  146. data/spec/vcr_cassettes/projects/multi_param_find_by_hash.yml +23 -10
  147. data/spec/vcr_cassettes/projects/save_new.yml +22 -8
  148. data/spec/vcr_cassettes/projects/save_old.yml +24 -11
  149. data/spec/vcr_cassettes/projects/single_param_find_by_hash.yml +22 -9
  150. data/spec/vcr_cassettes/termsofpayments/all.yml +31 -14
  151. data/spec/vcr_cassettes/termsofpayments/find_failure.yml +21 -8
  152. data/spec/vcr_cassettes/termsofpayments/find_id_1.yml +22 -9
  153. data/spec/vcr_cassettes/termsofpayments/find_new.yml +23 -10
  154. data/spec/vcr_cassettes/termsofpayments/save_new.yml +22 -8
  155. data/spec/vcr_cassettes/termsofpayments/save_old.yml +23 -10
  156. data/spec/vcr_cassettes/units/all.yml +31 -12
  157. data/spec/vcr_cassettes/units/find_failure.yml +21 -8
  158. data/spec/vcr_cassettes/units/find_id_1.yml +21 -8
  159. data/spec/vcr_cassettes/units/find_new.yml +23 -12
  160. data/spec/vcr_cassettes/units/save_new.yml +22 -10
  161. data/spec/vcr_cassettes/units/save_old.yml +23 -12
  162. data/spec/vcr_cassettes/units/save_with_specially_named_attribute.yml +22 -10
  163. data/temp.txt +1 -0
  164. metadata +99 -21
  165. data/spec/support/matchers/type/have_country_code_matcher.rb +0 -15
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: 790f4fbabb42b6455b84fac371b7d0273432c65c
4
- data.tar.gz: 81802b99dcd1d93af3ca69c774967271db96f318
2
+ SHA256:
3
+ metadata.gz: 02c5fbd6c659d3c6cc4e9ed8dfef6e739ded62fc33107623f4dddc13d33f6672
4
+ data.tar.gz: 14f0815a2fd32e98055d71ef231da2b6fac4b95ecfd9dfcda59b88d1c1445c63
5
5
  SHA512:
6
- metadata.gz: cd2300b9cabe6ddc2e9ec16d767dc6e2c8e078078e7deacca457c003b6049f9f9d46a259b537aaafadbcd08b80d8712a8ecb7ab2ac7fa7e328b54c0318ec5a9f
7
- data.tar.gz: bb686131fa2559c04b0e3b4a6036ab1ff912ff261aaa4eeb891dae57eb04f87a653b3e598e6d4bb48a2b8b1ddd9a63912fd303aca13b2f09cd94ba338f8fff39
6
+ metadata.gz: 293665ff9e0b860e88c7c6c78fbcfdd0b8a8047444f23cd0560d504442e1a0ac3439c52349413cac63e0c5973d1db74dabcf7ebdd9c10bc3f1b7de922db58cbc
7
+ data.tar.gz: 011b4785ce46af9c4cd57939431f6b09dc6ab44d650023616fe7b0784dcde890727999eb918ac3c3db311afaaff8785d240c54e5c30f198a630b9a1bf41483b7
@@ -1,7 +1,7 @@
1
1
  require: rubocop-rspec
2
2
 
3
3
  AllCops:
4
- TargetRubyVersion: 2.3
4
+ TargetRubyVersion: 2.5
5
5
  DisplayCopNames: true
6
6
 
7
7
  RSpec/FilePath:
@@ -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/**/*'
@@ -1,31 +1,29 @@
1
1
  env:
2
2
  global:
3
- - CC_TEST_REPORTER_ID=787a2f89b15c637323c7340d65ec17e898ac44480706b4b4122ea040c2a88f1d
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
- - "2.4.0"
14
- - "2.4.1"
15
- - "2.4.2"
16
- - "2.4.3"
17
- - "2.5.0"
18
- addons:
19
- code_climate:
20
- repo_token: 397c19af63ca3467cff6fd640b0460b691f687118332b5989f530d28f82adcb8
6
+ - 2.5.8
7
+ - 2.6.6
8
+ - 2.7.1
21
9
  notifications:
22
- slack: my-codeworks:fwKO4YfipnmNKJQL3cRSEoKB
10
+ slack:
11
+ secure: UEYDtwLaQgAoMRY7ct1y0Uu5HbInMwrLo+TiYRc3rjDrzqDfDyInEr3bpckyPJ79lnzccrFezMdY4jWzRjmsvQzvYMu+DWJ1mAWOa/9Ws4YZ8nHd5KqXxVQ0EqPWuWwMOyOdyy3DK/MjUOobGSc0//Pv5DeaAAEBKLJzN+e1BQM=
23
12
  email: false
13
+ before_install:
14
+ - gem update --system
15
+ - gem install bundler
16
+ cache: bundler
24
17
  before_script:
25
- - curl -L https://codeclimate.com/downloads/test-reporter/test-reporter-latest-linux-amd64 > ./cc-test-reporter
26
- - chmod +x ./cc-test-reporter
27
- - ./cc-test-reporter before-build
18
+ - curl -L https://codeclimate.com/downloads/test-reporter/test-reporter-latest-linux-amd64
19
+ > ./cc-test-reporter
20
+ - chmod +x ./cc-test-reporter
21
+ - "./cc-test-reporter before-build"
28
22
  script:
29
- - bundle exec rspec
23
+ - bundle exec rspec
30
24
  after_script:
31
- - ./cc-test-reporter after-build --exit-code $TRAVIS_TEST_RESULT
25
+ - "./cc-test-reporter after-build --exit-code $TRAVIS_TEST_RESULT"
26
+ branches:
27
+ only:
28
+ - master
29
+ - development
@@ -0,0 +1,48 @@
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.8.0]
8
+ ### Changed
9
+ - `Fortnox::API::CURRENT_HOUSEWORK_TYPES` is now renamed to `HOUSEWORK_TYPES`
10
+ and is instead a Hash with keys for the different categories of types.
11
+ It also includes legacy types, which means `Fortnox::API::LEGACY_HOUSEWORK_TYPES` is removed.
12
+
13
+ ### Removed
14
+ - Drops support for Ruby < `2.5.0` since they are deprecated
15
+
16
+ ## [0.7.2]
17
+ ### Fixed
18
+ - Invalid validation for Customer's account number attribute
19
+
20
+ ## [0.7.1]
21
+ ### Fixed
22
+ - Invalid validation for Customer's country attributes
23
+
24
+ ## [0.7.0]
25
+ ### Added
26
+ - Adds build test for Ruby `2.6.0`, `2.6.3` and `2.7.0-preview`.
27
+
28
+ ### Removed
29
+ - Drops support for Ruby < `2.4.0` since they are deprecated
30
+
31
+ ### Fixed
32
+ - Country attribute for `Invoice` and `Order` is now validated correctly.
33
+ - Fixes deprecation warnings
34
+ - Unlocks pinned `HTTParty` version
35
+ - Invalid email validation
36
+
37
+ ## [0.6.3]
38
+ ### Changed
39
+ - Pins `dry-types` to `< 0.13.0` due to breaking changes
40
+
41
+ ### Fixed
42
+ - Model attribute `url` is no longer null
43
+
44
+ [0.8.0]: https://github.com/accodeing/fortnox-api/compare/v0.7.2...v0.8.0
45
+ [0.7.2]: https://github.com/accodeing/fortnox-api/compare/v0.7.1...v0.7.2
46
+ [0.7.1]: https://github.com/accodeing/fortnox-api/compare/v0.7.0...v0.7.1
47
+ [0.7.0]: https://github.com/accodeing/fortnox-api/compare/v0.6.3...v0.7.0
48
+ [0.6.3]: https://github.com/accodeing/fortnox-api/compare/v0.6.2...v0.6.3
data/README.md CHANGED
@@ -3,24 +3,20 @@
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 December 2020):
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 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.
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.
24
20
 
25
21
  # Architecture overview
26
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.
@@ -84,12 +80,7 @@ These are responsible for the mapping between our plain old Ruby object models a
84
80
 
85
81
  # Requirements
86
82
 
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 :)
83
+ This gem is built for Ruby 2.5 or higher (see Travis configuration file for what versions we are testing against).
93
84
 
94
85
  ## Installation
95
86
 
@@ -199,5 +190,9 @@ updated_customer.name #=> "Ned Stark"
199
190
 
200
191
  The update method takes an implicit hash of attributes to update, so you can update as many as you like in one go.
201
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
+
202
197
  # Contributing
203
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
@@ -9,13 +9,13 @@ Gem::Specification.new do |spec| # rubocop:disable Metrics/BlockLength
9
9
  spec.name = 'fortnox-api'
10
10
  spec.version = Fortnox::API::VERSION
11
11
  spec.authors = ['Jonas Schubert Erlandsson', 'Hannes Elvemyr', 'Felix Holmgren']
12
- spec.email = ['info@my-codeworks.com']
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 '\
15
15
  'number of objects that behave a lot like ActiveRecord instances, giving you access to methods '\
16
16
  'like `all`, `find`, `find_by_...` and so on. And each individual instance can be easily'\
17
17
  'persistable to Fortnox again using the `save` method.'
18
- spec.homepage = 'http://github.com/my-codeworks/fortnox-api'
18
+ spec.homepage = 'http://github.com/accodeing/fortnox-api'
19
19
  spec.license = 'LGPL-3.0'
20
20
 
21
21
  spec.files = `git ls-files -z`.split("\x0")
@@ -23,22 +23,22 @@ 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.5'
27
+ spec.add_dependency 'countries', '~> 3.0'
27
28
  spec.add_dependency 'dry-struct', '~> 0.1'
28
- spec.add_dependency 'dry-types', '~> 0.8'
29
- # TODO: Temporary lockdown. See issue #103 for more info.
30
- spec.add_dependency 'httparty', '~> 0.14.0'
29
+ spec.add_dependency 'dry-types', '~> 0.8', '< 0.13.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'
36
- spec.add_development_dependency 'rake', '~> 10.4'
36
+ spec.add_development_dependency 'rake', '>= 12.3.3'
37
37
  spec.add_development_dependency 'rspec', '~> 3.2'
38
38
  spec.add_development_dependency 'rspec-collection_matchers', '~> 0'
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_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
@@ -72,13 +72,18 @@ 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/
75
+ key = camelcase_to_underscore(key) unless key.match?(/\A[A-Z]+\z/)
76
+ key = strip_at_symbol(key) if key.match?(/\A@.*\z/)
76
77
  key.downcase.to_sym
77
78
  end
78
79
 
79
80
  def camelcase_to_underscore(key)
80
81
  key.gsub(/([A-Z]+)([A-Z][a-z])/, '\1_\2').gsub(/([a-z])([A-Z])/, '\1_\2')
81
82
  end
83
+
84
+ def strip_at_symbol(key)
85
+ key.gsub(/\A@/, '')
86
+ end
82
87
  end
83
88
  end
84
89
  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 CountryString
9
+ extend CanonicalNameSym
10
+
11
+ CountryMapper = 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, CountryMapper)
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