verbalize 2.2.0 → 2.3.0

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
- 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