fortnox-api 0.6.3 → 0.7.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/.rubocop.yml +4 -0
- data/.travis.yml +20 -15
- data/CHANGELOG.md +18 -0
- data/README.md +11 -19
- data/fortnox-api.gemspec +6 -6
- 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/value/array.rb +18 -0
- data/lib/fortnox/api/mappers/value/country_code_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 +1 -1
- 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 +19 -3
- data/lib/fortnox/api/types/enums.rb +0 -23
- data/lib/fortnox/api/types/shim/country_code_string.rb +10 -0
- data/lib/fortnox/api/types/sized.rb +3 -16
- 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 +2 -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/country_code_spec.rb +76 -0
- data/spec/fortnox/api/types/email_spec.rb +8 -7
- data/spec/fortnox/api/types/enums_spec.rb +0 -1
- data/spec/fortnox/api/types/examples/document_row.rb +1 -1
- data/spec/fortnox/api_spec.rb +3 -1
- data/spec/vcr_cassettes/articles/all.yml +22 -8
- data/spec/vcr_cassettes/articles/find_by_hash_failure.yml +6 -6
- data/spec/vcr_cassettes/articles/find_failure.yml +6 -6
- data/spec/vcr_cassettes/articles/find_id_1.yml +7 -7
- data/spec/vcr_cassettes/articles/find_new.yml +9 -9
- data/spec/vcr_cassettes/articles/multi_param_find_by_hash.yml +6 -6
- data/spec/vcr_cassettes/articles/save_new.yml +8 -8
- data/spec/vcr_cassettes/articles/save_old.yml +9 -9
- data/spec/vcr_cassettes/articles/save_with_specially_named_attribute.yml +8 -8
- data/spec/vcr_cassettes/articles/search_by_name.yml +6 -6
- data/spec/vcr_cassettes/articles/search_miss.yml +6 -6
- data/spec/vcr_cassettes/articles/search_with_special_char.yml +6 -6
- data/spec/vcr_cassettes/articles/single_param_find_by_hash.yml +18 -8
- data/spec/vcr_cassettes/customers/all.yml +9 -9
- data/spec/vcr_cassettes/customers/find_by_hash_failure.yml +6 -6
- data/spec/vcr_cassettes/customers/find_failure.yml +6 -6
- data/spec/vcr_cassettes/customers/find_id_1.yml +7 -7
- data/spec/vcr_cassettes/customers/find_new.yml +9 -9
- data/spec/vcr_cassettes/customers/multi_param_find_by_hash.yml +5 -5
- data/spec/vcr_cassettes/customers/save_new.yml +7 -7
- data/spec/vcr_cassettes/customers/save_old.yml +8 -8
- data/spec/vcr_cassettes/customers/save_with_specially_named_attribute.yml +7 -7
- data/spec/vcr_cassettes/customers/search_by_name.yml +16 -8
- data/spec/vcr_cassettes/customers/search_miss.yml +6 -6
- data/spec/vcr_cassettes/customers/search_with_special_char.yml +6 -6
- data/spec/vcr_cassettes/customers/single_param_find_by_hash.yml +7 -7
- data/spec/vcr_cassettes/invoices/all.yml +100 -65
- data/spec/vcr_cassettes/invoices/filter_hit.yml +11 -8
- data/spec/vcr_cassettes/invoices/filter_invalid.yml +6 -6
- data/spec/vcr_cassettes/invoices/find_by_hash_failure.yml +6 -6
- data/spec/vcr_cassettes/invoices/find_failure.yml +6 -6
- data/spec/vcr_cassettes/invoices/find_id_1.yml +7 -7
- data/spec/vcr_cassettes/invoices/find_new.yml +11 -12
- data/spec/vcr_cassettes/invoices/multi_param_find_by_hash.yml +8 -8
- data/spec/vcr_cassettes/invoices/save_new.yml +9 -10
- data/spec/vcr_cassettes/invoices/save_new_with_comments.yml +47 -0
- data/spec/vcr_cassettes/invoices/save_new_with_country.yml +46 -0
- data/spec/vcr_cassettes/invoices/save_new_with_country_GB.yml +47 -0
- data/spec/vcr_cassettes/invoices/save_new_with_country_KR.yml +47 -0
- data/spec/vcr_cassettes/invoices/save_new_with_country_Norge.yml +46 -0
- data/spec/vcr_cassettes/invoices/save_new_with_country_Norway.yml +46 -0
- data/spec/vcr_cassettes/invoices/save_new_with_country_Sverige.yml +46 -0
- data/spec/vcr_cassettes/invoices/save_new_with_country_VA.yml +47 -0
- data/spec/vcr_cassettes/invoices/save_new_with_country_VI.yml +47 -0
- data/spec/vcr_cassettes/invoices/save_new_with_country_empty_string.yml +46 -0
- data/spec/vcr_cassettes/invoices/save_new_with_country_nil.yml +46 -0
- data/spec/vcr_cassettes/invoices/save_old.yml +10 -11
- data/spec/vcr_cassettes/invoices/save_old_with_empty_comments.yml +48 -0
- data/spec/vcr_cassettes/invoices/save_old_with_empty_country.yml +47 -0
- data/spec/vcr_cassettes/invoices/save_old_with_nil_comments.yml +48 -0
- data/spec/vcr_cassettes/invoices/save_old_with_nil_country.yml +47 -0
- data/spec/vcr_cassettes/invoices/save_with_nested_model.yml +9 -10
- data/spec/vcr_cassettes/invoices/save_with_specially_named_attribute.yml +9 -10
- data/spec/vcr_cassettes/invoices/search_by_name.yml +13 -9
- data/spec/vcr_cassettes/invoices/search_miss.yml +6 -6
- data/spec/vcr_cassettes/invoices/search_with_special_char.yml +6 -6
- data/spec/vcr_cassettes/invoices/single_param_find_by_hash.yml +9 -9
- data/spec/vcr_cassettes/orders/all.yml +105 -105
- data/spec/vcr_cassettes/orders/filter_hit.yml +13 -10
- data/spec/vcr_cassettes/orders/filter_invalid.yml +6 -6
- data/spec/vcr_cassettes/orders/find_by_hash_failure.yml +6 -6
- data/spec/vcr_cassettes/orders/find_failure.yml +6 -6
- data/spec/vcr_cassettes/orders/find_id_1.yml +8 -8
- data/spec/vcr_cassettes/orders/find_new.yml +11 -12
- data/spec/vcr_cassettes/orders/housework_type_babysitting.yml +9 -9
- data/spec/vcr_cassettes/orders/housework_type_cleaning.yml +9 -9
- data/spec/vcr_cassettes/orders/housework_type_construction.yml +9 -9
- data/spec/vcr_cassettes/orders/housework_type_cooking.yml +6 -6
- data/spec/vcr_cassettes/orders/housework_type_electricity.yml +9 -9
- data/spec/vcr_cassettes/orders/housework_type_gardening.yml +9 -9
- data/spec/vcr_cassettes/orders/housework_type_glassmetalwork.yml +9 -9
- data/spec/vcr_cassettes/orders/housework_type_grounddrainagework.yml +9 -9
- data/spec/vcr_cassettes/orders/housework_type_hvac.yml +9 -9
- data/spec/vcr_cassettes/orders/housework_type_masonry.yml +9 -9
- data/spec/vcr_cassettes/orders/housework_type_othercare.yml +9 -9
- data/spec/vcr_cassettes/orders/housework_type_othercosts.yml +9 -9
- data/spec/vcr_cassettes/orders/housework_type_paintingwallpapering.yml +9 -9
- data/spec/vcr_cassettes/orders/housework_type_snowplowing.yml +9 -9
- data/spec/vcr_cassettes/orders/housework_type_textileclothing.yml +9 -9
- data/spec/vcr_cassettes/orders/housework_type_tutoring.yml +6 -6
- data/spec/vcr_cassettes/orders/multi_param_find_by_hash.yml +7 -7
- data/spec/vcr_cassettes/orders/save_new.yml +9 -10
- data/spec/vcr_cassettes/orders/save_old.yml +10 -11
- data/spec/vcr_cassettes/orders/save_with_nested_model.yml +9 -10
- data/spec/vcr_cassettes/orders/search_by_name.yml +9 -8
- data/spec/vcr_cassettes/orders/search_miss.yml +6 -6
- data/spec/vcr_cassettes/orders/search_with_special_char.yml +6 -6
- data/spec/vcr_cassettes/orders/single_param_find_by_hash.yml +8 -8
- data/spec/vcr_cassettes/projects/all.yml +18 -8
- data/spec/vcr_cassettes/projects/find_by_hash_failure.yml +6 -6
- data/spec/vcr_cassettes/projects/find_failure.yml +6 -6
- data/spec/vcr_cassettes/projects/find_id_1.yml +6 -6
- data/spec/vcr_cassettes/projects/find_new.yml +9 -9
- data/spec/vcr_cassettes/projects/multi_param_find_by_hash.yml +7 -7
- data/spec/vcr_cassettes/projects/save_new.yml +8 -8
- data/spec/vcr_cassettes/projects/save_old.yml +8 -8
- data/spec/vcr_cassettes/projects/single_param_find_by_hash.yml +7 -7
- data/spec/vcr_cassettes/termsofpayments/all.yml +10 -7
- data/spec/vcr_cassettes/termsofpayments/find_failure.yml +6 -6
- data/spec/vcr_cassettes/termsofpayments/find_id_1.yml +6 -6
- data/spec/vcr_cassettes/termsofpayments/find_new.yml +8 -8
- data/spec/vcr_cassettes/termsofpayments/save_new.yml +8 -8
- data/spec/vcr_cassettes/termsofpayments/save_old.yml +8 -8
- data/spec/vcr_cassettes/units/all.yml +14 -10
- data/spec/vcr_cassettes/units/find_failure.yml +6 -6
- data/spec/vcr_cassettes/units/find_id_1.yml +6 -6
- data/spec/vcr_cassettes/units/find_new.yml +8 -10
- data/spec/vcr_cassettes/units/save_new.yml +8 -10
- data/spec/vcr_cassettes/units/save_old.yml +8 -10
- data/spec/vcr_cassettes/units/save_with_specially_named_attribute.yml +8 -10
- data/temp.txt +1 -0
- metadata +71 -13
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: a174ee3cf9c8f2a5ee1a43ce636806e017e1462263eddfdd5e91968025144fb4
|
4
|
+
data.tar.gz: d5f3c46c81e25009be272bee9bdfafe64e657f4ff5b7a131c272a49b8f9382f5
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 942b59f8380781117425fbcdb713bbf05c3e4651779e517c89b1c1cd339bc521a19a79ca2df9c02098a472eabc31a5b9ae9f1b69945bd21c54e727075d4c66f9
|
7
|
+
data.tar.gz: 598dd75a8a6d7f8af1b84e70a331192df243ebddad2174b09f43161767ab84b0e4c08dc8c020e55b9fa8928d8d3419f6ba7a99e2b5c6d21d541691d0eaacda17
|
data/.rubocop.yml
CHANGED
data/.travis.yml
CHANGED
@@ -1,31 +1,36 @@
|
|
1
1
|
env:
|
2
2
|
global:
|
3
|
-
- CC_TEST_REPORTER_ID=
|
3
|
+
- CC_TEST_REPORTER_ID=43ea0acb059b164537ce31bf67e03e1cb552d63df1ad3e9bd95dc3d844697bb4
|
4
4
|
language: ruby
|
5
5
|
rvm:
|
6
|
-
- 2.3.0
|
7
|
-
- 2.3.1
|
8
|
-
- 2.3.2
|
9
|
-
- 2.3.3
|
10
|
-
- 2.3.4
|
11
|
-
- 2.3.5
|
12
|
-
- 2.3.6
|
13
6
|
- 2.4.0
|
14
7
|
- 2.4.1
|
15
8
|
- 2.4.2
|
16
9
|
- 2.4.3
|
10
|
+
- 2.4.6
|
17
11
|
- 2.5.0
|
18
|
-
|
19
|
-
|
20
|
-
|
12
|
+
- 2.5.5
|
13
|
+
- 2.6.0
|
14
|
+
- 2.6.3
|
15
|
+
- 2.7.0-preview1
|
21
16
|
notifications:
|
22
|
-
slack:
|
17
|
+
slack:
|
18
|
+
secure: UEYDtwLaQgAoMRY7ct1y0Uu5HbInMwrLo+TiYRc3rjDrzqDfDyInEr3bpckyPJ79lnzccrFezMdY4jWzRjmsvQzvYMu+DWJ1mAWOa/9Ws4YZ8nHd5KqXxVQ0EqPWuWwMOyOdyy3DK/MjUOobGSc0//Pv5DeaAAEBKLJzN+e1BQM=
|
23
19
|
email: false
|
20
|
+
before_install:
|
21
|
+
- gem update --system
|
22
|
+
- gem install bundler
|
23
|
+
cache: bundler
|
24
24
|
before_script:
|
25
|
-
- curl -L https://codeclimate.com/downloads/test-reporter/test-reporter-latest-linux-amd64
|
25
|
+
- curl -L https://codeclimate.com/downloads/test-reporter/test-reporter-latest-linux-amd64
|
26
|
+
> ./cc-test-reporter
|
26
27
|
- chmod +x ./cc-test-reporter
|
27
|
-
- ./cc-test-reporter before-build
|
28
|
+
- "./cc-test-reporter before-build"
|
28
29
|
script:
|
29
30
|
- bundle exec rspec
|
30
31
|
after_script:
|
31
|
-
- ./cc-test-reporter after-build --exit-code $TRAVIS_TEST_RESULT
|
32
|
+
- "./cc-test-reporter after-build --exit-code $TRAVIS_TEST_RESULT"
|
33
|
+
branches:
|
34
|
+
only:
|
35
|
+
- master
|
36
|
+
- development
|
data/CHANGELOG.md
ADDED
@@ -0,0 +1,18 @@
|
|
1
|
+
# Changelog
|
2
|
+
All notable changes to this project will be documented in this file.
|
3
|
+
|
4
|
+
The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/)
|
5
|
+
and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html).
|
6
|
+
|
7
|
+
## [0.7.0]
|
8
|
+
### Added
|
9
|
+
- Adds build test for Ruby 2.6.0, 2.6.3 and 2.7.0-preview.
|
10
|
+
|
11
|
+
### Removed
|
12
|
+
- Drops support for Ruby < 2.4.0 since they are deprecated
|
13
|
+
|
14
|
+
### Fixed
|
15
|
+
- Country attribute for Invoice and Order is now validated correctly.
|
16
|
+
- Fixes deprecation warnings
|
17
|
+
|
18
|
+
[0.7.0]: https://github.com/accodeing/fortnox-api/compare/v0.7.0...v0.6.3
|
data/README.md
CHANGED
@@ -3,24 +3,21 @@
|
|
3
3
|
|
4
4
|
# Status for master
|
5
5
|
[![Gem version](https://img.shields.io/gem/v/fortnox-api.svg?style=flat-square)](https://rubygems.org/gems/fortnox-api)
|
6
|
-
[![Build
|
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 October
|
15
|
-
*
|
16
|
-
*
|
13
|
+
The rough status of this project is as follows (as of October 2018):
|
14
|
+
* Development is not as active as it used to be, but the project is not forgotten. We have an app running this gem in production and it works like a charm for what we do.
|
15
|
+
* We are planning on generalize REST API's in general with our [rest_easy gem](https://github.com/accodeing/rest_easy).
|
17
16
|
* Basic structure complete. Things like getting customers and invoices, updating and saving etc.
|
18
17
|
* Some advanced features implemented, for instance support for multiple Access Tokens and filtering entities.
|
19
|
-
*
|
20
|
-
* A few models implemented. Right now we
|
21
|
-
* Massive refactorings no longer occurs weekly :)
|
22
|
-
|
23
|
-
The goal is to have a production ready version that covers at least the `Invoice`, `Order`, `Customer` and `Project` models by January.
|
18
|
+
* We have ideas for more advanced features, like sorting entities, pagination of results but nothing in the pipeline right now.
|
19
|
+
* A few models implemented. Right now we pretty good support for `Customer`, `Invoice`, `Order`, `Article`, `Label` and `Project`. Adding more models in general is quick and easy (that's the whole point with this gem), see the developer guide further down.
|
20
|
+
* Massive refactorings no longer occurs weekly :)
|
24
21
|
|
25
22
|
# Architecture overview
|
26
23
|
The gem is structured with distinct models for the tasks of data, JSON mapping and saving state. These are called: model, type, mapper and repository.
|
@@ -84,12 +81,7 @@ These are responsible for the mapping between our plain old Ruby object models a
|
|
84
81
|
|
85
82
|
# Requirements
|
86
83
|
|
87
|
-
This gem is build for Ruby 2.
|
88
|
-
is [officially outdated and unsupported](https://www.ruby-lang.org/en/news/2016/03/30/ruby-2-1-9-released/)
|
89
|
-
it won't work on older versions.
|
90
|
-
|
91
|
-
If you want or need Ruby 1.9 compatibility please submit a pull request.
|
92
|
-
Instructions can be found below :)
|
84
|
+
This gem is build for Ruby 2.4 or higher (see Travis configuration file for what versions we are testing against).
|
93
85
|
|
94
86
|
## Installation
|
95
87
|
|
data/fortnox-api.gemspec
CHANGED
@@ -23,13 +23,13 @@ Gem::Specification.new do |spec| # rubocop:disable Metrics/BlockLength
|
|
23
23
|
spec.test_files = spec.files.grep(%r{^(spec)/})
|
24
24
|
spec.require_paths = ['lib']
|
25
25
|
|
26
|
-
spec.required_ruby_version = '>= 2.
|
26
|
+
spec.required_ruby_version = '>= 2.4'
|
27
|
+
spec.add_dependency 'countries', '~> 3.0'
|
27
28
|
spec.add_dependency 'dry-struct', '~> 0.1'
|
28
29
|
spec.add_dependency 'dry-types', '~> 0.8', '< 0.13.0'
|
29
|
-
|
30
|
-
spec.add_dependency 'httparty', '~> 0.14.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'
|
@@ -39,6 +39,6 @@ Gem::Specification.new do |spec| # rubocop:disable Metrics/BlockLength
|
|
39
39
|
spec.add_development_dependency 'rubocop', '~> 0.52.0'
|
40
40
|
spec.add_development_dependency 'rubocop-rspec', '~> 1.22.2'
|
41
41
|
spec.add_development_dependency 'simplecov', '~> 0.15'
|
42
|
-
spec.add_development_dependency 'vcr', '~>
|
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_code_string'
|
7
|
+
require 'fortnox/api/mappers/value/date'
|
8
|
+
require 'fortnox/api/mappers/value/hash'
|
9
|
+
require 'fortnox/api/mappers/value/identity'
|
43
10
|
require 'fortnox/api/mappers/customer'
|
44
11
|
require 'fortnox/api/mappers/default_delivery_types'
|
45
12
|
require 'fortnox/api/mappers/default_templates'
|
@@ -1,5 +1,6 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
require 'fortnox/api/mappers/base/canonical_name_sym'
|
3
4
|
require 'fortnox/api/mappers/base/from_json'
|
4
5
|
require 'fortnox/api/mappers/base/to_json'
|
5
6
|
|
@@ -9,30 +10,7 @@ module Fortnox
|
|
9
10
|
class Base
|
10
11
|
include FromJSON
|
11
12
|
include ToJSON
|
12
|
-
|
13
|
-
Hash = lambda do |hash|
|
14
|
-
hash.each do |key, value|
|
15
|
-
name = Fortnox::API::Mapper::Base.canonical_name_sym(value)
|
16
|
-
hash[key] = Fortnox::API::Registry[name].call(value)
|
17
|
-
end
|
18
|
-
end
|
19
|
-
|
20
|
-
Registry.register(:hash, Fortnox::API::Mapper::Base::Hash)
|
21
|
-
|
22
|
-
def self.canonical_name_sym(*values)
|
23
|
-
klass = if values.empty?
|
24
|
-
self
|
25
|
-
elsif values.first.is_a? Class
|
26
|
-
values.first
|
27
|
-
else
|
28
|
-
values.first.class
|
29
|
-
end
|
30
|
-
|
31
|
-
# For Ruby < 2.4, make sure we don't pass Bignum and Fixnum around
|
32
|
-
klass = Integer if %w[Bignum Fixnum].include?(klass.to_s) # Stringify to avoid warnings on 2.4
|
33
|
-
|
34
|
-
klass.name.split('::').last.downcase.to_sym
|
35
|
-
end
|
13
|
+
extend CanonicalNameSym
|
36
14
|
|
37
15
|
def diff(entity_hash, parent_hash)
|
38
16
|
hash_diff(entity_hash[self.class::JSON_ENTITY_WRAPPER],
|
@@ -0,0 +1,21 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Fortnox
|
4
|
+
module API
|
5
|
+
module Mapper
|
6
|
+
module CanonicalNameSym
|
7
|
+
def canonical_name_sym(*values)
|
8
|
+
klass = if values.empty?
|
9
|
+
self
|
10
|
+
elsif values.first.is_a? Class
|
11
|
+
values.first
|
12
|
+
else
|
13
|
+
values.first.class
|
14
|
+
end
|
15
|
+
|
16
|
+
klass.name.split('::').last.downcase.to_sym
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Fortnox
|
4
|
+
module API
|
5
|
+
module Mapper
|
6
|
+
Array = lambda do |array|
|
7
|
+
array.each_with_object([]) do |item, converted_array|
|
8
|
+
name = Fortnox::API::Mapper::Base.canonical_name_sym(item)
|
9
|
+
converted_array << Fortnox::API::Registry[name].call(item)
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
Registry.register(:array, Fortnox::API::Mapper::Array)
|
14
|
+
|
15
|
+
Registry.register(:labels, Fortnox::API::Mapper::Array)
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'fortnox/api/mappers/base/canonical_name_sym'
|
4
|
+
|
5
|
+
module Fortnox
|
6
|
+
module API
|
7
|
+
module Mapper
|
8
|
+
class CountryCodeString
|
9
|
+
extend CanonicalNameSym
|
10
|
+
|
11
|
+
CountryCodeMapper = lambda do |code|
|
12
|
+
next code if code.nil? || code == ''
|
13
|
+
|
14
|
+
# Fortnox only supports Swedish country name for Sweden
|
15
|
+
next 'Sverige' if code == 'SE'
|
16
|
+
|
17
|
+
::ISO3166::Country[code].translations['en']
|
18
|
+
end
|
19
|
+
|
20
|
+
Registry.register(canonical_name_sym, CountryCodeMapper)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Fortnox
|
4
|
+
module API
|
5
|
+
module Mapper
|
6
|
+
Hash = lambda do |hash|
|
7
|
+
hash.each do |key, value|
|
8
|
+
name = Fortnox::API::Mapper::Base.canonical_name_sym(value)
|
9
|
+
hash[key] = Fortnox::API::Registry[name].call(value)
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
Registry.register(:hash, Hash)
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Fortnox
|
4
|
+
module API
|
5
|
+
module Mapper
|
6
|
+
Identity = ->(value) { value }
|
7
|
+
|
8
|
+
Registry.register(:integer, Fortnox::API::Mapper::Identity)
|
9
|
+
Registry.register(:int, Fortnox::API::Mapper::Identity)
|
10
|
+
Registry.register(:float, Fortnox::API::Mapper::Identity)
|
11
|
+
Registry.register(:string, Fortnox::API::Mapper::Identity)
|
12
|
+
Registry.register(:boolean, Fortnox::API::Mapper::Identity)
|
13
|
+
Registry.register(:falseclass, Fortnox::API::Mapper::Identity)
|
14
|
+
Registry.register(:trueclass, Fortnox::API::Mapper::Identity)
|
15
|
+
Registry.register(:nilclass, Fortnox::API::Mapper::Identity)
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -109,7 +109,7 @@ module Fortnox
|
|
109
109
|
# HouseWork If there is any row of the document marked "housework".
|
110
110
|
attribute :housework, Types::Nullable::Boolean.is(:read_only)
|
111
111
|
|
112
|
-
attribute :labels, Types::Strict::Array.
|
112
|
+
attribute :labels, Types::Strict::Array.of(Label)
|
113
113
|
|
114
114
|
# Net Net amount
|
115
115
|
attribute :net, Types::Nullable::Float.is(:read_only)
|
@@ -50,7 +50,7 @@ module Fortnox
|
|
50
50
|
attribute :invoice_period_end, Types::Nullable::Date.is(:read_only)
|
51
51
|
|
52
52
|
# InvoiceRows Separate object
|
53
|
-
attribute :invoice_rows, Types::Strict::Array.
|
53
|
+
attribute :invoice_rows, Types::Strict::Array.of(Types::InvoiceRow)
|
54
54
|
|
55
55
|
# InvoiceType The type of invoice.
|
56
56
|
attribute :invoice_type, Types::Nullable::String
|
@@ -16,10 +16,10 @@ module Fortnox
|
|
16
16
|
|
17
17
|
HTTParty::Parser::SupportedFormats['text/html'] = :json
|
18
18
|
|
19
|
-
|
19
|
+
headers(
|
20
20
|
'Content-Type' => 'application/json',
|
21
21
|
'Accept' => 'application/json'
|
22
|
-
|
22
|
+
)
|
23
23
|
|
24
24
|
HTTP_METHODS = %i[get put post delete].freeze
|
25
25
|
|
@@ -31,21 +31,19 @@ module Fortnox
|
|
31
31
|
end
|
32
32
|
|
33
33
|
HTTP_METHODS.each do |method|
|
34
|
-
define_method method do
|
35
|
-
headers
|
34
|
+
define_method method do |path, options = {}, &block|
|
35
|
+
provided_headers = options[:headers] || {}
|
36
|
+
provided_headers['Client-Secret'] = client_secret
|
37
|
+
provided_headers['Access-Token'] = next_access_token
|
38
|
+
options[:headers] = provided_headers
|
39
|
+
options[:base_uri] ||= base_url
|
36
40
|
execute do |remote|
|
37
|
-
remote.send(method,
|
41
|
+
remote.send(method, path, options, &block)
|
38
42
|
end
|
39
43
|
end
|
40
44
|
end
|
41
45
|
|
42
46
|
def initialize(keys_filtered_on_save: [:url], token_store: :default)
|
43
|
-
self.class.base_uri(base_url)
|
44
|
-
|
45
|
-
self.headers = DEFAULT_HEADERS.merge(
|
46
|
-
'Client-Secret' => client_secret
|
47
|
-
)
|
48
|
-
|
49
47
|
@keys_filtered_on_save = keys_filtered_on_save
|
50
48
|
@token_store = token_store
|
51
49
|
@mapper = Registry[Mapper::Base.canonical_name_sym(self.class::MODEL)].new
|