amounts 0.0.8 → 0.1.0

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.
Files changed (66) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +37 -0
  3. data/CHANGELOG.md +113 -0
  4. data/Gemfile +4 -0
  5. data/README.md +215 -1
  6. data/Rakefile +47 -10
  7. data/lib/amount/active_record/amount_validator.rb +9 -18
  8. data/lib/amount/active_record/attribute_definition.rb +3 -1
  9. data/lib/amount/active_record/locale/en.yml +7 -0
  10. data/lib/amount/active_record/model.rb +9 -0
  11. data/lib/amount/active_record.rb +12 -0
  12. data/lib/amount/compact.rb +137 -0
  13. data/lib/amount/{allocation.rb → concerns/allocatable.rb} +1 -1
  14. data/lib/amount/{arithmetic.rb → concerns/calculable.rb} +1 -1
  15. data/lib/amount/concerns/coercible.rb +65 -0
  16. data/lib/amount/concerns/constructible.rb +92 -0
  17. data/lib/amount/{conversion.rb → concerns/convertible.rb} +1 -1
  18. data/lib/amount/concerns/formattable.rb +112 -0
  19. data/lib/amount/concerns/localizable.rb +39 -0
  20. data/lib/amount/{comparison.rb → concerns/orderable.rb} +2 -2
  21. data/lib/amount/concerns/parsable.rb +58 -0
  22. data/lib/amount/concerns/registrable.rb +80 -0
  23. data/lib/amount/{serialization.rb → concerns/serializable.rb} +3 -3
  24. data/lib/amount/display.rb +81 -46
  25. data/lib/amount/locale.rb +102 -0
  26. data/lib/amount/registry.rb +69 -7
  27. data/lib/amount/ui_parser.rb +109 -0
  28. data/lib/amount/version.rb +1 -1
  29. data/lib/amount.rb +55 -199
  30. data/test/amount/active_record/amount_validator_test.rb +201 -0
  31. data/test/amount/active_record/attribute_definition_test.rb +234 -0
  32. data/test/amount/active_record/migration_methods_test.rb +60 -0
  33. data/test/amount/active_record/model_test.rb +40 -0
  34. data/test/amount/active_record/type_test.rb +80 -0
  35. data/test/amount/active_record_test.rb +12 -0
  36. data/test/amount/compact_test.rb +371 -0
  37. data/test/amount/concerns/allocatable_test.rb +166 -0
  38. data/test/amount/concerns/calculable_test.rb +152 -0
  39. data/test/amount/concerns/coercible_test.rb +49 -0
  40. data/test/amount/concerns/constructible_test.rb +113 -0
  41. data/test/amount/concerns/convertible_test.rb +54 -0
  42. data/test/amount/concerns/formattable_test.rb +336 -0
  43. data/test/amount/concerns/localizable_test.rb +59 -0
  44. data/test/amount/concerns/orderable_test.rb +83 -0
  45. data/test/amount/concerns/parsable_test.rb +98 -0
  46. data/test/amount/concerns/registrable_test.rb +67 -0
  47. data/test/amount/concerns/serializable_test.rb +98 -0
  48. data/test/amount/display_test.rb +181 -0
  49. data/test/amount/locale_test.rb +590 -0
  50. data/test/amount/parser_test.rb +29 -0
  51. data/test/amount/registry/generated_constructors_test.rb +94 -0
  52. data/test/amount/registry_test.rb +149 -0
  53. data/test/amount/ui_parser_test.rb +284 -0
  54. data/test/amount_test.rb +55 -0
  55. data/test/dummy/config/application.rb +3 -0
  56. data/test/generators/amount/active_record/registry_generator_test.rb +116 -0
  57. data/test/integration/postgresql_test.rb +94 -0
  58. data/test/support/active_record_test_support.rb +65 -0
  59. data/test/support/error_helpers.rb +22 -0
  60. data/test/support/locale_test_setup.rb +36 -0
  61. data/test/test_helper.rb +1 -0
  62. metadata +47 -11
  63. data/test/postgresql_integration_test.rb +0 -71
  64. data/test/test_active_record.rb +0 -375
  65. data/test/test_amount.rb +0 -675
  66. data/test/test_registry_generator.rb +0 -104
@@ -1,104 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require_relative "test_helper"
4
- require "tmpdir"
5
- require "fileutils"
6
- require_relative "../lib/amounts"
7
- require_relative "../lib/generators/amount/active_record/registry_generator"
8
- require "rails/generators"
9
-
10
- class AmountRegistryGeneratorTest < Minitest::Test
11
- def setup
12
- @destination_root = Dir.mktmpdir("amounts-generator")
13
- end
14
-
15
- def teardown
16
- FileUtils.remove_entry(@destination_root)
17
- end
18
-
19
- def test_generates_fiat_initializer
20
- invoke_generator("fiat")
21
-
22
- content = File.read(output_file)
23
-
24
- assert_includes content, 'rails generate amounts:registry fiat'
25
- assert_includes content, "# Registry overview:"
26
- assert_includes content, "# Major Fiat Currencies:"
27
- assert_includes content, "# USD: United States dollar."
28
- assert_includes content, "# Fact: Uses 2 decimal places for cents."
29
- assert_includes content, "# Preset default: Uses \"$\" as the default display symbol in an English-oriented UI."
30
- assert_includes content, "Amount.register :USD"
31
- assert_includes content, "Amount.register :JPY"
32
- refute_includes content, "Amount.register :BTC"
33
- end
34
-
35
- def test_generates_all_initializer_without_duplicate_symbols
36
- invoke_generator("all")
37
-
38
- content = File.read(output_file)
39
-
40
- assert_equal 1, content.scan(/^\s*Amount\.register :USD,/).size
41
- assert_equal 1, content.scan(/^\s*Amount\.register :USDC,/).size
42
- assert_includes content, "Amount.register :GOLD"
43
- assert_includes content, "Amount.register :BTC"
44
- end
45
-
46
- def test_generates_crypto_initializer_without_stale_polygon_entry
47
- invoke_generator("crypto")
48
-
49
- content = File.read(output_file)
50
-
51
- assert_includes content, "# BTC: Bitcoin."
52
- assert_includes content, "# Source: Ethereum denomination docs: https://ethereum.org/en/developers/docs/intro-to-ether/"
53
- assert_includes content, "Amount.register :USDT"
54
- refute_includes content, "Amount.register :MATIC"
55
- refute_includes content, "Amount.register :POL"
56
- end
57
-
58
- def test_static_preset_files_exist
59
- assert File.exist?(preset_file("fiat"))
60
- assert File.exist?(preset_file("metals"))
61
- assert File.exist?(preset_file("crypto"))
62
- assert File.exist?(preset_file("all"))
63
- end
64
-
65
- def test_all_static_preset_file_includes_all_major_sections
66
- content = File.read(preset_file("all"))
67
-
68
- assert_includes content, "# Major Fiat Currencies:"
69
- assert_includes content, "# Precious And Industrial Metals:"
70
- assert_includes content, "# Large-Cap Crypto Assets:"
71
- assert_includes content, "Amount.register :USD"
72
- assert_includes content, "Amount.register :GOLD"
73
- assert_includes content, "Amount.register :BTC"
74
- end
75
-
76
- def test_rejects_unknown_preset
77
- _stdout, stderr = capture_io do
78
- invoke_generator("unknown")
79
- end
80
- assert_includes stderr, "unknown preset"
81
- end
82
-
83
- private
84
-
85
- def invoke_generator(preset)
86
- Amount::ActiveRecord::RegistryGenerator.start(
87
- [preset],
88
- destination_root: @destination_root,
89
- shell: Thor::Shell::Basic.new
90
- )
91
- end
92
-
93
- def output_file
94
- File.join(@destination_root, "config/initializers/amounts.rb")
95
- end
96
-
97
- def preset_file(name)
98
- File.join(
99
- File.dirname(__FILE__),
100
- "..",
101
- "lib/generators/amount/active_record/templates/presets/#{name}.fragment"
102
- )
103
- end
104
- end