game_validator 0.3.0 → 0.6.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 +4 -4
- data/Gemfile.lock +10 -12
- data/README.md +18 -1
- data/game_validator.gemspec +1 -1
- data/lib/game_validator.rb +8 -0
- data/lib/game_validator/validator.rb +3 -3
- data/lib/game_validator/validator/base.rb +15 -5
- data/lib/game_validator/validator/result.rb +1 -1
- data/lib/game_validator/validator/validate_to_action.rb +20 -0
- data/lib/game_validator/version.rb +1 -1
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: bd90aaf91b77cf3e07547bab0e7b2ab215d91247a61dd1b2db3cc1970a6ddc51
|
4
|
+
data.tar.gz: d4f13f99c8cc2fd30b1fb6cbc12d2a7dec41d69030cb73b7aaf6f0367da74248
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 5e1f12c87026ecbe1386fde7ff5a1c8afb8fa6340b952a08707a2fab65124a01d984fe50a61f3d2259cf21b8d12ae652fd6eba4121b5bb4a062eb8efda424b55
|
7
|
+
data.tar.gz: 7d06c2c9f5939529f97b0d084da7021233c0598e0b4218aeb8570849edf20b118f00dbed51f3e18faed079e8199fe04c6e11b05d6dc25fa81429c3cba89a5715
|
data/Gemfile.lock
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
game_validator (0.
|
4
|
+
game_validator (0.6.0)
|
5
5
|
|
6
6
|
GEM
|
7
7
|
remote: https://rubygems.org/
|
8
8
|
specs:
|
9
|
-
concurrent-ruby (1.1.
|
9
|
+
concurrent-ruby (1.1.8)
|
10
10
|
diff-lcs (1.4.4)
|
11
|
-
dry-configurable (0.12.
|
11
|
+
dry-configurable (0.12.1)
|
12
12
|
concurrent-ruby (~> 1.0)
|
13
13
|
dry-core (~> 0.5, >= 0.5.0)
|
14
14
|
dry-container (0.7.2)
|
@@ -26,19 +26,17 @@ GEM
|
|
26
26
|
concurrent-ruby (~> 1.0)
|
27
27
|
dry-core (~> 0.4, >= 0.4.4)
|
28
28
|
dry-equalizer
|
29
|
-
dry-schema (1.
|
29
|
+
dry-schema (1.6.1)
|
30
30
|
concurrent-ruby (~> 1.0)
|
31
31
|
dry-configurable (~> 0.8, >= 0.8.3)
|
32
|
-
dry-core (~> 0.
|
33
|
-
dry-equalizer (~> 0.2)
|
32
|
+
dry-core (~> 0.5, >= 0.5)
|
34
33
|
dry-initializer (~> 3.0)
|
35
34
|
dry-logic (~> 1.0)
|
36
|
-
dry-types (~> 1.
|
37
|
-
dry-types (1.
|
35
|
+
dry-types (~> 1.5)
|
36
|
+
dry-types (1.5.1)
|
38
37
|
concurrent-ruby (~> 1.0)
|
39
38
|
dry-container (~> 0.3)
|
40
|
-
dry-core (~> 0.
|
41
|
-
dry-equalizer (~> 0.3)
|
39
|
+
dry-core (~> 0.5, >= 0.5)
|
42
40
|
dry-inflector (~> 0.1, >= 0.1.2)
|
43
41
|
dry-logic (~> 1.0, >= 1.0.2)
|
44
42
|
dry-validation (1.6.0)
|
@@ -59,10 +57,10 @@ GEM
|
|
59
57
|
rspec-expectations (3.10.1)
|
60
58
|
diff-lcs (>= 1.2.0, < 2.0)
|
61
59
|
rspec-support (~> 3.10.0)
|
62
|
-
rspec-mocks (3.10.
|
60
|
+
rspec-mocks (3.10.2)
|
63
61
|
diff-lcs (>= 1.2.0, < 2.0)
|
64
62
|
rspec-support (~> 3.10.0)
|
65
|
-
rspec-support (3.10.
|
63
|
+
rspec-support (3.10.2)
|
66
64
|
|
67
65
|
PLATFORMS
|
68
66
|
ruby
|
data/README.md
CHANGED
@@ -79,9 +79,26 @@ full_validator = {
|
|
79
79
|
In this fashion, you create the full validator as follows
|
80
80
|
```
|
81
81
|
GameValidator::Validator::new(
|
82
|
-
validate_player_action_and_user: GameValidator::Validator::Base::new(legal_options: ['run', 'hide'], next_player_id: 1),
|
82
|
+
validate_player_action_and_user: GameValidator::Validator::Base::new(legal_options: ['run', 'hide'], next_player_id: 1, last_action_id: 1),
|
83
83
|
full_validator_for: full_validator)
|
84
84
|
```
|
85
|
+
Note the last_action_id option, to make sure that you are validating against the most recent action in the game.
|
86
|
+
|
87
|
+
You can also wrap successful results from the validator, using GameValidator::Validator::ValidateToAction and GameValidator::Validator::Result
|
88
|
+
```
|
89
|
+
class DoStuff
|
90
|
+
def call(change_orders:, **args)
|
91
|
+
# do stuff
|
92
|
+
change_orders
|
93
|
+
end
|
94
|
+
end
|
95
|
+
|
96
|
+
GameValidator::Validator::ValidateToAction::new(
|
97
|
+
validator: some_regular validator,
|
98
|
+
wrap: ->(successful_result){GameValidator::Validator::Result::new(
|
99
|
+
result: successful_result,
|
100
|
+
execute: DoStuff::new)})
|
101
|
+
```
|
85
102
|
|
86
103
|
## Development
|
87
104
|
|
data/game_validator.gemspec
CHANGED
@@ -2,7 +2,7 @@ lib = File.expand_path("lib", __dir__)
|
|
2
2
|
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
3
3
|
require "game_validator/version"
|
4
4
|
|
5
|
-
Gem::Specification.new 'game_validator', '0.
|
5
|
+
Gem::Specification.new 'game_validator', '0.6.0' do |spec|
|
6
6
|
spec.name = 'game_validator'
|
7
7
|
spec.version = GameValidator::VERSION
|
8
8
|
spec.authors = ['Colin Horner']
|
data/lib/game_validator.rb
CHANGED
@@ -3,6 +3,14 @@ require 'dry-types'
|
|
3
3
|
module Types
|
4
4
|
include Dry.Types()
|
5
5
|
end
|
6
|
+
callable = Types.Interface(:call)
|
7
|
+
Types::Callable = Types.Constructor(Method) do |value|
|
8
|
+
callable.call(value) # raises Dry::Types::ConstraintError if object doesn't respond to #call
|
9
|
+
value.is_a?(Method) || value.is_a?(Proc) ? value : value.method(:call)
|
10
|
+
end
|
11
|
+
Types::ArrayOfCallable = Types::Array::of(Types::Callable)
|
12
|
+
Types::ArrayOfStrictInteger = Types::Array::of(Types::Strict::Integer)
|
13
|
+
Types::ArrayOfString = Types::Array::of(Types::String)
|
6
14
|
|
7
15
|
require 'game_validator/version'
|
8
16
|
require 'game_validator/validator'
|
@@ -6,9 +6,9 @@ require 'game_validator/validator/full_validator_coercer'
|
|
6
6
|
module GameValidator
|
7
7
|
class Validator
|
8
8
|
extend Dry::Initializer
|
9
|
-
option :validate_player_action_and_user, type: Types
|
9
|
+
option :validate_player_action_and_user, type: Types::Callable
|
10
10
|
option :full_validator_for, type: Types::Hash
|
11
|
-
option :build_failure, type: Types
|
11
|
+
option :build_failure, type: Types::Callable,
|
12
12
|
default: ->{GameValidator::Validator::Result::Failure::Builder::new}
|
13
13
|
|
14
14
|
def call(action_hash:, user:)
|
@@ -17,7 +17,7 @@ module GameValidator
|
|
17
17
|
result = validate_player_action_and_user.(a)
|
18
18
|
return build_failure.(errors: result.errors) if result.failure?
|
19
19
|
validate = full_validator_for[[a[:player_action], a[:user].admin?]]
|
20
|
-
result = validate.(
|
20
|
+
result = validate.(action_hash)
|
21
21
|
return build_failure.(errors: result.errors) if result.failure?
|
22
22
|
result
|
23
23
|
end
|
@@ -1,20 +1,20 @@
|
|
1
1
|
# frozen string_literal: true
|
2
2
|
|
3
3
|
require 'dry-validation'
|
4
|
-
require 'dry-initializer'
|
5
4
|
|
6
5
|
Dry::Validation.load_extensions(:monads)
|
7
6
|
|
8
7
|
module GameValidator
|
9
8
|
class Validator
|
10
9
|
class Base < Dry::Validation::Contract
|
11
|
-
|
12
|
-
option :
|
13
|
-
option :
|
10
|
+
option :legal_options, type: Types::ArrayOfString
|
11
|
+
option :current_player_id, type: Types::Coercible::Integer
|
12
|
+
option :last_action_id, type: Types::Coercible::Integer
|
14
13
|
|
15
14
|
params do
|
16
15
|
required(:player_action).filled(:string)
|
17
16
|
required(:user).filled(Types.Interface(:id, :admin?))
|
17
|
+
required(:last_action_id).filled(:integer)
|
18
18
|
end
|
19
19
|
|
20
20
|
rule(:player_action) do
|
@@ -24,10 +24,20 @@ module GameValidator
|
|
24
24
|
end
|
25
25
|
|
26
26
|
rule(:user) do
|
27
|
-
if !values[:user].id.eql?(
|
27
|
+
if !values[:user].id.eql?(current_player_id) && !values[:user].admin?
|
28
28
|
key.failure({text: 'Not logged in', status: 401})
|
29
29
|
end
|
30
30
|
end
|
31
|
+
|
32
|
+
rule(:last_action_id) do
|
33
|
+
if values[:last_action_id] < last_action_id
|
34
|
+
key.failure({text: "last_action_id '#{values[:last_action_id]}' is obsolete",status: 409})
|
35
|
+
end
|
36
|
+
|
37
|
+
if values[:last_action_id] > last_action_id
|
38
|
+
key.failure({text: "last_action_id '#{values[:last_action_id]}' not a match",status: 400})
|
39
|
+
end
|
40
|
+
end
|
31
41
|
end
|
32
42
|
end
|
33
43
|
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
# frozen string_literal: true
|
2
|
+
|
3
|
+
require 'dry-initializer'
|
4
|
+
|
5
|
+
module GameValidator
|
6
|
+
class Validator
|
7
|
+
class ValidateToAction
|
8
|
+
extend Dry::Initializer
|
9
|
+
option :validate, type: Types.Interface(:call)
|
10
|
+
option :wrap, type: Types.Interface(:call)
|
11
|
+
|
12
|
+
def call(action_hash)
|
13
|
+
result = validate.(action_hash)
|
14
|
+
result = wrap.(result) if result.success?
|
15
|
+
result
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: game_validator
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.6.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Colin Horner
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2021-01
|
11
|
+
date: 2021-04-01 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -148,6 +148,7 @@ files:
|
|
148
148
|
- lib/game_validator/validator/result/failure.rb
|
149
149
|
- lib/game_validator/validator/result/failure/builder.rb
|
150
150
|
- lib/game_validator/validator/result/failure/node.rb
|
151
|
+
- lib/game_validator/validator/validate_to_action.rb
|
151
152
|
- lib/game_validator/version.rb
|
152
153
|
homepage:
|
153
154
|
licenses:
|