verbalize 2.2.0 → 2.3.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: 69dc4bbf8a11fde19d5c0b7f84e0f5ea76cdbd4f
4
- data.tar.gz: 7aaa0f4b6d81861140a5b37c555371cec36aa6a2
2
+ SHA256:
3
+ metadata.gz: 318052d8276c42ce2790698c6293930e55f6ae6a726e53e15279f4e562b8daeb
4
+ data.tar.gz: cb2e05c821a3e0af1e9c7ded9677c756b5eaf5e2466acd7ce63f46fd48a5cc5a
5
5
  SHA512:
6
- metadata.gz: 7a39dcb9fb9c3458c00a9cda65018a3b2e68f5487b1e2f7a483d65d5590e196283de48dfb8b61d847771718313c7dbcb8532d02b4a1506357b022742e924927b
7
- data.tar.gz: 412d8f380f07a076783c6ff5335a19d29c93cc2220211c9e79a7b72e59f396edf208f1147e415b06937489e03fbc2ad8cbcdc9e1823f2d569592e2d8e3efd70d
6
+ metadata.gz: 0a2d4819f7168e6062a2ddf1cd8b2881988371597604601ab8f40d7e7e730574bac68f189d7d0aea9f3d1ac878b0e28a4ebab205766935f2c7d202a16faf21ce
7
+ data.tar.gz: 31a1b94052096f62aef1238ef6f1a250f7dc5eabadca325ee1c730feaba78e24492f7e4d931363c9f7743abc736cf0da178e1f586bc3fe5fd53fc9941cf8627d
@@ -1,4 +1,6 @@
1
1
  language: ruby
2
2
  rvm:
3
- - 2.2.2
4
- before_install: gem install bundler -v 1.10.6
3
+ - 2.6
4
+ - 2.5
5
+ - 2.4
6
+ - 2.3
@@ -4,6 +4,15 @@ All notable changes to this project will be documented in this file.
4
4
  The format is based on [Keep a Changelog](http://keepachangelog.com/)
5
5
  and this project adheres to [Semantic Versioning](http://semver.org/).
6
6
 
7
+ ## [Unreleased]
8
+ ### Added
9
+ - release documentation
10
+
11
+ ## 2.3.0 - 2019-09-23
12
+ ### Added
13
+ - you can now specify `validates :key { |value| ... }` on actions to run validation on the input
14
+ *before* running the `call` block.
15
+
7
16
  ## 2.2.0 - 2017-08-19
8
17
  ### Added
9
18
  - changelog started
data/README.md CHANGED
@@ -125,6 +125,25 @@ Add.optional_inputs # [:c, :d]
125
125
  Add.inputs # [:a, :b, :c, :d]
126
126
  ```
127
127
 
128
+ ## Validation
129
+ ```ruby
130
+ class FloatAdd
131
+ include Verbalize::Action
132
+
133
+ input :a, :b
134
+ validate(:a) { |a| a.is_a?(Float) }
135
+ validate(:b) { |b| b.is_a?(Float) && b > 10.0 }
136
+
137
+ def call
138
+ a + b
139
+ end
140
+ end
141
+
142
+ FloatAdd.call!(a: 1, b: 1) # fails with Input "a" failed validation!
143
+ FloatAdd.call!(a: 1.0, b: 1.0) # fails with Input "b" failed validation!
144
+ FloatAdd.call!(a: 1.0, b: 12.0) # 13.0
145
+ ```
146
+
128
147
  ## Comparison/Benchmark
129
148
  ```ruby
130
149
  require 'verbalize'
@@ -188,21 +207,21 @@ end
188
207
 
189
208
  ```
190
209
  Warming up --------------------------------------
191
- Ruby 53.203k i/100ms
192
- Verbalize 27.518k i/100ms
193
- Actionizer 4.933k i/100ms
194
- Interactor 4.166k i/100ms
210
+ Ruby 63.091k i/100ms
211
+ Verbalize 40.521k i/100ms
212
+ Actionizer 5.226k i/100ms
213
+ Interactor 4.874k i/100ms
195
214
  Calculating -------------------------------------
196
- Ruby 544.025k13.7%) i/s - 2.660M in 5.011207s
197
- Verbalize 278.738k8.0%) i/s - 1.403M in 5.074676s
198
- Actionizer 49.571k7.0%) i/s - 246.650k in 5.006194s
199
- Interactor 45.896k7.1%) i/s - 229.130k in 5.018389s
215
+ Ruby 751.604k 3.0%) i/s - 3.785M in 5.041472s
216
+ Verbalize 457.598k6.1%) i/s - 2.310M in 5.072488s
217
+ Actionizer 54.874k3.5%) i/s - 276.978k in 5.054541s
218
+ Interactor 52.294k3.2%) i/s - 263.196k in 5.038365s
200
219
 
201
220
  Comparison:
202
- Ruby: 544025.0 i/s
203
- Verbalize: 278737.9 i/s - 1.95x slower
204
- Actionizer: 49571.1 i/s - 10.97x slower
205
- Interactor: 45896.1 i/s - 11.85x slower
221
+ Ruby: 751604.0 i/s
222
+ Verbalize: 457597.9 i/s - 1.64x slower
223
+ Actionizer: 54873.6 i/s - 13.70x slower
224
+ Interactor: 52293.6 i/s - 14.37x slower
206
225
 
207
226
  ```
208
227
 
@@ -355,10 +374,10 @@ To install this gem onto your local machine, run `bundle exec rake install`. To
355
374
 
356
375
  ## Releasing
357
376
 
358
- - Update changelog, and VERSION
359
- - Commit to master and push to github
377
+ - Update CHANGELOG.md, and lib/verbalize/version.rb, commit, and push
360
378
  - [Create a new release on github](https://github.com/taylorzr/verbalize/releases/new)
361
- -
379
+ - Build the gem version: `gem build verbalize.gemspec`
380
+ - Push the gem version to rubygems: `gem push verbalize-<VERSION>.gem`
362
381
 
363
382
  ## Contributing
364
383
 
@@ -11,10 +11,25 @@ module Verbalize
11
11
  throw(THROWN_SYMBOL, failure_value)
12
12
  end
13
13
 
14
+ def action_inputs
15
+ self.class.inputs.map { |i| [i, self.send(i)] }.to_h
16
+ end
17
+
14
18
  def self.included(target)
15
19
  target.extend ClassMethods
16
20
  end
17
21
 
22
+ private
23
+
24
+ def __setup(key, value)
25
+ is_valid = self.class.input_is_valid?(key, value)
26
+ local_error = self.class.pop_local_error
27
+ fail!(local_error) if !is_valid && local_error
28
+ fail! "Input '#{key}' failed validation!" unless is_valid
29
+
30
+ instance_variable_set(:"@#{key}", value)
31
+ end
32
+
18
33
  module ClassMethods
19
34
  def required_inputs
20
35
  @required_inputs || []
@@ -36,6 +51,26 @@ module Verbalize
36
51
  @defaults
37
52
  end
38
53
 
54
+ def input_validations
55
+ @input_validations ||= {}
56
+ end
57
+
58
+ def input_is_valid?(input, value)
59
+ return true unless input_validations.include?(input.to_sym)
60
+
61
+ input_validations[input].call(value) == true
62
+ rescue => e
63
+ @local_error = e
64
+ false
65
+ end
66
+
67
+ def pop_local_error
68
+ return nil unless @local_error
69
+ @local_error
70
+ ensure
71
+ @local_error = nil
72
+ end
73
+
39
74
  # Because call/call! are defined when Action.input is called, they would
40
75
  # not be defined when there is no input. So we pre-define them here, and
41
76
  # if there is any input, they are overwritten
@@ -59,6 +94,11 @@ module Verbalize
59
94
  class_eval Build.call(required_inputs, optional_inputs, default_inputs)
60
95
  end
61
96
 
97
+ def validate(keyword, &block)
98
+ raise Verbalize::Error, 'Missing block to validate against!' unless block_given?
99
+ input_validations[keyword.to_sym] = block
100
+ end
101
+
62
102
  def assign_defaults(optional)
63
103
  @defaults = optional.select { |kw| kw.is_a?(Hash) }.reduce(&:merge)
64
104
  @defaults = (@defaults || {})
@@ -44,9 +44,9 @@ attr_reader #{attribute_readers_string}
44
44
  end
45
45
 
46
46
  def declaration_arguments_string
47
- required_segments = required_keywords.map { |keyword| "#{keyword}:" }
48
- optional_segments = optional_keywords.map { |keyword| "#{keyword}: nil" }
49
- default_segments = default_keywords.map { |keyword| "#{keyword}: self.defaults[:#{keyword}].call" }
47
+ required_segments = required_keywords.map { |kw| "#{kw}:" }
48
+ optional_segments = optional_keywords.map { |kw| "#{kw}: nil" }
49
+ default_segments = default_keywords.map { |kw| "#{kw}: self.defaults[:#{kw}].call" }
50
50
  (required_segments + optional_segments + default_segments).join(', ')
51
51
  end
52
52
 
@@ -55,7 +55,9 @@ attr_reader #{attribute_readers_string}
55
55
  end
56
56
 
57
57
  def initialize_body
58
- all_keywords.map { |keyword| "@#{keyword} = #{keyword}" }.join("\n ")
58
+ all_keywords.map do |keyword|
59
+ "__setup(:#{keyword}, #{keyword})"
60
+ end.join("\n ")
59
61
  end
60
62
 
61
63
  def attribute_readers_string
@@ -1,3 +1,3 @@
1
1
  module Verbalize
2
- VERSION = '2.2.0'.freeze
2
+ VERSION = '2.3.0'.freeze
3
3
  end
@@ -21,9 +21,9 @@ Gem::Specification.new do |spec|
21
21
  spec.require_paths = ['lib']
22
22
 
23
23
  spec.add_development_dependency 'bundler'
24
- spec.add_development_dependency 'rake', '~> 10.0'
24
+ spec.add_development_dependency 'rake'
25
25
  spec.add_development_dependency 'rspec'
26
26
  spec.add_development_dependency 'coveralls'
27
- spec.add_development_dependency 'rubocop', '0.45'
27
+ spec.add_development_dependency 'rubocop'
28
28
  spec.add_development_dependency 'pry'
29
29
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: verbalize
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.2.0
4
+ version: 2.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Zach Taylor
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2017-08-19 00:00:00.000000000 Z
11
+ date: 2019-09-26 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -28,16 +28,16 @@ dependencies:
28
28
  name: rake
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - "~>"
31
+ - - ">="
32
32
  - !ruby/object:Gem::Version
33
- version: '10.0'
33
+ version: '0'
34
34
  type: :development
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
- - - "~>"
38
+ - - ">="
39
39
  - !ruby/object:Gem::Version
40
- version: '10.0'
40
+ version: '0'
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: rspec
43
43
  requirement: !ruby/object:Gem::Requirement
@@ -70,16 +70,16 @@ dependencies:
70
70
  name: rubocop
71
71
  requirement: !ruby/object:Gem::Requirement
72
72
  requirements:
73
- - - '='
73
+ - - ">="
74
74
  - !ruby/object:Gem::Version
75
- version: '0.45'
75
+ version: '0'
76
76
  type: :development
77
77
  prerelease: false
78
78
  version_requirements: !ruby/object:Gem::Requirement
79
79
  requirements:
80
- - - '='
80
+ - - ">="
81
81
  - !ruby/object:Gem::Version
82
- version: '0.45'
82
+ version: '0'
83
83
  - !ruby/object:Gem::Dependency
84
84
  name: pry
85
85
  requirement: !ruby/object:Gem::Requirement
@@ -142,8 +142,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
142
142
  - !ruby/object:Gem::Version
143
143
  version: '0'
144
144
  requirements: []
145
- rubyforge_project:
146
- rubygems_version: 2.6.11
145
+ rubygems_version: 3.0.3
147
146
  signing_key:
148
147
  specification_version: 4
149
148
  summary: Verb based class pattern