validate-rb 0.1.0.alpha.1 → 0.1.0.pre

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: ec9996734d51898a4f003a56c2cb45748c14d58b138ddb03d1291d9cf6a4ed28
4
- data.tar.gz: 144941aa76f0db9224309d7b3614bc41e5e5fd59b37b7419f4785dd77498abf6
3
+ metadata.gz: 3d7f65479ecf94e4e15474fd5f86ca4bd8b46a4260b0a1e77b3d666ca0e52e8d
4
+ data.tar.gz: dec398c1f408cd2bfdee3281e386c313f19d67d9cfc5ade0c3c22bf16c3b764c
5
5
  SHA512:
6
- metadata.gz: 3145f4f69e4eb2969d4eafc9c4f92faa4c3a63c2b15061bef8abea109fab30648ace5104c8e8c81314c7b63a1ee0452899d0074cb1ee8fef15ec000443a95f87
7
- data.tar.gz: 7c2f705b8a0da5e05652491060462a783554429a5ea32ecc08e25364ec675e31aac769f23a4f6ec9fbca07e5317cfa9224e99a06820c051b60a8e761890beaea
6
+ metadata.gz: 32b614ffea7a9909f64a3ced25f761347b19358771f9b6579d0eaa55e7bda35c6cf30650026faa3e4149b7205cb77f5fdcfb574516ac6ad78eac59bf076e9b15
7
+ data.tar.gz: 897066f58c0f7f7197b1821902a5039279a34ac1cb3c196448a3d4a5caf2bc1e3fc45fa8fdf0919ad5ba45a09363a087afac3715d7201189b1127f31f3d6a8f9
data/.gitignore ADDED
@@ -0,0 +1,12 @@
1
+ /.bundle/
2
+ /.yardoc
3
+ /_yardoc/
4
+ /coverage/
5
+ /doc/
6
+ /pkg/
7
+ /spec/reports/
8
+ /tmp/
9
+
10
+ # rspec failure tracking
11
+ .rspec_status
12
+ /Gemfile.lock
data/.rspec ADDED
@@ -0,0 +1,3 @@
1
+ --format documentation
2
+ --color
3
+ --require spec_helper
data/.ruby-version ADDED
@@ -0,0 +1 @@
1
+ 2.6.6
data/.travis.yml ADDED
@@ -0,0 +1,6 @@
1
+ ---
2
+ language: ruby
3
+ cache: bundler
4
+ rvm:
5
+ - 2.6.6
6
+ before_install: gem install bundler -v 2.1.4
data/Gemfile ADDED
@@ -0,0 +1,7 @@
1
+ source "https://rubygems.org"
2
+
3
+ # Specify your gem's dependencies in validaterb.gemspec
4
+ gemspec
5
+
6
+ gem "rake", "~> 12.0"
7
+ gem "rspec", "~> 3.0"
data/README.md CHANGED
@@ -1,4 +1,4 @@
1
- # Validate.rb ![CI](https://github.com/Gusto/validate-rb/workflows/CI/badge.svg)
1
+ # Validate.rb
2
2
 
3
3
  Yummy constraint validations for Ruby
4
4
 
@@ -7,7 +7,7 @@ Yummy constraint validations for Ruby
7
7
  Add this line to your application's Gemfile:
8
8
 
9
9
  ```ruby
10
- gem 'validate-rb'
10
+ gem 'validaterb'
11
11
  ```
12
12
 
13
13
  And then execute:
@@ -16,7 +16,7 @@ And then execute:
16
16
 
17
17
  Or install it yourself as:
18
18
 
19
- $ gem install validate-rb
19
+ $ gem install validaterb
20
20
 
21
21
  ## Usage
22
22
 
@@ -120,5 +120,5 @@ To install this gem onto your local machine, run `bundle exec rake install`. To
120
120
 
121
121
  ## Contributing
122
122
 
123
- Bug reports and pull requests are welcome on GitHub at https://github.com/gusto/validate-rb.
123
+ Bug reports and pull requests are welcome on GitHub at https://github.com/[USERNAME]/gusto-validation.
124
124
 
data/Rakefile ADDED
@@ -0,0 +1,6 @@
1
+ require "bundler/gem_tasks"
2
+ require "rspec/core/rake_task"
3
+
4
+ RSpec::Core::RakeTask.new(:spec)
5
+
6
+ task :default => :spec
data/bin/console ADDED
@@ -0,0 +1,7 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require "bundler/setup"
4
+ require "validaterb"
5
+
6
+ require "irb"
7
+ IRB.start(__FILE__)
data/bin/setup ADDED
@@ -0,0 +1,6 @@
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+ IFS=$'\n\t'
4
+ set -vx
5
+
6
+ bundle install
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Validate
4
- VERSION = '0.1.0.alpha.1'
4
+ VERSION = '0.1.0.pre'.freeze
5
5
  end
@@ -0,0 +1,3 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'validate'
data/lib/validate.rb CHANGED
@@ -1,80 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'forwardable'
4
- require 'monitor'
3
+ require "validaterb/version"
5
4
 
6
- require_relative 'validate/version'
7
- require_relative 'validate/errors'
8
- require_relative 'validate/constraint'
9
- require_relative 'validate/assertions'
10
- require_relative 'validate/arguments'
11
- require_relative 'validate/ast'
12
- require_relative 'validate/scope'
13
- require_relative 'validate/helpers'
14
- require_relative 'validate/constraints/validation_context'
15
- require_relative 'validate/constraints'
16
- require_relative 'validate/validators/dsl'
17
- require_relative 'validate/validators'
18
- require_relative 'validate/compare'
19
-
20
- # Validate.rb can be used independently by calling {Validate.validate}
21
- # or included in classes and modules.
22
- #
23
- # @example Validating an object using externally defined metadata
24
- # Address = Struct.new(:street, :city, :state, :zip)
25
- # Validate::Validators.define(Address) do
26
- # attr(:street) { not_blank }
27
- # attr(:city) { not_blank }
28
- # attr(:state) { not_blank & length(2) }
29
- # attr(:zip) { not_blank & match(/[0-9]{5}(\-[0-9]{4})?/) }
30
- # end
31
- # puts Validate.validate(Address.new)
32
- #
33
- # @example Validating an object using metdata defined in class
34
- # class Address < Struct.new(:street, :city, :state, :zip)
35
- # include Validate
36
- # validate do
37
- # attr(:street) { not_blank }
38
- # attr(:city) { not_blank }
39
- # attr(:state) { not_blank & length(2) }
40
- # attr(:zip) { not_blank & match(/[0-9]{5}(\-[0-9]{4})?/) }
41
- # end
42
- # end
43
- # puts Validate.validate(Address.new)
44
5
  module Validate
45
- # Validate an object and get constraint violations list back
46
- #
47
- # @param object [Object] object to validate
48
- # @param as [Symbol, Class] (object.class) validator to use, defaults to
49
- # object's class
50
- #
51
- # @return [Array<Constraint::Violation>] list of constraint violations
52
- def self.validate(object, as: object.class)
53
- violations = []
54
- Scope.current
55
- .validator(as)
56
- .validate(Constraints::ValidationContext.root(object, violations))
57
- violations.freeze
58
- end
59
-
60
- # Check if a given validator exists
61
- #
62
- # @param name [Symbol, Class] validator to check
63
- #
64
- # @return [Boolean] `true` if validator is present, `else` otherwise
65
- def self.validator?(name)
66
- Scope.current.validator?(name)
67
- end
68
-
69
- # Hook to allow for inclusion in class or module
70
- def self.included(base)
71
- base.extend(ClassMethods)
72
- end
73
-
74
- # @private
75
- module ClassMethods
76
- def validator(&body)
77
- @validator ||= Validators.create(&body)
78
- end
79
- end
80
6
  end
@@ -0,0 +1,30 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'lib/validate/version'
4
+
5
+ Gem::Specification.new do |spec|
6
+ spec.name = 'validate-rb'
7
+ spec.version = Validate::VERSION
8
+ spec.authors = ['Bulat Shakirzyanov']
9
+ spec.email = ['bulat.shakirzyanov@gusto.com']
10
+
11
+ spec.summary = 'Yummy constraint validations for Ruby'
12
+ spec.description = 'Simple, powerful, and constraint-based validation'
13
+ spec.homepage = 'https://github.com/Gusto/validaterb'
14
+ spec.license = 'MIT'
15
+ spec.required_ruby_version = Gem::Requirement.new('>= 2.3.0')
16
+
17
+ spec.metadata = {
18
+ 'homepage_uri' => 'https://github.com/Gusto/validaterb',
19
+ 'changelog_uri' => 'https://github.com/Gusto/validaterb/releases',
20
+ 'source_code_uri' => 'https://github.com/Gusto/validaterb',
21
+ 'bug_tracker_uri' => 'https://github.com/Gusto/validaterb/issues',
22
+ }
23
+
24
+ spec.files = Dir.chdir(File.expand_path('..', __FILE__)) do
25
+ `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
26
+ end
27
+ spec.bindir = 'exe'
28
+ spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
29
+ spec.require_paths = ['lib']
30
+ end
metadata CHANGED
@@ -1,113 +1,15 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: validate-rb
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0.alpha.1
4
+ version: 0.1.0.pre
5
5
  platform: ruby
6
6
  authors:
7
7
  - Bulat Shakirzyanov
8
- autorequire:
8
+ autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2020-07-20 00:00:00.000000000 Z
12
- dependencies:
13
- - !ruby/object:Gem::Dependency
14
- name: aruba
15
- requirement: !ruby/object:Gem::Requirement
16
- requirements:
17
- - - ">="
18
- - !ruby/object:Gem::Version
19
- version: '0'
20
- type: :development
21
- prerelease: false
22
- version_requirements: !ruby/object:Gem::Requirement
23
- requirements:
24
- - - ">="
25
- - !ruby/object:Gem::Version
26
- version: '0'
27
- - !ruby/object:Gem::Dependency
28
- name: bundler
29
- requirement: !ruby/object:Gem::Requirement
30
- requirements:
31
- - - "~>"
32
- - !ruby/object:Gem::Version
33
- version: '2.1'
34
- type: :development
35
- prerelease: false
36
- version_requirements: !ruby/object:Gem::Requirement
37
- requirements:
38
- - - "~>"
39
- - !ruby/object:Gem::Version
40
- version: '2.1'
41
- - !ruby/object:Gem::Dependency
42
- name: cucumber
43
- requirement: !ruby/object:Gem::Requirement
44
- requirements:
45
- - - "~>"
46
- - !ruby/object:Gem::Version
47
- version: '4.0'
48
- type: :development
49
- prerelease: false
50
- version_requirements: !ruby/object:Gem::Requirement
51
- requirements:
52
- - - "~>"
53
- - !ruby/object:Gem::Version
54
- version: '4.0'
55
- - !ruby/object:Gem::Dependency
56
- name: rake
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: rspec
71
- requirement: !ruby/object:Gem::Requirement
72
- requirements:
73
- - - "~>"
74
- - !ruby/object:Gem::Version
75
- version: '3.0'
76
- type: :development
77
- prerelease: false
78
- version_requirements: !ruby/object:Gem::Requirement
79
- requirements:
80
- - - "~>"
81
- - !ruby/object:Gem::Version
82
- version: '3.0'
83
- - !ruby/object:Gem::Dependency
84
- name: sorbet
85
- requirement: !ruby/object:Gem::Requirement
86
- requirements:
87
- - - ">="
88
- - !ruby/object:Gem::Version
89
- version: '0'
90
- type: :development
91
- prerelease: false
92
- version_requirements: !ruby/object:Gem::Requirement
93
- requirements:
94
- - - ">="
95
- - !ruby/object:Gem::Version
96
- version: '0'
97
- - !ruby/object:Gem::Dependency
98
- name: yard
99
- requirement: !ruby/object:Gem::Requirement
100
- requirements:
101
- - - ">="
102
- - !ruby/object:Gem::Version
103
- version: '0'
104
- type: :development
105
- prerelease: false
106
- version_requirements: !ruby/object:Gem::Requirement
107
- requirements:
108
- - - ">="
109
- - !ruby/object:Gem::Version
110
- version: '0'
11
+ date: 2020-07-13 00:00:00.000000000 Z
12
+ dependencies: []
111
13
  description: Simple, powerful, and constraint-based validation
112
14
  email:
113
15
  - bulat.shakirzyanov@gusto.com
@@ -115,31 +17,28 @@ executables: []
115
17
  extensions: []
116
18
  extra_rdoc_files: []
117
19
  files:
118
- - LICENSE
20
+ - ".gitignore"
21
+ - ".rspec"
22
+ - ".ruby-version"
23
+ - ".travis.yml"
24
+ - Gemfile
119
25
  - README.md
26
+ - Rakefile
27
+ - bin/console
28
+ - bin/setup
29
+ - lib/validate-rb.rb
120
30
  - lib/validate.rb
121
- - lib/validate/arguments.rb
122
- - lib/validate/assertions.rb
123
- - lib/validate/ast.rb
124
- - lib/validate/compare.rb
125
- - lib/validate/constraint.rb
126
- - lib/validate/constraints.rb
127
- - lib/validate/constraints/validation_context.rb
128
- - lib/validate/errors.rb
129
- - lib/validate/helpers.rb
130
- - lib/validate/scope.rb
131
- - lib/validate/validators.rb
132
- - lib/validate/validators/dsl.rb
133
31
  - lib/validate/version.rb
134
- homepage: https://github.com/Gusto/validate-rb
32
+ - validate-rb.gemspec
33
+ homepage: https://github.com/Gusto/validaterb
135
34
  licenses:
136
35
  - MIT
137
36
  metadata:
138
- homepage_uri: https://github.com/Gusto/validate-rb
139
- changelog_uri: https://github.com/Gusto/validate-rb/releases
140
- source_code_uri: https://github.com/Gusto/validate-rb
141
- bug_tracker_uri: https://github.com/Gusto/validate-rb/issues
142
- post_install_message:
37
+ homepage_uri: https://github.com/Gusto/validaterb
38
+ changelog_uri: https://github.com/Gusto/validaterb/releases
39
+ source_code_uri: https://github.com/Gusto/validaterb
40
+ bug_tracker_uri: https://github.com/Gusto/validaterb/issues
41
+ post_install_message:
143
42
  rdoc_options: []
144
43
  require_paths:
145
44
  - lib
@@ -155,7 +54,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
155
54
  version: 1.3.1
156
55
  requirements: []
157
56
  rubygems_version: 3.0.3
158
- signing_key:
57
+ signing_key:
159
58
  specification_version: 4
160
59
  summary: Yummy constraint validations for Ruby
161
60
  test_files: []
data/LICENSE DELETED
@@ -1,21 +0,0 @@
1
- MIT License
2
-
3
- Copyright (c) 2020 Gusto
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.
@@ -1,93 +0,0 @@
1
- module Validate
2
- module Arguments
3
- module ClassMethods
4
- def method_added(method_name)
5
- super
6
- return if @args.empty?
7
-
8
- method = instance_method(method_name)
9
- guard = ArgumentsGuard.new(method, @args.dup)
10
-
11
- @methods_guard.__send__(:define_method, method_name) do |*args, &block|
12
- guard.send(method_name, *args, &block)
13
- super(*args, &block)
14
- end
15
- ensure
16
- @args.clear
17
- end
18
-
19
- def singleton_method_added(method_name)
20
- super
21
- return if @args.empty?
22
-
23
- method = singleton_method(method_name)
24
- guard = ArgumentsGuard.new(method, @args.dup)
25
-
26
- @methods_guard.__send__(:define_singleton_method, method_name) do |*args, &block|
27
- guard.send(method_name, *args, &block)
28
- super(*args, &block)
29
- end
30
- ensure
31
- @args.clear
32
- end
33
-
34
- def arg(name, &body)
35
- if @args.include?(name)
36
- raise Error::ArgumentError, "duplicate argument :#{name}"
37
- end
38
-
39
- @args[name] = Assertions.create(&body)
40
- self
41
- end
42
- end
43
-
44
- def self.included(base)
45
- base.extend(ClassMethods)
46
- base.instance_exec do
47
- @args = {}
48
- prepend(@methods_guard = Module.new)
49
- end
50
- end
51
-
52
- class ArgumentsGuard
53
- DEFAULT_VALUE = BasicObject.new
54
-
55
- def initialize(method, rules)
56
- signature = []
57
- assertions = []
58
-
59
- method.parameters.each do |(kind, name)|
60
- case kind
61
- when :req
62
- signature << name.to_s
63
- when :opt
64
- signature << "#{name} = DEFAULT_VALUE"
65
- when :rest
66
- signature << "*#{name}"
67
- when :keyreq
68
- signature << "#{name}:"
69
- when :key
70
- signature << "#{name}: DEFAULT_VALUE"
71
- when :keyrest
72
- signature << "**#{name}"
73
- when :block
74
- signature << "&#{name}"
75
- else
76
- raise Error::ArgumentError, "unsupported parameter type #{kind}"
77
- end
78
- next unless rules.include?(name)
79
-
80
- assertions << "@rules[:#{name}].assert(#{name}, message: 'invalid argument #{name}')"
81
- end
82
-
83
- singleton_class.class_eval(<<~RUBY, __FILE__, __LINE__ + 1)
84
- def #{method.name}(#{signature.join(', ')})
85
- #{assertions.join("\n ")}
86
- end
87
- RUBY
88
-
89
- @rules = rules
90
- end
91
- end
92
- end
93
- end
@@ -1,27 +0,0 @@
1
- # typed: strict
2
- # frozen_string_literal: true
3
-
4
- module Validate
5
- module Assertions
6
- module_function
7
-
8
- def create(*args, &block)
9
- Assertion.new(AST::DefinitionContext.create(*args, &block))
10
- end
11
-
12
- class Assertion
13
- def initialize(validation_context)
14
- @constraints = validation_context
15
- end
16
-
17
- def assert(value, error_class: Error::ArgumentError, message: 'invalid value')
18
- ctx = Constraints::ValidationContext.root(value)
19
- @constraints.evaluate(ctx)
20
- return value unless ctx.has_violations?
21
-
22
- raise error_class, message,
23
- cause: ctx.to_err
24
- end
25
- end
26
- end
27
- end