inputomatic 0.1.0 → 0.1.1

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: d10a7d347441b1a31501d871c597cf172f9d65136386e7e6c22e6c253af2646a
4
- data.tar.gz: aad625b1028dd9c1aa2169341ab8bdcad870f57bb66d07fd7008997d537e408c
3
+ metadata.gz: 6295f84be5f085a1d760f6a3422aa158eac07a281f19ac28b7a0073c9a246006
4
+ data.tar.gz: c4e2007df2ef1cb736564da3c776d829c5eee7f87cbdf4120877688060998569
5
5
  SHA512:
6
- metadata.gz: 3b1e048778b9b1c04f04006a37218ceea382d3b4695251663ec5ff880ad4bde69eda471ad0b6d3e16f22e87e947496aae341508f0617f52b334364d6976cf00d
7
- data.tar.gz: 0c3453c2e3a3a2e94445f81d52573534efe15fe0e9956f3f6749ec06c7d262b1be3372925fcaba327db683687a87cf2605c24455e064886017a72ab7a9d253ec
6
+ metadata.gz: 64b8dc9da7ac89555a0b90b1d7de3abaec7e80fc14135ea89a4e0efe1ba0c03c3a8a38836c06a51c911aab77c02ade722211a1c263bc51e26125c899a4adea1f
7
+ data.tar.gz: 4e2791fe447ddfd6afcdd7d06e221c7711ab5e7c5075329ccf6e8786b769702aa3b6776a9d05ce183c0ab3b2b150b989f10a665bd47b264c1498040e838bbc82
data/Gemfile.lock ADDED
@@ -0,0 +1,85 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ inputomatic (0.1.0)
5
+ chronic (~> 0.10)
6
+
7
+ GEM
8
+ remote: https://rubygems.org/
9
+ specs:
10
+ activemodel (7.0.4.3)
11
+ activesupport (= 7.0.4.3)
12
+ activerecord (7.0.4.3)
13
+ activemodel (= 7.0.4.3)
14
+ activesupport (= 7.0.4.3)
15
+ activesupport (7.0.4.3)
16
+ concurrent-ruby (~> 1.0, >= 1.0.2)
17
+ i18n (>= 1.6, < 2)
18
+ minitest (>= 5.1)
19
+ tzinfo (~> 2.0)
20
+ ast (2.4.2)
21
+ chronic (0.10.2)
22
+ concurrent-ruby (1.2.2)
23
+ diff-lcs (1.5.0)
24
+ i18n (1.12.0)
25
+ concurrent-ruby (~> 1.0)
26
+ json (2.6.3)
27
+ language_server-protocol (3.17.0.3)
28
+ minitest (5.18.0)
29
+ parallel (1.22.1)
30
+ parser (3.2.2.0)
31
+ ast (~> 2.4.1)
32
+ rainbow (3.1.1)
33
+ rake (13.0.6)
34
+ regexp_parser (2.7.0)
35
+ rexml (3.2.5)
36
+ rspec (3.12.0)
37
+ rspec-core (~> 3.12.0)
38
+ rspec-expectations (~> 3.12.0)
39
+ rspec-mocks (~> 3.12.0)
40
+ rspec-core (3.12.1)
41
+ rspec-support (~> 3.12.0)
42
+ rspec-expectations (3.12.2)
43
+ diff-lcs (>= 1.2.0, < 2.0)
44
+ rspec-support (~> 3.12.0)
45
+ rspec-mocks (3.12.5)
46
+ diff-lcs (>= 1.2.0, < 2.0)
47
+ rspec-support (~> 3.12.0)
48
+ rspec-support (3.12.0)
49
+ rubocop (1.48.1)
50
+ json (~> 2.3)
51
+ parallel (~> 1.10)
52
+ parser (>= 3.2.0.0)
53
+ rainbow (>= 2.2.2, < 4.0)
54
+ regexp_parser (>= 1.8, < 3.0)
55
+ rexml (>= 3.2.5, < 4.0)
56
+ rubocop-ast (>= 1.26.0, < 2.0)
57
+ ruby-progressbar (~> 1.7)
58
+ unicode-display_width (>= 2.4.0, < 3.0)
59
+ rubocop-ast (1.28.0)
60
+ parser (>= 3.2.1.0)
61
+ rubocop-performance (1.16.0)
62
+ rubocop (>= 1.7.0, < 2.0)
63
+ rubocop-ast (>= 0.4.0)
64
+ ruby-progressbar (1.13.0)
65
+ standard (1.26.0)
66
+ language_server-protocol (~> 3.17.0.2)
67
+ rubocop (~> 1.48.1)
68
+ rubocop-performance (~> 1.16.0)
69
+ tzinfo (2.0.6)
70
+ concurrent-ruby (~> 1.0)
71
+ unicode-display_width (2.4.2)
72
+
73
+ PLATFORMS
74
+ arm64-darwin-22
75
+ x86_64-linux
76
+
77
+ DEPENDENCIES
78
+ activerecord
79
+ inputomatic!
80
+ rake (~> 13.0)
81
+ rspec (~> 3.0)
82
+ standard (~> 1.3)
83
+
84
+ BUNDLED WITH
85
+ 2.4.8
data/README.md CHANGED
@@ -35,6 +35,14 @@ class Expense < ApplicationRecord
35
35
  end
36
36
  ```
37
37
 
38
+ ## Further reading
39
+
40
+ Learn more about Inputomatic.
41
+
42
+ * [Humane Rails Forms](https://fly.io/ruby-dispatch/humane-rails-forms/) - Article about how forms can be made more humane in Rails with inputomatic.
43
+ * [Demo App](https://inputomatic-demo.fly.dev) - Demo rails app where you can try the form fields
44
+ * [Demo App Repo](https://github.com/rocketshipio/inputomatic-demo) - Source code of demo app
45
+
38
46
  ## Development
39
47
 
40
48
  After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake spec` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
data/Rakefile CHANGED
@@ -7,4 +7,4 @@ RSpec::Core::RakeTask.new(:spec)
7
7
 
8
8
  require "standard/rake"
9
9
 
10
- task default: %i[spec standard]
10
+ task default: %i[spec]
@@ -0,0 +1,76 @@
1
+ module Inputomatic
2
+ class ArithmeticInterpreter
3
+ CURRENCY_SYMBOLS = "$£¢€¥₩₪₹₫₴₱₲₳₵₸₺₼₽៛₠₡₢₣₤₥₦₧₨₩₪₫€₭₮₯₰₱₲₳₴₵₶₷₸₹₺₻₼₽₾₿ℳ".chars.freeze
4
+
5
+ def initialize(input, decimal_separator: '.', thousands_separator: ',')
6
+ @input = input
7
+ .gsub(/\s+/, '')
8
+ .gsub(thousands_separator, '')
9
+ .gsub(Regexp.union(CURRENCY_SYMBOLS), '')
10
+ @decimal_separator = decimal_separator
11
+ @index = 0
12
+ end
13
+
14
+ def parse
15
+ result = expression
16
+ if @index < @input.length
17
+ raise "Unexpected character: #{@input[@index]}"
18
+ end
19
+ result
20
+ end
21
+
22
+ private
23
+
24
+ def expression
25
+ result = term
26
+ while @index < @input.length
27
+ case @input[@index]
28
+ when '+'
29
+ @index += 1
30
+ result += term
31
+ when '-'
32
+ @index += 1
33
+ result -= term
34
+ else
35
+ break
36
+ end
37
+ end
38
+ result
39
+ end
40
+
41
+ def term
42
+ result = factor
43
+ while @index < @input.length
44
+ case @input[@index]
45
+ when '*'
46
+ @index += 1
47
+ result *= factor
48
+ when '/'
49
+ @index += 1
50
+ result /= factor
51
+ else
52
+ break
53
+ end
54
+ end
55
+ result
56
+ end
57
+
58
+ def factor
59
+ if @input[@index] == '('
60
+ @index += 1
61
+ result = expression
62
+ if @input[@index] != ')'
63
+ raise "Expected ')'"
64
+ end
65
+ @index += 1
66
+ else
67
+ start_index = @index
68
+ while @index < @input.length && /[\d#{@decimal_separator}]/.match?(@input[@index])
69
+ @index += 1
70
+ end
71
+ result = @input[start_index...@index].gsub(@decimal_separator, '.').to_f
72
+ end
73
+ result
74
+ end
75
+ end
76
+ end
@@ -0,0 +1,14 @@
1
+ require "chronic"
2
+
3
+ module Inputomatic
4
+ class DateTime < ActiveRecord::Type::Value
5
+ def initialize(*args, format: :long_ordinal, **kwargs)
6
+ super *args, **kwargs
7
+ @format = format
8
+ end
9
+
10
+ def cast_value(value)
11
+ value.is_a?(String) ? Chronic.parse(value) : value
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,7 @@
1
+ module Inputomatic
2
+ class Number < ActiveRecord::Type::Value
3
+ def cast_value(value)
4
+ value.is_a?(String) ? ArithmeticInterpreter.new(value).parse : value
5
+ end
6
+ end
7
+ end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Inputomatic
4
- VERSION = "0.1.0"
4
+ VERSION = "0.1.1"
5
5
  end
data/lib/inputomatic.rb CHANGED
@@ -1,95 +1,11 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require_relative "inputomatic/version"
4
- require "chronic"
5
4
 
6
5
  module Inputomatic
7
6
  class Error < StandardError; end
8
7
 
9
- class ArithmeticInterpreter
10
- def initialize(input, decimal_separator: '.', thousands_separator: ',')
11
- @input = input.gsub(/\s+/, '').gsub(thousands_separator, '')
12
- @decimal_separator = decimal_separator
13
- @index = 0
14
- end
15
-
16
- def parse
17
- result = expression
18
- if @index < @input.length
19
- raise "Unexpected character: #{@input[@index]}"
20
- end
21
- result
22
- end
23
-
24
- private
25
-
26
- def expression
27
- result = term
28
- while @index < @input.length
29
- case @input[@index]
30
- when '+'
31
- @index += 1
32
- result += term
33
- when '-'
34
- @index += 1
35
- result -= term
36
- else
37
- break
38
- end
39
- end
40
- result
41
- end
42
-
43
- def term
44
- result = factor
45
- while @index < @input.length
46
- case @input[@index]
47
- when '*'
48
- @index += 1
49
- result *= factor
50
- when '/'
51
- @index += 1
52
- result /= factor
53
- else
54
- break
55
- end
56
- end
57
- result
58
- end
59
-
60
- def factor
61
- if @input[@index] == '('
62
- @index += 1
63
- result = expression
64
- if @input[@index] != ')'
65
- raise "Expected ')'"
66
- end
67
- @index += 1
68
- else
69
- start_index = @index
70
- while @index < @input.length && /[\d#{@decimal_separator}]/.match?(@input[@index])
71
- @index += 1
72
- end
73
- result = @input[start_index...@index].gsub(@decimal_separator, '.').to_f
74
- end
75
- result
76
- end
77
- end
78
-
79
- class DateTime < ActiveRecord::Type::Value
80
- def initialize(*args, format: :long_ordinal, **kwargs)
81
- super *args, **kwargs
82
- @format = format
83
- end
84
-
85
- def cast_value(value)
86
- value.is_a?(String) ? Chronic.parse(value) : value
87
- end
88
- end
89
-
90
- class Number < ActiveRecord::Type::Value
91
- def cast_value(value)
92
- value.is_a?(String) ? ArithmeticInterpreter.new(value).parse : value
93
- end
94
- end
8
+ autoload :ArithmeticInterpreter, "inputomatic/arithmetic_interpreter"
9
+ autoload :DateTime, "inputomatic/date_time"
10
+ autoload :Number, "inputomatic/number"
95
11
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: inputomatic
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.1.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Brad Gessler
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2023-04-11 00:00:00.000000000 Z
11
+ date: 2023-04-12 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: chronic
@@ -24,6 +24,20 @@ dependencies:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
26
  version: '0.10'
27
+ - !ruby/object:Gem::Dependency
28
+ name: activerecord
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
27
41
  description: Make text boxes in your web apps handle human inputs like '1+2' or 'next
28
42
  tuesday'
29
43
  email:
@@ -37,10 +51,14 @@ files:
37
51
  - CHANGELOG.md
38
52
  - CODE_OF_CONDUCT.md
39
53
  - Gemfile
54
+ - Gemfile.lock
40
55
  - LICENSE.txt
41
56
  - README.md
42
57
  - Rakefile
43
58
  - lib/inputomatic.rb
59
+ - lib/inputomatic/arithmetic_interpreter.rb
60
+ - lib/inputomatic/date_time.rb
61
+ - lib/inputomatic/number.rb
44
62
  - lib/inputomatic/version.rb
45
63
  - sig/inputomatic.rbs
46
64
  homepage: https://github.com/rocketshipio/inputomatic