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.
- 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
|
[![Gem version](https://img.shields.io/gem/v/fortnox-api.svg?style=flat-square)](https://rubygems.org/gems/fortnox-api)
|
6
|
-
[![Build
|
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
|
11
|
-
[![Maintainability](https://api.codeclimate.com/v1/badges/
|
12
|
-
[![Test Coverage](https://api.codeclimate.com/v1/badges/
|
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
|
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
|