vat_rates 0.0.1 → 0.0.2

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 415c82d33908d10236dbb9282de9388ec91708d7
4
- data.tar.gz: 159b7e1ec89d6013e2430e0a55487c86ab3add62
3
+ metadata.gz: 2d38ce5dd1932b39b8e9057487493a0796371cf2
4
+ data.tar.gz: b05e0188bcc00d2eded7edc62909d6e2dd61b9d9
5
5
  SHA512:
6
- metadata.gz: 5632913747c624766d689fa4b93a3e7a2806adc7a3f0088da788d7010442d766694f1753677f0fb3bb33160edd6b31f09479804cc16700cc2bab0ef09747209d
7
- data.tar.gz: 04db78f653d486b078fe3895c986fc623b1160e799c867eb5a889dec29efc696e28781234aeec0ac6f125e020daea363fdf7c02508b9a270425c5886565a658d
6
+ metadata.gz: 194c08afac0192533c13dd4a8797ca437ea8ec78d8d175f2ce1f829a8e70327126a9236af51d7b91afd785a964df41704c4d78dbbd47b9071211ea55554965d9
7
+ data.tar.gz: 7b553f5cfa6b582932e0d009fb3938f5c00c52ffe9310759523acc53afe2eb8a51e0af0e533a1570aa45ce1d98357d36afd7956be440f21ac1db3bb212db6f4c
data/.travis.yml CHANGED
@@ -4,5 +4,4 @@ rvm:
4
4
  - 2.1.4
5
5
 
6
6
  os:
7
- - linux
8
- - osx
7
+ - linux
data/README.md CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  [![Build Status](https://secure.travis-ci.org/dmitry/vat_rates.png?branch=master)](http://travis-ci.org/dmitry/vat_rates) [![Gem Version](https://badge.fury.io/rb/vat_rates.png)](http://badge.fury.io/rb/vat_rates)
4
4
 
5
- VAT rates based on the [ec.europa.eu](http://ec.europa.eu/taxation_customs/tic/public/vatRates/vatratesSearch.html) website list. This gem parses data on the page, and provides interface to those data.
5
+ VAT rates based on the [ec.europa.eu](http://ec.europa.eu/taxation_customs/tic/public/vatRates/vatratesSearch.html) website list. This gem parses information on the website and provides interface to the data.
6
6
 
7
7
  ## Installation
8
8
 
@@ -22,7 +22,16 @@ Or install it yourself as:
22
22
 
23
23
  To get current VAT rates from ec.europa.eu, just invoke following command:
24
24
 
25
- VatRates::Fetcher.get
25
+ VatRates.fetch
26
+
27
+ Load from file or fetch from server:
28
+
29
+ VatRates.load(filepath = nil)
30
+
31
+
32
+ Save to json file:
33
+
34
+ VatRates.save(filepath)
26
35
 
27
36
  ## Contributing
28
37
 
data/data.json ADDED
@@ -0,0 +1,216 @@
1
+ [{
2
+ ":code": "AT",
3
+ ":name": "Austria",
4
+ ":rate": 20.0,
5
+ ":regions": [{
6
+ ":name": "Jungholz",
7
+ ":rate": 0
8
+ }, {
9
+ ":name": "Mittelberg",
10
+ ":rate": 0
11
+ }]
12
+ }, {
13
+ ":code": "BE",
14
+ ":name": "Belgium",
15
+ ":rate": 21.0
16
+ }, {
17
+ ":code": "BG",
18
+ ":name": "Bulgaria",
19
+ ":rate": 20.0
20
+ }, {
21
+ ":code": "CY",
22
+ ":name": "Cyprus",
23
+ ":rate": 19.0
24
+ }, {
25
+ ":code": "CZ",
26
+ ":name": "Czech Republic",
27
+ ":rate": 21.0
28
+ }, {
29
+ ":code": "DE",
30
+ ":name": "Germany",
31
+ ":rate": 19.0,
32
+ ":regions": [{
33
+ ":name": "Heligoland",
34
+ ":rate": 0
35
+ }, {
36
+ ":name": "Büsingen",
37
+ ":rate": 0
38
+ }]
39
+ }, {
40
+ ":code": "DK",
41
+ ":name": "Denmark",
42
+ ":rate": 25.0,
43
+ ":regions": [{
44
+ ":name": "Faeroe Islands",
45
+ ":rate": 0
46
+ }, {
47
+ ":name": "Greenland",
48
+ ":rate": 0
49
+ }]
50
+ }, {
51
+ ":code": "EE",
52
+ ":name": "Estonia",
53
+ ":rate": 20.0
54
+ }, {
55
+ ":code": "EL",
56
+ ":name": "Greece",
57
+ ":rate": 23.0,
58
+ ":regions": [{
59
+ ":name": "Lesbos",
60
+ ":rate": 0
61
+ }, {
62
+ ":name": "Chios",
63
+ ":rate": 0
64
+ }, {
65
+ ":name": "Samos",
66
+ ":rate": 0
67
+ }, {
68
+ ":name": "Dodecanese",
69
+ ":rate": 0
70
+ }, {
71
+ ":name": "Cyclades",
72
+ ":rate": 0
73
+ }, {
74
+ ":name": "Aegean islands of Thassos",
75
+ ":rate": 0
76
+ }, {
77
+ ":name": "Northern Sporades",
78
+ ":rate": 0
79
+ }, {
80
+ ":name": "Samothrace and Skiros",
81
+ ":rate": 0
82
+ }]
83
+ }, {
84
+ ":code": "ES",
85
+ ":name": "Spain",
86
+ ":rate": 21.0,
87
+ ":regions": [{
88
+ ":name": "Canary Islands",
89
+ ":rate": 0
90
+ }, {
91
+ ":name": "Ceuta",
92
+ ":rate": 0
93
+ }, {
94
+ ":name": "Melilla",
95
+ ":rate": 0
96
+ }]
97
+ }, {
98
+ ":code": "FI",
99
+ ":name": "Finland",
100
+ ":rate": 24.0,
101
+ ":regions": [{
102
+ ":name": "Åland Islands",
103
+ ":rate": 0
104
+ }]
105
+ }, {
106
+ ":code": "FR",
107
+ ":name": "France",
108
+ ":rate": 20.0,
109
+ ":regions": [{
110
+ ":name": "Corsica",
111
+ ":rate": 20.0,
112
+ ":reduced_rates": {
113
+ ":category": "Taux particulier",
114
+ ":rate": 10.0
115
+ }
116
+ }, {
117
+ ":name": "DOM",
118
+ ":rate": 8.5,
119
+ ":reduced_rates": {
120
+ ":category": "Taux réduit",
121
+ ":rate": 1.05
122
+ }
123
+ }, {
124
+ ":name": "Monaco",
125
+ ":rate": 20.0,
126
+ ":reduced_rates": {
127
+ ":category": "Taux intermédiaire",
128
+ ":rate": 10.0
129
+ }
130
+ }]
131
+ }, {
132
+ ":code": "GB",
133
+ ":name": "United Kingdom",
134
+ ":rate": 20.0,
135
+ ":regions": [{
136
+ ":name": "Isle of Man",
137
+ ":rate": 0
138
+ }]
139
+ }, {
140
+ ":code": "HR",
141
+ ":name": "Croatia",
142
+ ":rate": 25.0
143
+ }, {
144
+ ":code": "HU",
145
+ ":name": "Hungary",
146
+ ":rate": 27.0
147
+ }, {
148
+ ":code": "IE",
149
+ ":name": "Ireland",
150
+ ":rate": 23.0
151
+ }, {
152
+ ":code": "IT",
153
+ ":name": "Italy",
154
+ ":rate": 22.0,
155
+ ":regions": [{
156
+ ":name": "Livigno",
157
+ ":rate": 0
158
+ }, {
159
+ ":name": "Campione d'Italia",
160
+ ":rate": 0
161
+ }, {
162
+ ":name": "Lake Lugano",
163
+ ":rate": 0
164
+ }]
165
+ }, {
166
+ ":code": "LT",
167
+ ":name": "Lithuania",
168
+ ":rate": 21.0
169
+ }, {
170
+ ":code": "LU",
171
+ ":name": "Luxembourg",
172
+ ":rate": 15.0
173
+ }, {
174
+ ":code": "LV",
175
+ ":name": "Latvia",
176
+ ":rate": 21.0
177
+ }, {
178
+ ":code": "MT",
179
+ ":name": "Malta",
180
+ ":rate": 18.0
181
+ }, {
182
+ ":code": "NL",
183
+ ":name": "Netherlands",
184
+ ":rate": 21.0
185
+ }, {
186
+ ":code": "PL",
187
+ ":name": "Poland",
188
+ ":rate": 23.0
189
+ }, {
190
+ ":code": "PT",
191
+ ":name": "Portugal",
192
+ ":rate": 23.0,
193
+ ":regions": [{
194
+ ":name": "Azores",
195
+ ":rate": 0
196
+ }, {
197
+ ":name": "Madeira",
198
+ ":rate": 0
199
+ }]
200
+ }, {
201
+ ":code": "RO",
202
+ ":name": "Romania",
203
+ ":rate": 24.0
204
+ }, {
205
+ ":code": "SE",
206
+ ":name": "Sweden",
207
+ ":rate": 25.0
208
+ }, {
209
+ ":code": "SI",
210
+ ":name": "Slovenia",
211
+ ":rate": 22.0
212
+ }, {
213
+ ":code": "SK",
214
+ ":name": "Slovak Republic",
215
+ ":rate": 20.0
216
+ }]
@@ -1,3 +1,3 @@
1
1
  module VatRates
2
- VERSION = '0.0.1'
2
+ VERSION = '0.0.2'
3
3
  end
data/lib/vat_rates.rb CHANGED
@@ -1,5 +1,82 @@
1
- require 'vat_rates/fetcher'
2
1
  require 'vat_rates/version'
2
+ require 'open-uri'
3
+ require 'nokogiri'
4
+ require 'oj'
3
5
 
4
6
  module VatRates
7
+ URL = 'http://ec.europa.eu/taxation_customs/tic/public/vatRates/vatratesSearch.html'
8
+ FILEPATH = File.expand_path('../../data.json', __FILE__)
9
+
10
+ class << self
11
+ def fetch
12
+ html = open(URL)
13
+
14
+ doc = Nokogiri::HTML(html)
15
+
16
+ data = []
17
+
18
+ content = doc.css('#tic-content').first
19
+
20
+ content.children.each do |child|
21
+ if child.name == 'h2'
22
+ code, name = child.text.split(' - ')
23
+
24
+ data << {
25
+ code: code,
26
+ name: name,
27
+ rate: normalize_rate(child.next.next.next.next.css('td')[1].text)
28
+ }
29
+ elsif child.name == 'h4'
30
+ data.last[:regions] ||= []
31
+ region = {
32
+ name: child.text
33
+ }
34
+
35
+ standard = child.next.next.next.next
36
+
37
+ if standard.text.include?('No Standard Rate')
38
+ region[:rate] = 0
39
+ else
40
+ region[:rate] = normalize_rate(standard.css('td')[1].text)
41
+ end
42
+
43
+ reduced = standard.next.next.next.next.next.next
44
+
45
+ unless reduced.text.include?('No information available')
46
+ reduced.css('tr')[1..-1].each do |row|
47
+ columns = row.css('td')
48
+ region[:reduced_rates] = {
49
+ category: columns[0].text,
50
+ rate: normalize_rate(columns[1].text)
51
+ }
52
+ end
53
+ end
54
+
55
+ data.last[:regions] << region
56
+ end
57
+ end
58
+
59
+ data
60
+ end
61
+
62
+ def load(filepath = FILEPATH)
63
+ if filepath
64
+ Oj.load(File.read(filepath))
65
+ else
66
+ get_rates
67
+ end
68
+ end
69
+
70
+ def save(filepath)
71
+ File.open(filepath, 'w') do |file|
72
+ file.write(Oj.dump(fetch))
73
+ end
74
+ end
75
+
76
+ private
77
+
78
+ def normalize_rate(number)
79
+ number.sub(',', '.').gsub(/[% ]/, '').to_f
80
+ end
81
+ end
5
82
  end
@@ -1,9 +1,9 @@
1
1
  # encoding: utf-8
2
2
  require 'spec_helper'
3
3
 
4
- describe VatRates::Fetcher do
5
- it '#get' do
6
- values = VatRates::Fetcher.get
4
+ describe VatRates do
5
+ it '#fetch' do
6
+ values = VatRates.fetch
7
7
 
8
8
  france = {
9
9
  code: 'FR',
@@ -19,4 +19,8 @@ describe VatRates::Fetcher do
19
19
  expect(values.find { |v| 'France' == v[:name] }).to eq(france)
20
20
  expect(values.count).to eq 28
21
21
  end
22
+
23
+ it '#load' do
24
+ expect(VatRates.load).to eq VatRates.fetch
25
+ end
22
26
  end
data/vat_rates.gemspec CHANGED
@@ -8,9 +8,9 @@ Gem::Specification.new do |spec|
8
8
  spec.version = VatRates::VERSION
9
9
  spec.authors = ['Dmitry Polushkin']
10
10
  spec.email = ['dmitry.polushkin@gmail.com']
11
- spec.summary = %q{European VAT rates}
12
- spec.description = %q{Take VAT rates from ec.europa.eu}
13
- spec.homepage = ''
11
+ spec.summary = %q{VAT rates for european countries based on the ec.europa.eu website}
12
+ spec.description = %q{VAT rates based on the ec.europa.eu website list. This gem parses information on the website and provides interface to the data}
13
+ spec.homepage = 'https://github.com/dmitry/vat_rates'
14
14
  spec.license = 'MIT'
15
15
 
16
16
  spec.files = `git ls-files -z`.split("\x0")
@@ -19,6 +19,7 @@ Gem::Specification.new do |spec|
19
19
  spec.require_paths = ['lib']
20
20
 
21
21
  spec.add_dependency 'nokogiri'
22
+ spec.add_dependency 'oj'
22
23
 
23
24
  spec.add_development_dependency 'bundler', '~> 1.6'
24
25
  spec.add_development_dependency 'rake'
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: vat_rates
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.0.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Dmitry Polushkin
@@ -11,82 +11,97 @@ cert_chain: []
11
11
  date: 2014-12-23 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
- prerelease: false
15
14
  name: nokogiri
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :runtime
21
+ prerelease: false
16
22
  version_requirements: !ruby/object:Gem::Requirement
17
23
  requirements:
18
- - - '>='
24
+ - - ">="
19
25
  - !ruby/object:Gem::Version
20
26
  version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: oj
21
29
  requirement: !ruby/object:Gem::Requirement
22
30
  requirements:
23
- - - '>='
31
+ - - ">="
24
32
  - !ruby/object:Gem::Version
25
33
  version: '0'
26
34
  type: :runtime
27
- - !ruby/object:Gem::Dependency
28
35
  prerelease: false
29
- name: bundler
30
36
  version_requirements: !ruby/object:Gem::Requirement
31
37
  requirements:
32
- - - ~>
38
+ - - ">="
33
39
  - !ruby/object:Gem::Version
34
- version: '1.6'
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: bundler
35
43
  requirement: !ruby/object:Gem::Requirement
36
44
  requirements:
37
- - - ~>
45
+ - - "~>"
38
46
  - !ruby/object:Gem::Version
39
47
  version: '1.6'
40
48
  type: :development
41
- - !ruby/object:Gem::Dependency
42
49
  prerelease: false
43
- name: rake
44
50
  version_requirements: !ruby/object:Gem::Requirement
45
51
  requirements:
46
- - - '>='
52
+ - - "~>"
47
53
  - !ruby/object:Gem::Version
48
- version: '0'
54
+ version: '1.6'
55
+ - !ruby/object:Gem::Dependency
56
+ name: rake
49
57
  requirement: !ruby/object:Gem::Requirement
50
58
  requirements:
51
- - - '>='
59
+ - - ">="
52
60
  - !ruby/object:Gem::Version
53
61
  version: '0'
54
62
  type: :development
55
- - !ruby/object:Gem::Dependency
56
63
  prerelease: false
57
- name: rspec
58
64
  version_requirements: !ruby/object:Gem::Requirement
59
65
  requirements:
60
- - - '>='
66
+ - - ">="
61
67
  - !ruby/object:Gem::Version
62
68
  version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: rspec
63
71
  requirement: !ruby/object:Gem::Requirement
64
72
  requirements:
65
- - - '>='
73
+ - - ">="
66
74
  - !ruby/object:Gem::Version
67
75
  version: '0'
68
76
  type: :development
69
- description: Take VAT rates from ec.europa.eu
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ description: VAT rates based on the ec.europa.eu website list. This gem parses information
84
+ on the website and provides interface to the data
70
85
  email:
71
86
  - dmitry.polushkin@gmail.com
72
87
  executables: []
73
88
  extensions: []
74
89
  extra_rdoc_files: []
75
90
  files:
76
- - .gitignore
77
- - .ruby-version
78
- - .travis.yml
91
+ - ".gitignore"
92
+ - ".ruby-version"
93
+ - ".travis.yml"
79
94
  - Gemfile
80
95
  - LICENSE.txt
81
96
  - README.md
82
97
  - Rakefile
98
+ - data.json
83
99
  - lib/vat_rates.rb
84
- - lib/vat_rates/fetcher.rb
85
100
  - lib/vat_rates/version.rb
86
- - spec/lib/fetcher_spec.rb
101
+ - spec/lib/vat_rates_spec.rb
87
102
  - spec/spec_helper.rb
88
103
  - vat_rates.gemspec
89
- homepage: ''
104
+ homepage: https://github.com/dmitry/vat_rates
90
105
  licenses:
91
106
  - MIT
92
107
  metadata: {}
@@ -96,12 +111,12 @@ require_paths:
96
111
  - lib
97
112
  required_ruby_version: !ruby/object:Gem::Requirement
98
113
  requirements:
99
- - - '>='
114
+ - - ">="
100
115
  - !ruby/object:Gem::Version
101
116
  version: '0'
102
117
  required_rubygems_version: !ruby/object:Gem::Requirement
103
118
  requirements:
104
- - - '>='
119
+ - - ">="
105
120
  - !ruby/object:Gem::Version
106
121
  version: '0'
107
122
  requirements: []
@@ -109,8 +124,7 @@ rubyforge_project:
109
124
  rubygems_version: 2.2.2
110
125
  signing_key:
111
126
  specification_version: 4
112
- summary: European VAT rates
127
+ summary: VAT rates for european countries based on the ec.europa.eu website
113
128
  test_files:
114
- - spec/lib/fetcher_spec.rb
129
+ - spec/lib/vat_rates_spec.rb
115
130
  - spec/spec_helper.rb
116
- has_rdoc:
@@ -1,65 +0,0 @@
1
- require 'open-uri'
2
- require 'nokogiri'
3
-
4
- module VatRates
5
- class Fetcher
6
- URL = 'http://ec.europa.eu/taxation_customs/tic/public/vatRates/vatratesSearch.html'
7
-
8
- class << self
9
- def get
10
- html = open(URL)
11
-
12
- doc = Nokogiri::HTML(html)
13
-
14
- data = []
15
-
16
- content = doc.css('#tic-content').first
17
-
18
- content.children.each do |child|
19
- if child.name == 'h2'
20
- code, name = child.text.split(' - ')
21
-
22
- data << {
23
- code: code,
24
- name: name,
25
- rate: normalize_rate(child.next.next.next.next.css('td')[1].text)
26
- }
27
- elsif child.name == 'h4'
28
- data.last[:regions] ||= []
29
- region = {
30
- name: child.text
31
- }
32
-
33
- standard = child.next.next.next.next
34
-
35
- if standard.text.include?('No Standard Rate')
36
- region[:rate] = 0
37
- else
38
- region[:rate] = normalize_rate(standard.css('td')[1].text)
39
- end
40
-
41
- reduced = standard.next.next.next.next.next.next
42
-
43
- unless reduced.text.include?('No information available')
44
- reduced.css('tr')[1..-1].each do |row|
45
- columns = row.css('td')
46
- region[:reduced_rates] = {
47
- category: columns[0].text,
48
- rate: normalize_rate(columns[1].text)
49
- }
50
- end
51
- end
52
-
53
- data.last[:regions] << region
54
- end
55
- end
56
-
57
- data
58
- end
59
-
60
- def normalize_rate(number)
61
- number.sub(',', '.').gsub(/[% ]/, '').to_f
62
- end
63
- end
64
- end
65
- end