fortnox-api 0.6.2 → 0.8.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.
- checksums.yaml +5 -5
- data/.rubocop.yml +5 -1
- data/.travis.yml +20 -22
- data/CHANGELOG.md +48 -0
- data/README.md +14 -19
- data/Rakefile +5 -0
- data/fortnox-api.gemspec +10 -10
- data/lib/fortnox/api/mappers.rb +5 -38
- data/lib/fortnox/api/mappers/base.rb +2 -24
- data/lib/fortnox/api/mappers/base/canonical_name_sym.rb +21 -0
- data/lib/fortnox/api/mappers/base/from_json.rb +6 -1
- data/lib/fortnox/api/mappers/value/array.rb +18 -0
- data/lib/fortnox/api/mappers/value/country_string.rb +24 -0
- data/lib/fortnox/api/mappers/value/date.rb +11 -0
- data/lib/fortnox/api/mappers/value/hash.rb +16 -0
- data/lib/fortnox/api/mappers/value/identity.rb +18 -0
- data/lib/fortnox/api/models/document.rb +6 -3
- data/lib/fortnox/api/models/invoice.rb +1 -1
- data/lib/fortnox/api/models/order.rb +1 -1
- data/lib/fortnox/api/repositories/base.rb +9 -11
- data/lib/fortnox/api/request_handling.rb +0 -1
- data/lib/fortnox/api/types.rb +40 -3
- data/lib/fortnox/api/types/enums.rb +36 -31
- data/lib/fortnox/api/types/shim/country_string.rb +10 -0
- data/lib/fortnox/api/version.rb +1 -1
- data/spec/fortnox/api/circular_queue_spec.rb +52 -0
- data/spec/fortnox/api/mappers/base/canonical_name_sym_spec.rb +34 -0
- data/spec/fortnox/api/mappers/base_spec.rb +33 -43
- data/spec/fortnox/api/mappers/contexts/json_conversion.rb +1 -1
- data/spec/fortnox/api/repositories/article_spec.rb +4 -2
- data/spec/fortnox/api/repositories/base_spec.rb +28 -8
- data/spec/fortnox/api/repositories/customer_spec.rb +29 -1
- data/spec/fortnox/api/repositories/invoice_spec.rb +147 -3
- data/spec/fortnox/api/repositories/order_spec.rb +2 -2
- data/spec/fortnox/api/repositories/project_spec.rb +1 -1
- data/spec/fortnox/api/repositories/terms_of_payment_spec.rb +4 -2
- data/spec/fortnox/api/repositories/unit_spec.rb +6 -3
- data/spec/fortnox/api/types/account_number_spec.rb +19 -15
- data/spec/fortnox/api/types/country_code_spec.rb +42 -0
- data/spec/fortnox/api/types/country_spec.rb +67 -0
- data/spec/fortnox/api/types/email_spec.rb +8 -7
- data/spec/fortnox/api/types/enums_spec.rb +1 -1
- data/spec/fortnox/api/types/examples/document_row.rb +1 -1
- data/spec/fortnox/api/types/housework_types_spec.rb +151 -34
- data/spec/fortnox/api_spec.rb +3 -1
- data/spec/vcr_cassettes/articles/all.yml +40 -10
- data/spec/vcr_cassettes/articles/find_by_hash_failure.yml +21 -8
- data/spec/vcr_cassettes/articles/find_failure.yml +21 -8
- data/spec/vcr_cassettes/articles/find_id_1.yml +22 -9
- data/spec/vcr_cassettes/articles/find_new.yml +24 -11
- data/spec/vcr_cassettes/articles/multi_param_find_by_hash.yml +21 -8
- data/spec/vcr_cassettes/articles/save_new.yml +22 -8
- data/spec/vcr_cassettes/articles/save_old.yml +24 -11
- data/spec/vcr_cassettes/articles/save_with_specially_named_attribute.yml +22 -8
- data/spec/vcr_cassettes/articles/search_by_name.yml +21 -8
- data/spec/vcr_cassettes/articles/search_miss.yml +21 -8
- data/spec/vcr_cassettes/articles/search_with_special_char.yml +21 -8
- data/spec/vcr_cassettes/articles/single_param_find_by_hash.yml +33 -10
- data/spec/vcr_cassettes/customers/all.yml +26 -13
- data/spec/vcr_cassettes/customers/find_by_hash_failure.yml +21 -8
- data/spec/vcr_cassettes/customers/find_failure.yml +21 -8
- data/spec/vcr_cassettes/customers/find_id_1.yml +22 -9
- data/spec/vcr_cassettes/customers/find_new.yml +24 -11
- data/spec/vcr_cassettes/customers/multi_param_find_by_hash.yml +21 -8
- data/spec/vcr_cassettes/customers/save_new.yml +21 -7
- data/spec/vcr_cassettes/customers/save_new_with_country_code_SE.yml +60 -0
- data/spec/vcr_cassettes/customers/save_old.yml +23 -10
- data/spec/vcr_cassettes/customers/save_with_specially_named_attribute.yml +21 -7
- data/spec/vcr_cassettes/customers/search_by_name.yml +32 -10
- data/spec/vcr_cassettes/customers/search_miss.yml +21 -8
- data/spec/vcr_cassettes/customers/search_with_special_char.yml +21 -8
- data/spec/vcr_cassettes/customers/single_param_find_by_hash.yml +22 -9
- data/spec/vcr_cassettes/invoices/all.yml +118 -67
- data/spec/vcr_cassettes/invoices/filter_hit.yml +26 -10
- data/spec/vcr_cassettes/invoices/filter_invalid.yml +20 -6
- data/spec/vcr_cassettes/invoices/find_by_hash_failure.yml +21 -8
- data/spec/vcr_cassettes/invoices/find_failure.yml +21 -8
- data/spec/vcr_cassettes/invoices/find_id_1.yml +23 -10
- data/spec/vcr_cassettes/invoices/find_new.yml +26 -14
- data/spec/vcr_cassettes/invoices/multi_param_find_by_hash.yml +23 -10
- data/spec/vcr_cassettes/invoices/save_new.yml +23 -10
- data/spec/vcr_cassettes/invoices/save_new_with_comments.yml +61 -0
- data/spec/vcr_cassettes/invoices/save_new_with_country.yml +60 -0
- data/spec/vcr_cassettes/invoices/save_new_with_country_GB.yml +61 -0
- data/spec/vcr_cassettes/invoices/save_new_with_country_KR.yml +61 -0
- data/spec/vcr_cassettes/invoices/save_new_with_country_Norge.yml +60 -0
- data/spec/vcr_cassettes/invoices/save_new_with_country_Norway.yml +60 -0
- data/spec/vcr_cassettes/invoices/save_new_with_country_Sverige.yml +60 -0
- data/spec/vcr_cassettes/invoices/save_new_with_country_VA.yml +61 -0
- data/spec/vcr_cassettes/invoices/save_new_with_country_VI.yml +61 -0
- data/spec/vcr_cassettes/invoices/save_new_with_country_empty_string.yml +60 -0
- data/spec/vcr_cassettes/invoices/save_new_with_country_nil.yml +60 -0
- data/spec/vcr_cassettes/invoices/save_old.yml +25 -13
- data/spec/vcr_cassettes/invoices/save_old_with_empty_comments.yml +61 -0
- data/spec/vcr_cassettes/invoices/save_old_with_empty_country.yml +60 -0
- data/spec/vcr_cassettes/invoices/save_old_with_nil_comments.yml +61 -0
- data/spec/vcr_cassettes/invoices/save_old_with_nil_country.yml +60 -0
- data/spec/vcr_cassettes/invoices/save_with_nested_model.yml +23 -10
- data/spec/vcr_cassettes/invoices/save_with_specially_named_attribute.yml +23 -10
- data/spec/vcr_cassettes/invoices/search_by_name.yml +28 -11
- data/spec/vcr_cassettes/invoices/search_miss.yml +21 -8
- data/spec/vcr_cassettes/invoices/search_with_special_char.yml +21 -8
- data/spec/vcr_cassettes/invoices/single_param_find_by_hash.yml +24 -11
- data/spec/vcr_cassettes/orders/all.yml +120 -107
- data/spec/vcr_cassettes/orders/filter_hit.yml +28 -12
- data/spec/vcr_cassettes/orders/filter_invalid.yml +20 -6
- data/spec/vcr_cassettes/orders/find_by_hash_failure.yml +21 -8
- data/spec/vcr_cassettes/orders/find_failure.yml +21 -8
- data/spec/vcr_cassettes/orders/find_id_1.yml +23 -10
- data/spec/vcr_cassettes/orders/find_new.yml +26 -14
- data/spec/vcr_cassettes/orders/housework_invalid_tax_reduction_type.yml +57 -0
- data/spec/vcr_cassettes/orders/housework_othercoses_invalid.yml +57 -0
- data/spec/vcr_cassettes/orders/housework_type_babysitting.yml +24 -10
- data/spec/vcr_cassettes/orders/housework_type_cleaning.yml +24 -10
- data/spec/vcr_cassettes/orders/housework_type_construction.yml +24 -10
- data/spec/vcr_cassettes/orders/housework_type_cooking.yml +21 -7
- data/spec/vcr_cassettes/orders/housework_type_electricity.yml +24 -10
- data/spec/vcr_cassettes/orders/housework_type_gardening.yml +24 -10
- data/spec/vcr_cassettes/orders/housework_type_glassmetalwork.yml +24 -10
- data/spec/vcr_cassettes/orders/housework_type_grounddrainagework.yml +24 -10
- data/spec/vcr_cassettes/orders/housework_type_hvac.yml +24 -10
- data/spec/vcr_cassettes/orders/housework_type_itservices.yml +60 -0
- data/spec/vcr_cassettes/orders/housework_type_majorappliancerepair.yml +60 -0
- data/spec/vcr_cassettes/orders/housework_type_masonry.yml +24 -10
- data/spec/vcr_cassettes/orders/housework_type_movingservices.yml +60 -0
- data/spec/vcr_cassettes/orders/housework_type_othercare.yml +24 -10
- data/spec/vcr_cassettes/orders/housework_type_othercosts.yml +24 -10
- data/spec/vcr_cassettes/orders/housework_type_paintingwallpapering.yml +24 -10
- data/spec/vcr_cassettes/orders/housework_type_snowplowing.yml +24 -10
- data/spec/vcr_cassettes/orders/housework_type_textileclothing.yml +24 -10
- data/spec/vcr_cassettes/orders/housework_type_tutoring.yml +21 -7
- data/spec/vcr_cassettes/orders/housework_without_tax_reduction_type.yml +57 -0
- data/spec/vcr_cassettes/orders/multi_param_find_by_hash.yml +22 -9
- data/spec/vcr_cassettes/orders/save_new.yml +23 -10
- data/spec/vcr_cassettes/orders/save_old.yml +25 -13
- data/spec/vcr_cassettes/orders/save_with_nested_model.yml +23 -10
- data/spec/vcr_cassettes/orders/search_by_name.yml +25 -11
- data/spec/vcr_cassettes/orders/search_miss.yml +21 -8
- data/spec/vcr_cassettes/orders/search_with_special_char.yml +21 -8
- data/spec/vcr_cassettes/orders/single_param_find_by_hash.yml +23 -10
- data/spec/vcr_cassettes/projects/all.yml +41 -16
- data/spec/vcr_cassettes/projects/find_by_hash_failure.yml +21 -8
- data/spec/vcr_cassettes/projects/find_failure.yml +21 -8
- data/spec/vcr_cassettes/projects/find_id_1.yml +21 -8
- data/spec/vcr_cassettes/projects/find_new.yml +24 -11
- data/spec/vcr_cassettes/projects/multi_param_find_by_hash.yml +23 -10
- data/spec/vcr_cassettes/projects/save_new.yml +22 -8
- data/spec/vcr_cassettes/projects/save_old.yml +24 -11
- data/spec/vcr_cassettes/projects/single_param_find_by_hash.yml +22 -9
- data/spec/vcr_cassettes/termsofpayments/all.yml +31 -14
- data/spec/vcr_cassettes/termsofpayments/find_failure.yml +21 -8
- data/spec/vcr_cassettes/termsofpayments/find_id_1.yml +22 -9
- data/spec/vcr_cassettes/termsofpayments/find_new.yml +23 -10
- data/spec/vcr_cassettes/termsofpayments/save_new.yml +22 -8
- data/spec/vcr_cassettes/termsofpayments/save_old.yml +23 -10
- data/spec/vcr_cassettes/units/all.yml +31 -12
- data/spec/vcr_cassettes/units/find_failure.yml +21 -8
- data/spec/vcr_cassettes/units/find_id_1.yml +21 -8
- data/spec/vcr_cassettes/units/find_new.yml +23 -12
- data/spec/vcr_cassettes/units/save_new.yml +22 -10
- data/spec/vcr_cassettes/units/save_old.yml +23 -12
- data/spec/vcr_cassettes/units/save_with_specially_named_attribute.yml +22 -10
- data/temp.txt +1 -0
- metadata +99 -21
- data/spec/support/matchers/type/have_country_code_matcher.rb +0 -15
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 02c5fbd6c659d3c6cc4e9ed8dfef6e739ded62fc33107623f4dddc13d33f6672
|
4
|
+
data.tar.gz: 14f0815a2fd32e98055d71ef231da2b6fac4b95ecfd9dfcda59b88d1c1445c63
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 293665ff9e0b860e88c7c6c78fbcfdd0b8a8047444f23cd0560d504442e1a0ac3439c52349413cac63e0c5973d1db74dabcf7ebdd9c10bc3f1b7de922db58cbc
|
7
|
+
data.tar.gz: 011b4785ce46af9c4cd57939431f6b09dc6ab44d650023616fe7b0784dcde890727999eb918ac3c3db311afaaff8785d240c54e5c30f198a630b9a1bf41483b7
|
data/.rubocop.yml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
require: rubocop-rspec
|
2
2
|
|
3
3
|
AllCops:
|
4
|
-
TargetRubyVersion: 2.
|
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/**/*'
|
data/.travis.yml
CHANGED
@@ -1,31 +1,29 @@
|
|
1
1
|
env:
|
2
2
|
global:
|
3
|
-
|
3
|
+
- CC_TEST_REPORTER_ID=43ea0acb059b164537ce31bf67e03e1cb552d63df1ad3e9bd95dc3d844697bb4
|
4
4
|
language: ruby
|
5
5
|
rvm:
|
6
|
-
|
7
|
-
|
8
|
-
|
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:
|
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
|
-
|
26
|
-
|
27
|
-
|
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
|
-
|
23
|
+
- bundle exec rspec
|
30
24
|
after_script:
|
31
|
-
|
25
|
+
- "./cc-test-reporter after-build --exit-code $TRAVIS_TEST_RESULT"
|
26
|
+
branches:
|
27
|
+
only:
|
28
|
+
- master
|
29
|
+
- development
|
data/CHANGELOG.md
ADDED
@@ -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
|
[](https://rubygems.org/gems/fortnox-api)
|
6
|
-
[](https://gemnasium.com/my-codeworks/fortnox-api)
|
6
|
+
[](https://travis-ci.com/accodeing/fortnox-api)
|
8
7
|
|
9
8
|
# Status for development
|
10
|
-
[](https://travis-ci.com/accodeing/fortnox-api)
|
10
|
+
[](https://codeclimate.com/github/accodeing/fortnox-api/maintainability)
|
11
|
+
[](https://codeclimate.com/github/accodeing/fortnox-api/test_coverage)
|
13
12
|
|
14
|
-
The rough status of this project is as follows (as of
|
15
|
-
*
|
16
|
-
*
|
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
|
-
*
|
20
|
-
* A few models implemented. Right now we
|
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
|
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
data/fortnox-api.gemspec
CHANGED
@@ -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@
|
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/
|
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.
|
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
|
-
|
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', '~>
|
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', '
|
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', '~>
|
43
|
-
spec.add_development_dependency 'webmock', '~>
|
42
|
+
spec.add_development_dependency 'vcr', '~> 4.0'
|
43
|
+
spec.add_development_dependency 'webmock', '~> 3.5'
|
44
44
|
end
|
data/lib/fortnox/api/mappers.rb
CHANGED
@@ -2,44 +2,11 @@
|
|
2
2
|
|
3
3
|
require 'fortnox/api/types'
|
4
4
|
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
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
|
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,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
|