mutations 0.7.2 → 0.8.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.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 67b3c3f2b9a7980e259b2d220f0677988b83694b
4
+ data.tar.gz: eb4d1d4f79f74dfe470878984773729807ae167a
5
+ SHA512:
6
+ metadata.gz: 80a6dabcd0a2e745faba5dbb053a1aec47844c88ade1500850b2006216782f115c7c1272aa9ee39f18e358ee1d49b005679820b32f03b34fb69cf0954a67763a
7
+ data.tar.gz: 559db59b1b5cd6281e32e9f39fd03b5d281b18d56b44afcc3c2ad8636e5fcdfe2064a47a3db73fb5008a54395fa4c54a0a5856c1db1ff5deb310c270019a5e8a
Binary file
@@ -0,0 +1 @@
1
+ ��j�>��g��Ibӟ3��exֶ���ێ0��:�.��jdsH瞰 �'��ojv�����П���?�Q���UQ�Iז!�����ìV�;�G���ӵ�O�q���[��τ��8,�Fp��3�8���N Q&N5y�$�D)�?�\��9t������o ���3��~D �-oV�+K�Ke�'XFf[[&m7<T(r�q��ևҎWL�Ǘ����z�@#
@@ -1,7 +1,11 @@
1
1
  language: ruby
2
+ before_install:
3
+ - gem install bundler # the default bundler version on travis is very old and causes 1.9.3 build issues
2
4
  rvm:
3
5
  - 1.9.3
4
6
  - jruby-19mode
5
7
  - rbx
6
8
  - 2.0.0
7
9
  - 2.1.0
10
+ - 2.2.0
11
+ - 2.3.0
@@ -1,3 +1,11 @@
1
+ 0.8.0
2
+ -----------
3
+ - Add Time filter: ```time :start_time```
4
+ - Remove unprintable characters from `string` by default.
5
+ - Add bigdecimal and float as non-strict string input options
6
+ - Additonal filters that are used in arrays can now have block arguments
7
+ - Add `empty_is_nil` option to integer filter.
8
+
1
9
  0.7.2
2
10
  -----------
3
11
 
data/Gemfile CHANGED
@@ -1,14 +1,8 @@
1
1
  source 'http://rubygems.org'
2
2
  gemspec
3
3
 
4
- gem 'activesupport'
5
-
6
4
  platforms :rbx do
7
5
  gem 'rubysl', '~> 2.0'
8
6
  gem 'psych'
9
7
  gem 'rubinius-developer_tools'
10
8
  end
11
-
12
- group :test do
13
- gem 'minitest', '~> 4.0'
14
- end
data/Rakefile CHANGED
@@ -1,8 +1,9 @@
1
- require 'rake/testtask'
1
+ require "bundler/gem_tasks"
2
+ require "rake/testtask"
2
3
  Rake::TestTask.new(:test) do |test|
3
- test.libs << 'spec'
4
+ test.libs << "spec"
4
5
  # test.warning = true # Wow that outputs a lot of shit
5
- test.pattern = 'spec/**/*_spec.rb'
6
+ test.pattern = "spec/**/*_spec.rb"
6
7
  end
7
8
 
8
- task :default => :test
9
+ task :default => :test
@@ -1,6 +1,8 @@
1
1
  require 'active_support/core_ext/hash/indifferent_access'
2
2
  require 'active_support/core_ext/string/inflections'
3
3
  require 'date'
4
+ require 'time'
5
+ require 'bigdecimal'
4
6
 
5
7
  require 'mutations/version'
6
8
  require 'mutations/exception'
@@ -13,6 +15,7 @@ require 'mutations/float_filter'
13
15
  require 'mutations/boolean_filter'
14
16
  require 'mutations/duck_filter'
15
17
  require 'mutations/date_filter'
18
+ require 'mutations/time_filter'
16
19
  require 'mutations/file_filter'
17
20
  require 'mutations/model_filter'
18
21
  require 'mutations/array_filter'
@@ -1,9 +1,9 @@
1
1
  module Mutations
2
2
  class ArrayFilter < InputFilter
3
3
  def self.register_additional_filter(type_class, type_name)
4
- define_method(type_name) do | *args |
4
+ define_method(type_name) do | *args, &block |
5
5
  options = args[0] || {}
6
- @element_filter = type_class.new(options)
6
+ @element_filter = type_class.new(options, &block)
7
7
  end
8
8
  end
9
9
 
@@ -2,7 +2,7 @@ module Mutations
2
2
  class DateFilter < AdditionalFilter
3
3
  @default_options = {
4
4
  :nils => false, # true allows an explicit nil to be valid. Overrides any other options
5
- :format => nil, # If nil, Date.parse will be used for coercsion. If something like "%Y-%m-%d", Date.strptime is used
5
+ :format => nil, # If nil, Date.parse will be used for coercion. If something like "%Y-%m-%d", Date.strptime is used
6
6
  :after => nil, # A date object, representing the minimum date allowed, inclusive
7
7
  :before => nil # A date object, representing the maximum date allowed, inclusive
8
8
  }
@@ -15,7 +15,7 @@ module Mutations
15
15
  end
16
16
 
17
17
  # Now check if it's empty:
18
- return [data, :empty] if data == ""
18
+ return [data, :empty] if "" == data
19
19
 
20
20
  if data.is_a?(Date) # Date and DateTime
21
21
  actual_date = data
@@ -2,6 +2,7 @@ module Mutations
2
2
  class IntegerFilter < AdditionalFilter
3
3
  @default_options = {
4
4
  :nils => false, # true allows an explicit nil to be valid. Overrides any other options
5
+ :empty_is_nil => false, # if true, treat empty string as if it were nil
5
6
  :min => nil, # lowest value, inclusive
6
7
  :max => nil, # highest value, inclusive
7
8
  :in => nil, # Can be an array like %w(3 4 5)
@@ -9,12 +10,16 @@ module Mutations
9
10
 
10
11
  def filter(data)
11
12
 
13
+ if options[:empty_is_nil] && data == ""
14
+ data = nil
15
+ end
16
+
12
17
  # Handle nil case
13
18
  if data.nil?
14
19
  return [nil, nil] if options[:nils]
15
20
  return [nil, :nils]
16
21
  end
17
-
22
+
18
23
  # Now check if it's empty:
19
24
  return [data, :empty] if data == ""
20
25
 
@@ -9,7 +9,8 @@ module Mutations
9
9
  :max_length => nil, # Can be a number like 10, meaning that at most 10 codepoints are permitted
10
10
  :matches => nil, # Can be a regexp
11
11
  :in => nil, # Can be an array like %w(red blue green)
12
- :discard_empty => false # If the param is optional, discard_empty: true drops empty fields.
12
+ :discard_empty => false, # If the param is optional, discard_empty: true drops empty fields.
13
+ :allow_control_characters => false # false removes unprintable characters from the string
13
14
  }
14
15
 
15
16
  def filter(data)
@@ -21,12 +22,15 @@ module Mutations
21
22
  end
22
23
 
23
24
  # At this point, data is not nil. If it's not a string, convert it to a string for some standard classes
24
- data = data.to_s if !options[:strict] && [TrueClass, FalseClass, Fixnum, Symbol].include?(data.class)
25
+ data = data.to_s if !options[:strict] && [TrueClass, FalseClass, Fixnum, Float, BigDecimal, Symbol].include?(data.class)
25
26
 
26
27
  # Now ensure it's a string:
27
28
  return [data, :string] unless data.is_a?(String)
28
29
 
29
- # At this point, data is a string. Now transform it using strip:
30
+ # At this point, data is a string. Now remove unprintable characters from the string:
31
+ data = data.gsub(/[^[:print:]\t\r\n]+/, ' ') unless options[:allow_control_characters]
32
+
33
+ # Transform it using strip:
30
34
  data = data.strip if options[:strip]
31
35
 
32
36
  # Now check if it's blank:
@@ -0,0 +1,54 @@
1
+ module Mutations
2
+ class TimeFilter < AdditionalFilter
3
+ @default_options = {
4
+ :nils => false, # true allows an explicit nil to be valid. Overrides any other options
5
+ :format => nil, # If nil, Time.parse will be used for coercion, otherwise we will use Time.strptime
6
+ :after => nil, # A Time object, representing the minimum time allowed, inclusive
7
+ :before => nil # A Time object, representing the maximum time allowed, inclusive
8
+ }
9
+
10
+ def filter(data)
11
+ # Handle nil case
12
+ if data.nil?
13
+ return [nil, nil] if options[:nils]
14
+ return [nil, :nils]
15
+ end
16
+
17
+ # Now check if it's empty:
18
+ return [data, :empty] if '' == data
19
+
20
+ if data.is_a?(Time) # Time
21
+ actual_time = data
22
+ elsif data.is_a?(String)
23
+ begin
24
+ actual_time = if options[:format]
25
+ Time.strptime(data, options[:format])
26
+ else
27
+ Time.parse(data)
28
+ end
29
+ rescue ArgumentError
30
+ return [nil, :time]
31
+ end
32
+ elsif data.respond_to?(:to_time) # Date, DateTime
33
+ actual_time = data.to_time
34
+ else
35
+ return [nil, :time]
36
+ end
37
+
38
+ if options[:after]
39
+ if actual_time <= options[:after]
40
+ return [nil, :after]
41
+ end
42
+ end
43
+
44
+ if options[:before]
45
+ if actual_time >= options[:before]
46
+ return [nil, :before]
47
+ end
48
+ end
49
+
50
+ # We win, it's valid!
51
+ [actual_time, nil]
52
+ end
53
+ end
54
+ end
@@ -1,3 +1,3 @@
1
1
  module Mutations
2
- VERSION = "0.7.2"
2
+ VERSION = "0.8.0"
3
3
  end
@@ -12,7 +12,7 @@ Gem::Specification.new do |s|
12
12
  s.test_files = `git ls-files test`.split("\n")
13
13
  s.require_path = 'lib'
14
14
 
15
- s.add_dependency 'activesupport'
15
+ s.add_dependency "activesupport"
16
16
  s.add_development_dependency 'minitest', '~> 4'
17
17
  s.add_development_dependency 'rake'
18
18
  end
@@ -125,5 +125,22 @@ describe "Mutations::AdditionalFilter" do
125
125
  assert_equal true, TestCommandUsingBlockArgument.run!(:foo => 'bar')
126
126
  end
127
127
 
128
+ class TestCommandUsingBlockArgumentInAnArray < Mutations::Command
129
+ required do
130
+ array :some_array do
131
+ additional_with_block do
132
+ should_be_called
133
+ end
134
+ end
135
+ end
136
+
137
+ def execute
138
+ true
139
+ end
140
+ end
141
+
142
+ it "It can have a block constructor when used in an array" do
143
+ assert_equal true, TestCommandUsingBlockArgumentInAnArray.run!(:some_array => ['bar'])
144
+ end
128
145
  end
129
146
  end
@@ -1,6 +1,4 @@
1
1
  require 'spec_helper'
2
- require 'stringio'
3
- require 'tempfile'
4
2
 
5
3
  describe "Mutations::DateFilter" do
6
4
  it "takes a date object" do
@@ -19,7 +17,7 @@ describe "Mutations::DateFilter" do
19
17
  assert_equal nil, errors
20
18
  end
21
19
 
22
- it "takes a Time object and coverts it to a date" do
20
+ it "takes a Time object and converts it to a date" do
23
21
  time = Time.now
24
22
  f = Mutations::DateFilter.new
25
23
  filtered, errors = f.filter(time)
@@ -61,7 +59,7 @@ describe "Mutations::DateFilter" do
61
59
  assert_equal nil, errors
62
60
  end
63
61
 
64
- it "gives errors when the given date is after the after before" do
62
+ it "gives errors when the given date is after the before date" do
65
63
  date = Date.new(2005, 1, 1)
66
64
  before_date = Date.new(2000, 1, 1)
67
65
  f = Mutations::DateFilter.new(:before => before_date)
@@ -130,6 +128,7 @@ describe "Mutations::DateFilter" do
130
128
  it "considers empty strings to be empty" do
131
129
  f = Mutations::DateFilter.new
132
130
  filtered, errors = f.filter("")
131
+ assert_equal "", filtered
133
132
  assert_equal :empty, errors
134
133
  end
135
134
 
@@ -51,6 +51,19 @@ describe "Mutations::IntegerFilter" do
51
51
  assert_equal :empty, errors
52
52
  end
53
53
 
54
+ it "considers empty strings to be nil if empty_is_nil option is used" do
55
+ f = Mutations::IntegerFilter.new(:empty_is_nil => true)
56
+ filtered, errors = f.filter("")
57
+ assert_equal :nils, errors
58
+ end
59
+
60
+ it "returns empty strings as nil if empty_is_nil option is used" do
61
+ f = Mutations::IntegerFilter.new(:empty_is_nil => true, :nils => true)
62
+ filtered, errors = f.filter("")
63
+ assert_equal nil, filtered
64
+ assert_equal nil, errors
65
+ end
66
+
54
67
  it "considers low numbers invalid" do
55
68
  f = Mutations::IntegerFilter.new(:min => 10)
56
69
  filtered, errors = f.filter(3)
@@ -80,6 +80,13 @@ describe "Mutations::StringFilter" do
80
80
  assert_equal :empty, errors
81
81
  end
82
82
 
83
+ it "considers strings that contain only unprintable characters to be invalid" do
84
+ sf = Mutations::StringFilter.new(:empty => false)
85
+ filtered, errors = sf.filter("\u0000\u0000")
86
+ assert_equal "", filtered
87
+ assert_equal :empty, errors
88
+ end
89
+
83
90
  it "considers long strings to be invalid" do
84
91
  sf = Mutations::StringFilter.new(:max_length => 5)
85
92
  filtered, errors = sf.filter("123456")
@@ -150,6 +157,20 @@ describe "Mutations::StringFilter" do
150
157
  assert_equal nil, errors
151
158
  end
152
159
 
160
+ it "converts bigdecimals to strings" do
161
+ sf = Mutations::StringFilter.new(:strict => false)
162
+ filtered, errors = sf.filter(BigDecimal.new("0.0001"))
163
+ assert_equal "0.1E-3", filtered
164
+ assert_equal nil, errors
165
+ end
166
+
167
+ it "converts floats to strings" do
168
+ sf = Mutations::StringFilter.new(:strict => false)
169
+ filtered, errors = sf.filter(0.0001)
170
+ assert_equal "0.0001", filtered
171
+ assert_equal nil, errors
172
+ end
173
+
153
174
  it "converts booleans to strings" do
154
175
  sf = Mutations::StringFilter.new(:strict => false)
155
176
  filtered, errors = sf.filter(true)
@@ -171,10 +192,47 @@ describe "Mutations::StringFilter" do
171
192
  assert_equal :string, errors
172
193
  end
173
194
 
195
+ it "disallows bigdecimals" do
196
+ sf = Mutations::StringFilter.new(:strict => true)
197
+ big_decimal = BigDecimal.new("0.0001")
198
+ filtered, errors = sf.filter(big_decimal)
199
+ assert_equal big_decimal, filtered
200
+ assert_equal :string, errors
201
+ end
202
+
203
+ it "disallows floats" do
204
+ sf = Mutations::StringFilter.new(:strict => true)
205
+ filtered, errors = sf.filter(0.0001)
206
+ assert_equal 0.0001, filtered
207
+ assert_equal :string, errors
208
+ end
209
+
174
210
  it "disallows booleans" do
175
211
  sf = Mutations::StringFilter.new(:strict => true)
176
212
  filtered, errors = sf.filter(true)
177
213
  assert_equal true, filtered
178
214
  assert_equal :string, errors
179
215
  end
216
+
217
+ it "removes unprintable characters" do
218
+ sf = Mutations::StringFilter.new(:allow_control_characters => false)
219
+ filtered, errors = sf.filter("Hello\u0000\u0000World!")
220
+ assert_equal "Hello World!", filtered
221
+ assert_equal nil, errors
222
+ end
223
+
224
+ it "doesn't remove unprintable characters" do
225
+ sf = Mutations::StringFilter.new(:allow_control_characters => true)
226
+ filtered, errors = sf.filter("Hello\u0000\u0000World!")
227
+ assert_equal "Hello\u0000\u0000World!", filtered
228
+ assert_equal nil, errors
229
+ end
230
+
231
+ it "doesn't remove tabs, spaces and line breaks" do
232
+ sf = Mutations::StringFilter.new(:allow_control_characters => false)
233
+ filtered, errors = sf.filter("Hello,\tWorld !\r\nNew Line")
234
+ assert_equal "Hello,\tWorld !\r\nNew Line", filtered
235
+ assert_equal nil, errors
236
+ end
237
+
180
238
  end
@@ -0,0 +1,130 @@
1
+ require 'spec_helper'
2
+
3
+ describe "Mutations::TimeFilter" do
4
+
5
+ it "takes a Time object" do
6
+ time = Time.now
7
+ f = Mutations::TimeFilter.new
8
+ filtered, errors = f.filter(time)
9
+ assert_equal time, filtered
10
+ assert_equal nil, errors
11
+ end
12
+
13
+ it "takes a Date object and converts it to a time" do
14
+ date = Date.new
15
+ f = Mutations::TimeFilter.new
16
+ filtered, errors = f.filter(date)
17
+ assert_equal date.to_time, filtered
18
+ assert_equal nil, errors
19
+ end
20
+
21
+ it "takes a DateTime object and converts it to a time" do
22
+ date = DateTime.new
23
+ f = Mutations::TimeFilter.new
24
+ filtered, errors = f.filter(date)
25
+ assert_equal date.to_time, filtered
26
+ assert_equal nil, errors
27
+ end
28
+
29
+ it "checks if the given time is after a certain time" do
30
+ time = Time.now
31
+ f = Mutations::TimeFilter.new(:after => time - 1)
32
+ filtered, errors = f.filter(time)
33
+ assert_equal time, filtered
34
+ assert_equal nil, errors
35
+ end
36
+
37
+ it "gives errors when the given time is before the after time" do
38
+ time = Time.now
39
+ f = Mutations::TimeFilter.new(:after => time + 1)
40
+ filtered, errors = f.filter(time)
41
+ assert_equal nil, filtered
42
+ assert_equal :after, errors
43
+ end
44
+
45
+ it "checks if the given time is before a certain time" do
46
+ time = Time.now
47
+ f = Mutations::TimeFilter.new(:before => time + 1)
48
+ filtered, errors = f.filter(time)
49
+ assert_equal time, filtered
50
+ assert_equal nil, errors
51
+ end
52
+
53
+ it "gives errors when the given time is after the before time" do
54
+ time = Time.now
55
+ f = Mutations::TimeFilter.new(:before => time - 1)
56
+ filtered, errors = f.filter(time)
57
+ assert_equal nil, filtered
58
+ assert_equal :before, errors
59
+ end
60
+
61
+ it "checks if the given time is in the given range" do
62
+ time = Time.now
63
+ f = Mutations::TimeFilter.new(:after => time - 1, :before => time + 1)
64
+ filtered, errors = f.filter(time)
65
+ assert_equal time, filtered
66
+ assert_equal nil, errors
67
+ end
68
+
69
+ it "should be able to parse a D-M-Y string to a time" do
70
+ date_string = "2-1-2000"
71
+ date = Date.new(2000, 1, 2)
72
+ f = Mutations::TimeFilter.new
73
+ filtered, errors = f.filter(date_string)
74
+ assert_equal date.to_time, filtered
75
+ assert_equal nil, errors
76
+ end
77
+
78
+ it "should be able to parse a Y-M-D string to a time" do
79
+ date_string = "2000-1-2"
80
+ date = Date.new(2000, 1, 2)
81
+ f = Mutations::TimeFilter.new
82
+ filtered, errors = f.filter(date_string)
83
+ assert_equal date.to_time, filtered
84
+ assert_equal nil, errors
85
+ end
86
+
87
+ it "should be able to handle time formatting" do
88
+ time_string = "2000-1-2 12:13:14"
89
+ time = Time.new(2000, 1, 2, 12, 13, 14)
90
+ f = Mutations::TimeFilter.new(:format => '%Y-%m-%d %H:%M:%S')
91
+ filtered, errors = f.filter(time_string)
92
+ assert_equal time, filtered
93
+ assert_equal nil, errors
94
+
95
+ time_string = "1, 2, 2000, 121314"
96
+ f = Mutations::TimeFilter.new(:format => '%m, %d, %Y, %H%M%S')
97
+ filtered, errors = f.filter(time_string)
98
+ assert_equal time, filtered
99
+ assert_equal nil, errors
100
+ end
101
+
102
+ it "considers nil to be invalid" do
103
+ f = Mutations::TimeFilter.new
104
+ filtered, errors = f.filter(nil)
105
+ assert_equal nil, filtered
106
+ assert_equal :nils, errors
107
+ end
108
+
109
+ it "allows the use of nil when specified" do
110
+ f = Mutations::TimeFilter.new(:nils => true)
111
+ filtered, errors = f.filter(nil)
112
+ assert_equal nil, filtered
113
+ assert_equal nil, errors
114
+ end
115
+
116
+ it "considers empty strings to be empty" do
117
+ f = Mutations::TimeFilter.new
118
+ filtered, errors = f.filter('')
119
+ assert_equal '', filtered
120
+ assert_equal :empty, errors
121
+ end
122
+
123
+ it "doesn't allow non-existing times" do
124
+ invalid_time_string = "1, 20, 2013 25:13"
125
+ f = Mutations::TimeFilter.new
126
+ filtered, errors = f.filter(invalid_time_string)
127
+ assert_equal nil, filtered
128
+ assert_equal :time, errors
129
+ end
130
+ end
metadata CHANGED
@@ -1,64 +1,78 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: mutations
3
3
  version: !ruby/object:Gem::Version
4
- prerelease:
5
- version: 0.7.2
4
+ version: 0.8.0
6
5
  platform: ruby
7
6
  authors:
8
7
  - Jonathan Novak
9
8
  autorequire:
10
9
  bindir: bin
11
- cert_chain: []
12
- date: 2013-12-30 00:00:00.000000000 Z
10
+ cert_chain:
11
+ - |
12
+ -----BEGIN CERTIFICATE-----
13
+ MIIDXDCCAkSgAwIBAgIBATANBgkqhkiG9w0BAQUFADA6MQowCAYDVQQDDAFwMRcw
14
+ FQYKCZImiZPyLGQBGRYHdHJpY2tvZDETMBEGCgmSJomT8ixkARkWA2NvbTAeFw0x
15
+ NjA0MjUyMTQ4NDBaFw0xNzA0MjUyMTQ4NDBaMDoxCjAIBgNVBAMMAXAxFzAVBgoJ
16
+ kiaJk/IsZAEZFgd0cmlja29kMRMwEQYKCZImiZPyLGQBGRYDY29tMIIBIjANBgkq
17
+ hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA3o2utXZQGfUe4DVqUPWirBGMOZFbmdHL
18
+ yK0/BcSaS4KT9yHZ3HmdarZth2OY9cceG1IqHBQBm4+aW5e8yT2bGAOkGbnalSAG
19
+ hgy376xolLXc2OSw9guTutZ/lO/0B9sicS+92VtwKu/+VR2wousPIJSIXQMYBbz/
20
+ I4266npP7/gHuejxxXhrDQ4cnDZY/OmcQpYxaKX2Nb8/PkoBIlIC2dbM8/f4pML0
21
+ 8YEtD19QPs5AU00doh2HENo0QInKyjvWkmGxVQTaynGVMfSAhmLr0i+DSg6Rck2D
22
+ O3mi2aBWAfZS/yiGL0E6ZvAKMaiW9tZPbP+x72iT9DuH5MZiAqlbOQIDAQABo20w
23
+ azAJBgNVHRMEAjAAMAsGA1UdDwQEAwIEsDAdBgNVHQ4EFgQUONNcTs7C+A6N5EMj
24
+ HGkH+mQhqtUwGAYDVR0RBBEwD4ENcEB0cmlja29kLmNvbTAYBgNVHRIEETAPgQ1w
25
+ QHRyaWNrb2QuY29tMA0GCSqGSIb3DQEBBQUAA4IBAQCbTR4U4G1YNcU5R/6kZUIw
26
+ XaKBAu4CHUIAHj9A1m/wp8siGeoaE1PzkxfSotM7VYG/kItWxlocEFpJLe3ouiy+
27
+ ZFgUNUigTPfdzrtpWOfLThDGyBpKo8lwpndbUb9KG+IflJ7dJhpw32rXu1rZojl6
28
+ D3FU30VBrEA8nIM/flPiGgmmhL/eOE9exRTYF9ePsmV2OzsR1CxHx8856/JEzov5
29
+ Kgw8az4smHcDSM3d9ZORqx+gg1A9wQpTrrA68mWf1i0QK+r+C9cys7m+6UWkLKSa
30
+ ZVUPzKU88XkDLtlpM6AQpL+fslquuq8VF3Fp68YYg1uppU2wexcbTcjS/cgoml6b
31
+ -----END CERTIFICATE-----
32
+ date: 2016-06-05 00:00:00.000000000 Z
13
33
  dependencies:
14
34
  - !ruby/object:Gem::Dependency
15
35
  name: activesupport
16
36
  requirement: !ruby/object:Gem::Requirement
17
- none: false
18
37
  requirements:
19
- - - '>='
38
+ - - ">="
20
39
  - !ruby/object:Gem::Version
21
40
  version: '0'
22
41
  type: :runtime
42
+ prerelease: false
23
43
  version_requirements: !ruby/object:Gem::Requirement
24
- none: false
25
44
  requirements:
26
- - - '>='
45
+ - - ">="
27
46
  - !ruby/object:Gem::Version
28
47
  version: '0'
29
- prerelease: false
30
48
  - !ruby/object:Gem::Dependency
31
49
  name: minitest
32
50
  requirement: !ruby/object:Gem::Requirement
33
- none: false
34
51
  requirements:
35
- - - ~>
52
+ - - "~>"
36
53
  - !ruby/object:Gem::Version
37
54
  version: '4'
38
55
  type: :development
56
+ prerelease: false
39
57
  version_requirements: !ruby/object:Gem::Requirement
40
- none: false
41
58
  requirements:
42
- - - ~>
59
+ - - "~>"
43
60
  - !ruby/object:Gem::Version
44
61
  version: '4'
45
- prerelease: false
46
62
  - !ruby/object:Gem::Dependency
47
63
  name: rake
48
64
  requirement: !ruby/object:Gem::Requirement
49
- none: false
50
65
  requirements:
51
- - - '>='
66
+ - - ">="
52
67
  - !ruby/object:Gem::Version
53
68
  version: '0'
54
69
  type: :development
70
+ prerelease: false
55
71
  version_requirements: !ruby/object:Gem::Requirement
56
- none: false
57
72
  requirements:
58
- - - '>='
73
+ - - ">="
59
74
  - !ruby/object:Gem::Version
60
75
  version: '0'
61
- prerelease: false
62
76
  description: Compose your business logic into commands that sanitize and validate
63
77
  input.
64
78
  email: jnovak@gmail.com
@@ -66,8 +80,8 @@ executables: []
66
80
  extensions: []
67
81
  extra_rdoc_files: []
68
82
  files:
69
- - .gitignore
70
- - .travis.yml
83
+ - ".gitignore"
84
+ - ".travis.yml"
71
85
  - CHANGELOG.md
72
86
  - Gemfile
73
87
  - MIT-LICENSE
@@ -91,6 +105,7 @@ files:
91
105
  - lib/mutations/model_filter.rb
92
106
  - lib/mutations/outcome.rb
93
107
  - lib/mutations/string_filter.rb
108
+ - lib/mutations/time_filter.rb
94
109
  - lib/mutations/version.rb
95
110
  - mutations.gemspec
96
111
  - spec/additional_filter_spec.rb
@@ -111,28 +126,29 @@ files:
111
126
  - spec/simple_command.rb
112
127
  - spec/spec_helper.rb
113
128
  - spec/string_filter_spec.rb
129
+ - spec/time_filter_spec.rb
114
130
  homepage: http://github.com/cypriss/mutations
115
131
  licenses: []
132
+ metadata: {}
116
133
  post_install_message:
117
134
  rdoc_options: []
118
135
  require_paths:
119
136
  - lib
120
137
  required_ruby_version: !ruby/object:Gem::Requirement
121
- none: false
122
138
  requirements:
123
- - - '>='
139
+ - - ">="
124
140
  - !ruby/object:Gem::Version
125
141
  version: '0'
126
142
  required_rubygems_version: !ruby/object:Gem::Requirement
127
- none: false
128
143
  requirements:
129
- - - '>='
144
+ - - ">="
130
145
  - !ruby/object:Gem::Version
131
146
  version: '0'
132
147
  requirements: []
133
148
  rubyforge_project:
134
- rubygems_version: 1.8.24
149
+ rubygems_version: 2.5.1
135
150
  signing_key:
136
- specification_version: 3
151
+ specification_version: 4
137
152
  summary: Compose your business logic into commands that sanitize and validate input.
138
153
  test_files: []
154
+ has_rdoc:
Binary file