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