eu_vat_rates_data 2026.3.31 → 2026.3.32

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
  SHA256:
3
- metadata.gz: 9aa5cfb0609e948804ee35b2314921d7f07a8561b015a35fde1b24465e6eac39
4
- data.tar.gz: 909f7e7e7a454a4c83f10030c48e1bdcebdf2dffd96d00dfe47ef8dc017533f4
3
+ metadata.gz: 728aa4f4706467b4059bf9939ca891ea746aa8fd9433501dbdb93f8882c2cfc4
4
+ data.tar.gz: 7be6d294a5283282b5c9e1669fd4a19780306838da8dc23f53ac5320860213d5
5
5
  SHA512:
6
- metadata.gz: 47f2770e396b04e9140dd3aacae12c3980eb4a0906d9fd2d6e9a5bde6ca3b75f23a29e349f4d866b5cb4065a907def92c4d4184beb580703b06e206f984cdfe0
7
- data.tar.gz: cc8cca83cf408f8a816440b86323caeb3e4f451de7c59da4ab647a4453f5f79309ac83b6cceca282b8838e9a417687b17315aec60defbf05750605e4b209b594
6
+ metadata.gz: f8fc1b591cb19ee8a61fc6e4cbab4ae2fc8380a973bd2f6a6754ae68eb21ba5915b77c2d0d0666e61f8c2fe0380fc4aa0a6c1d50070d6deab19507d87c0607be
7
+ data.tar.gz: 500b4fc53b9622e65e11ec588a4fecb111a9e29042c905bca8cd5558d1b253265d0d5b6e12342fcd11559daedf061c9e27fd78a80c80c3dc24e24c93473db424
data/README.md CHANGED
@@ -79,6 +79,11 @@ EuVatRatesData.valid_format?("INVALID") # => false
79
79
  at = EuVatRatesData.get_rate("AT")
80
80
  puts at["format"] # "ATU + 8 digits"
81
81
  puts at["pattern"] # "^ATU\\d{8}$"
82
+
83
+ # Flag emoji from a 2-letter country code — no lookup table, computed from regional indicator symbols
84
+ EuVatRatesData.flag("FI") # => "🇫🇮"
85
+ EuVatRatesData.flag("DE") # => "🇩🇪"
86
+ EuVatRatesData.flag("XX") # => "" (empty string for unknown/invalid codes)
82
87
  ```
83
88
 
84
89
  ---
@@ -1,5 +1,5 @@
1
1
  {
2
- "version": "2026-03-30",
2
+ "version": "2026-03-31",
3
3
  "source": "European Commission TEDB",
4
4
  "rates": {
5
5
  "AD": {
@@ -15,8 +15,8 @@
15
15
  ],
16
16
  "super_reduced": null,
17
17
  "parking": null,
18
- "format": "AD + alphanumeric",
19
- "pattern": null
18
+ "format": "1 letter + 7 digits + 1 letter",
19
+ "pattern": "^[A-Z]\\d{7}[A-Z]$"
20
20
  },
21
21
  "AL": {
22
22
  "country": "Albania",
@@ -31,8 +31,8 @@
31
31
  ],
32
32
  "super_reduced": null,
33
33
  "parking": null,
34
- "format": "AL + 1 letter + 8 digits + 1 letter",
35
- "pattern": "^AL[A-Z]\\d{8}[A-Z]$"
34
+ "format": "letter (J/K/L) + 8 digits + 1 letter",
35
+ "pattern": "^[JKL]\\d{8}[A-Z]$"
36
36
  },
37
37
  "AT": {
38
38
  "country": "Austria",
@@ -61,8 +61,8 @@
61
61
  "reduced": [],
62
62
  "super_reduced": null,
63
63
  "parking": null,
64
- "format": "BA + alphanumeric",
65
- "pattern": null
64
+ "format": "12 digits",
65
+ "pattern": "^\\d{12}$"
66
66
  },
67
67
  "BE": {
68
68
  "country": "Belgium",
@@ -262,8 +262,8 @@
262
262
  "reduced": [],
263
263
  "super_reduced": null,
264
264
  "parking": null,
265
- "format": "GE + alphanumeric",
266
- "pattern": null
265
+ "format": "9 digits",
266
+ "pattern": "^\\d{9}$"
267
267
  },
268
268
  "GR": {
269
269
  "country": "Greece",
@@ -342,8 +342,8 @@
342
342
  ],
343
343
  "super_reduced": null,
344
344
  "parking": null,
345
- "format": "IS + 5–6 digits",
346
- "pattern": "^IS\\d{5,6}$"
345
+ "format": "6 digits",
346
+ "pattern": "^\\d{6}$"
347
347
  },
348
348
  "IT": {
349
349
  "country": "Italy",
@@ -374,8 +374,8 @@
374
374
  ],
375
375
  "super_reduced": null,
376
376
  "parking": null,
377
- "format": "LI + alphanumeric",
378
- "pattern": null
377
+ "format": "CHE + 9 digits",
378
+ "pattern": "^CHE\\d{9}$"
379
379
  },
380
380
  "LT": {
381
381
  "country": "Lithuania",
@@ -438,8 +438,8 @@
438
438
  ],
439
439
  "super_reduced": 2.1,
440
440
  "parking": null,
441
- "format": "MC + alphanumeric",
442
- "pattern": null
441
+ "format": "FR + 2 alphanumeric + 9 digits",
442
+ "pattern": "^FR[A-HJ-NP-Z0-9]{2}\\d{9}$"
443
443
  },
444
444
  "MD": {
445
445
  "country": "Moldova",
@@ -453,8 +453,8 @@
453
453
  ],
454
454
  "super_reduced": null,
455
455
  "parking": null,
456
- "format": "MD + alphanumeric",
457
- "pattern": null
456
+ "format": "7 digits",
457
+ "pattern": "^\\d{7}$"
458
458
  },
459
459
  "ME": {
460
460
  "country": "Montenegro",
@@ -469,8 +469,8 @@
469
469
  ],
470
470
  "super_reduced": null,
471
471
  "parking": null,
472
- "format": "ME + 8 digits",
473
- "pattern": "^ME\\d{8}$"
472
+ "format": "8 digits",
473
+ "pattern": "^\\d{8}$"
474
474
  },
475
475
  "MK": {
476
476
  "country": "North Macedonia",
@@ -485,8 +485,8 @@
485
485
  ],
486
486
  "super_reduced": null,
487
487
  "parking": null,
488
- "format": "MK + 13 digits",
489
- "pattern": "^MK\\d{13}$"
488
+ "format": "13 digits",
489
+ "pattern": "^\\d{13}$"
490
490
  },
491
491
  "MT": {
492
492
  "country": "Malta",
@@ -596,8 +596,8 @@
596
596
  ],
597
597
  "super_reduced": null,
598
598
  "parking": null,
599
- "format": "RS + 9 digits",
600
- "pattern": "^RS\\d{9}$"
599
+ "format": "9 digits",
600
+ "pattern": "^\\d{9}$"
601
601
  },
602
602
  "SE": {
603
603
  "country": "Sweden",
@@ -660,8 +660,8 @@
660
660
  ],
661
661
  "super_reduced": null,
662
662
  "parking": null,
663
- "format": "TR + 10 digits",
664
- "pattern": "^TR\\d{10}$"
663
+ "format": "10 digits",
664
+ "pattern": "^\\d{10}$"
665
665
  },
666
666
  "UA": {
667
667
  "country": "Ukraine",
@@ -676,8 +676,8 @@
676
676
  ],
677
677
  "super_reduced": null,
678
678
  "parking": null,
679
- "format": "UA + 12 digits",
680
- "pattern": "^UA\\d{12}$"
679
+ "format": "12 digits",
680
+ "pattern": "^\\d{12}$"
681
681
  },
682
682
  "XK": {
683
683
  "country": "Kosovo",
@@ -691,8 +691,8 @@
691
691
  ],
692
692
  "super_reduced": null,
693
693
  "parking": null,
694
- "format": "XK + alphanumeric",
695
- "pattern": null
694
+ "format": "9 digits",
695
+ "pattern": "^\\d{9}$"
696
696
  }
697
697
  }
698
698
  }
@@ -1,3 +1,3 @@
1
1
  module EuVatRatesData
2
- VERSION = "2026.3.31"
2
+ VERSION = "2026.3.32"
3
3
  end
@@ -17,6 +17,7 @@ require_relative "eu_vat_rates_data/version"
17
17
  # EuVatRatesData.eu_member?("NO") # => false
18
18
  # EuVatRatesData.eu_member?("FR") # => true
19
19
  # EuVatRatesData.data_version # => "2026-03-18"
20
+ # EuVatRatesData.flag("FI") # => "🇫🇮"
20
21
  module EuVatRatesData
21
22
  DATA_FILE = File.expand_path("../data/eu-vat-rates-data.json", __dir__)
22
23
 
@@ -86,4 +87,22 @@ module EuVatRatesData
86
87
  def self.data_version
87
88
  dataset["version"]
88
89
  end
90
+
91
+ # Return the flag emoji for a 2-letter ISO 3166-1 alpha-2 country code.
92
+ # Computed from regional indicator symbols — no lookup table needed.
93
+ # Returns an empty string if the input is not exactly 2 ASCII letters.
94
+ #
95
+ # @param country_code [String] ISO 3166-1 alpha-2 code (e.g. "FI", "DE")
96
+ # @return [String] flag emoji (e.g. "🇫🇮"), or "" if invalid
97
+ #
98
+ # @example
99
+ # EuVatRatesData.flag("FI") # => "🇫🇮"
100
+ # EuVatRatesData.flag("DE") # => "🇩🇪"
101
+ # EuVatRatesData.flag("GB") # => "🇬🇧"
102
+ def self.flag(country_code)
103
+ code = country_code.upcase
104
+ return "" unless code.length == 2 && code.match?(/\A[A-Z]{2}\z/)
105
+ base = 0x1F1E6
106
+ [base + code.ord - 65, base + code[-1].ord - 65].pack("U*")
107
+ end
89
108
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: eu_vat_rates_data
3
3
  version: !ruby/object:Gem::Version
4
- version: 2026.3.31
4
+ version: 2026.3.32
5
5
  platform: ruby
6
6
  authors:
7
7
  - Iurii Rogulia
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2026-03-30 00:00:00.000000000 Z
11
+ date: 2026-03-31 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description: VAT rates (standard, reduced, super-reduced, parking) for 44 European
14
14
  countries — EU-27 plus Norway, Switzerland, UK, and more. Includes eu_member flag,