lambda_validators 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: f3abc1499cfc1548300e8696f6ea542d1b4ab4f9
4
+ data.tar.gz: 231c8846eb86f688e7123889ed8b3037fbbde123
5
+ SHA512:
6
+ metadata.gz: 2fdfd2da82b84db7eb8bafc9c27116a8a472305cc56f5e00f4e3fb38a19b60dc0b21392eebbcd0566d5bba4f2e9c76314a671cea22b046fdb619f429558a803d
7
+ data.tar.gz: d4be7eb69e4402f1a5a62a26e9072dae66bbf21752d33211b666f3aafeddcb754a527aaac0be8bad16ab79f2114a5cd6edb70f5ccbd4f161feec2580bf8464c0
data/.gitignore ADDED
@@ -0,0 +1,40 @@
1
+ # SimpleCov
2
+ test/coverage
3
+
4
+ # Bundler
5
+ Gemfile.lock
6
+
7
+ *.gem
8
+ *.rbc
9
+ /.config
10
+ /coverage/
11
+ /InstalledFiles
12
+ /pkg/
13
+ /spec/reports/
14
+ /test/tmp/
15
+ /test/version_tmp/
16
+ /tmp/
17
+
18
+ ## Specific to RubyMotion:
19
+ .dat*
20
+ .repl_history
21
+ build/
22
+
23
+ ## Documentation cache and generated files:
24
+ /.yardoc/
25
+ /_yardoc/
26
+ /doc/
27
+ /rdoc/
28
+
29
+ ## Environment normalisation:
30
+ /.bundle/
31
+ /lib/bundler/man/
32
+
33
+ # for a library or gem, you might want to ignore these files since the code is
34
+ # intended to run in multiple environments; otherwise, check them in:
35
+ # Gemfile.lock
36
+ # .ruby-version
37
+ # .ruby-gemset
38
+
39
+ # unless supporting rvm < 1.11.0 or doing something fancy, ignore this:
40
+ .rvmrc
data/.ruby-version ADDED
@@ -0,0 +1 @@
1
+ 2.0.0
data/.simplecov ADDED
@@ -0,0 +1,14 @@
1
+ SimpleCov.start do
2
+ coverage_dir "test/coverage"
3
+ command_name "tests"
4
+
5
+ use_merging true
6
+ merge_timeout 3600
7
+
8
+ add_filter "test/"
9
+
10
+ add_group "All", "/lib/*.rb"
11
+
12
+ formatter SimpleCov::Formatter::HTMLFormatter
13
+ end
14
+
data/Gemfile ADDED
@@ -0,0 +1,3 @@
1
+ source "https://rubygems.org"
2
+
3
+ gemspec
data/Guardfile ADDED
@@ -0,0 +1,13 @@
1
+ guard :minitest do
2
+
3
+ # run all tests when lib main module file changes
4
+ watch(%r{^lib/lambda_validators.rb$}) { "test" }
5
+
6
+ # run accompanying test for single source file if it changes
7
+ watch(%r{^lib/(.*)\.rb$}) {|m| "test/#{m[1]}_test.rb" }
8
+
9
+ # run test whenever it changes
10
+ watch(%r{^test/(.*)\/?(.*)?_test\.rb$})
11
+
12
+ end
13
+
data/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ The MIT License (MIT)
2
+
3
+ Copyright (c) 2014 Markus Seeger
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,28 @@
1
+ lambda_validators
2
+ =================
3
+
4
+ Simple all-purpose data validation (lambda-based)
5
+
6
+ Until complete documentation is done, here are some examples, taken from the unit tests:
7
+
8
+ (1) Adding validations one-by-one in block syntax:
9
+
10
+ validator = DataValidator.new
11
+ validator.add("data must be != 3") {|data| data != 3}
12
+ validator.add("data must be != 4") {|data| data != 4}
13
+
14
+ validator.validate(2) # => true
15
+ validator.last_error # => nil
16
+
17
+ validator.validate(3) # => false
18
+ validator.last_error # => "data must be != 3"
19
+
20
+ (2) Adding multiple validations as lambdas via constructor as Array:
21
+
22
+ validator = DataValidator.new([
23
+ ["data must be != 2", ->(data) { data != 2 }],
24
+ ["data must be != 3", ->(data) { data != 3 }]
25
+ ])
26
+
27
+ (3) You can of course mix both versions.
28
+
data/Rakefile ADDED
@@ -0,0 +1,14 @@
1
+ # encoding: utf-8
2
+
3
+ require 'bundler/gem_tasks'
4
+ require 'rake'
5
+ require 'rake/testtask'
6
+
7
+ task :default => [:test]
8
+
9
+ Rake::TestTask.new(:test) do |t|
10
+ t.libs << 'lib'
11
+ t.libs << 'test'
12
+ t.pattern = 'test/**/*_test.rb'
13
+ t.verbose = false
14
+ end
@@ -0,0 +1,26 @@
1
+ # -*- encoding: utf-8 -*-
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'lambda_validators/version'
5
+
6
+ Gem::Specification.new do |gem|
7
+ gem.name = "lambda_validators"
8
+ gem.version = LambdaValidators::VERSION
9
+ gem.authors = ["Markus Seeger"]
10
+ gem.email = ["mail@codegourmet.de"]
11
+ gem.description = "some all-purpose validators"
12
+ gem.summary = "pass some lambda conditions and run the resulting validator on any object"
13
+ gem.homepage = "https://github.com/codegourmet/lambda_validators"
14
+ gem.license = "MIT"
15
+
16
+ gem.files = `git ls-files`.split($/)
17
+ gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
18
+ gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
19
+ gem.require_paths = ["lib"]
20
+
21
+ gem.add_development_dependency "rake", "~> 10.1"
22
+ gem.add_development_dependency "guard-minitest"
23
+ gem.add_development_dependency "minitest"
24
+ gem.add_development_dependency "minitest-reporters"
25
+ gem.add_development_dependency "simplecov"
26
+ end
@@ -0,0 +1,6 @@
1
+ module LambdaValidators
2
+ class ValidatorArgumentError < ArgumentError; end
3
+
4
+ require 'lambda_validators/version.rb'
5
+ require 'lambda_validators/data_validator'
6
+ end
@@ -0,0 +1,46 @@
1
+ module LambdaValidators
2
+
3
+ # TODO README
4
+ # TODO RDOC
5
+ #
6
+ # NOTE (todo move into doc) validator validates only once, since
7
+ # some validations might be based upon others being successful
8
+ # example:
9
+ # data["key_1"].present?
10
+ # data["key_1"]["key_2].present?
11
+ #
12
+ # if the validator doesn't abort after the first validation, the
13
+ # non-existent key "key_1" would throw a NoMethodError later
14
+ #
15
+ class DataValidator
16
+ attr_accessor :last_error
17
+
18
+ def initialize(validations = {})
19
+ @validations = []
20
+ @last_error = nil
21
+ validations.each {|message, validator| add(message, &validator)}
22
+ end
23
+
24
+ def add(message, &validator)
25
+ raise ArgumentError.new("message must be present") if message.nil? || message.empty?
26
+ raise ArgumentError.new("validation must be present") if validator.nil?
27
+ @validations << [message, validator]
28
+ end
29
+
30
+ def validate(data)
31
+ @last_error = nil
32
+
33
+ @validations.each do |validation|
34
+ message, validator = validation
35
+
36
+ if !validator.call(data)
37
+ @last_error = message
38
+ break
39
+ end
40
+ end
41
+
42
+ @last_error.nil?
43
+ end
44
+ end
45
+
46
+ end
@@ -0,0 +1,3 @@
1
+ module LambdaValidators
2
+ VERSION = "0.0.1"
3
+ end
@@ -0,0 +1,80 @@
1
+ require_relative "../test_helper"
2
+ require_relative "../../lib/lambda_validators/data_validator"
3
+
4
+ module LambdaValidators
5
+ class DataValidatorTest < MiniTest::Test
6
+
7
+ def setup
8
+ @validator = DataValidator.new
9
+ end
10
+
11
+ def test_should_always_succeed_without_validations
12
+ assert @validator.validate(nil)
13
+ assert_nil @validator.last_error
14
+ end
15
+
16
+ def test_satisfied_condition_should_result_in_successful_validation
17
+ @validator.add("data must be 3") {|data| data == 3}
18
+ assert @validator.validate(3), "should validate successfully"
19
+ end
20
+
21
+ def test_unsatisfied_condition_should_result_in_failed_validation
22
+ @validator.add("data must be 3") {|data| data == 3}
23
+ refute @validator.validate(4), "should fail validation"
24
+ end
25
+
26
+ def test_should_apply_all_validations
27
+ @validator.add("data must be != 3") {|data| data != 3}
28
+ @validator.add("data must be != 4") {|data| data != 4}
29
+
30
+ assert @validator.validate(2), "should validate successfully"
31
+ refute @validator.validate(3), "should fail validation"
32
+ refute @validator.validate(4), "should fail validation"
33
+ end
34
+
35
+ def test_adding_validations_via_constructor_works_correctly
36
+ validator = DataValidator.new([
37
+ ["data must be != 2", ->(data) { data != 2 }],
38
+ ["data must be != 3", ->(data) { data != 3 }]
39
+ ])
40
+ validator.add("data must be != 4") {|data| data != 4}
41
+
42
+ refute validator.validate(2), "should fail validation"
43
+ refute validator.validate(3), "should fail validation"
44
+ refute validator.validate(4), "should fail validation"
45
+ assert validator.validate(5), "should validate successfully"
46
+ end
47
+
48
+ def test_should_raise_when_adding_invalid_validation
49
+ assert_raises ArgumentError do
50
+ @validator.add("") {|data| data != 3}
51
+ end
52
+
53
+ assert_raises ArgumentError do
54
+ @validator.add(nil) {|data| data != 3}
55
+ end
56
+
57
+ assert_raises ArgumentError do
58
+ @validator.add("nil validation", nil)
59
+ end
60
+ end
61
+
62
+ def test_last_error_returns_correct_validation_message
63
+ @validator.add("data must be != 3") {|data| data != 3}
64
+ @validator.add("data must be != 4") {|data| data != 4}
65
+
66
+ @validator.validate(3)
67
+ assert_equal "data must be != 3", @validator.last_error
68
+
69
+ @validator.validate(4)
70
+ assert_equal "data must be != 4", @validator.last_error
71
+ end
72
+
73
+ def test_last_error_is_nil_when_validation_successful
74
+ @validator.add("data must be != 3") {|data| data != 3}
75
+ @validator.validate(4)
76
+ assert_nil @validator.last_error
77
+ end
78
+
79
+ end
80
+ end
@@ -0,0 +1,12 @@
1
+ require 'simplecov' # has to be at top, will execute ../.simplecov
2
+
3
+ require 'lambda_validators'
4
+
5
+ require 'minitest/autorun'
6
+ require 'minitest/reporters'
7
+
8
+ if ENV["RM_INFO"] || ENV["TEAMCITY_VERSION"]
9
+ MiniTest::Reporters.use! MiniTest::Reporters::RubyMineReporter.new
10
+ else
11
+ MiniTest::Reporters.use! MiniTest::Reporters::SpecReporter.new
12
+ end
metadata ADDED
@@ -0,0 +1,131 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: lambda_validators
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Markus Seeger
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2014-11-05 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: rake
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ~>
18
+ - !ruby/object:Gem::Version
19
+ version: '10.1'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ~>
25
+ - !ruby/object:Gem::Version
26
+ version: '10.1'
27
+ - !ruby/object:Gem::Dependency
28
+ name: guard-minitest
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'
41
+ - !ruby/object:Gem::Dependency
42
+ name: minitest
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - '>='
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - '>='
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: minitest-reporters
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - '>='
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - '>='
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: simplecov
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - '>='
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - '>='
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ description: some all-purpose validators
84
+ email:
85
+ - mail@codegourmet.de
86
+ executables: []
87
+ extensions: []
88
+ extra_rdoc_files: []
89
+ files:
90
+ - .gitignore
91
+ - .ruby-version
92
+ - .simplecov
93
+ - Gemfile
94
+ - Guardfile
95
+ - LICENSE
96
+ - README.md
97
+ - Rakefile
98
+ - lambda_validators.gemspec
99
+ - lib/lambda_validators.rb
100
+ - lib/lambda_validators/data_validator.rb
101
+ - lib/lambda_validators/version.rb
102
+ - test/lambda_validators/data_validator_test.rb
103
+ - test/test_helper.rb
104
+ homepage: https://github.com/codegourmet/lambda_validators
105
+ licenses:
106
+ - MIT
107
+ metadata: {}
108
+ post_install_message:
109
+ rdoc_options: []
110
+ require_paths:
111
+ - lib
112
+ required_ruby_version: !ruby/object:Gem::Requirement
113
+ requirements:
114
+ - - '>='
115
+ - !ruby/object:Gem::Version
116
+ version: '0'
117
+ required_rubygems_version: !ruby/object:Gem::Requirement
118
+ requirements:
119
+ - - '>='
120
+ - !ruby/object:Gem::Version
121
+ version: '0'
122
+ requirements: []
123
+ rubyforge_project:
124
+ rubygems_version: 2.0.14
125
+ signing_key:
126
+ specification_version: 4
127
+ summary: pass some lambda conditions and run the resulting validator on any object
128
+ test_files:
129
+ - test/lambda_validators/data_validator_test.rb
130
+ - test/test_helper.rb
131
+ has_rdoc: