vat_rates 0.0.1 → 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
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