thrift-validator 0.1.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 ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: d1e1282790eab6d2034f8f05da9d4512102c59be
4
+ data.tar.gz: 50535756f602fcf6c60b4f2ef47222fc28e75e6d
5
+ SHA512:
6
+ metadata.gz: f59768669a591b41eeb0c1802252ba2256f53800c18242cf21196496c9dc13b08535a52098ed7b9302a2499f97971dddd93e9a2146bf5380e6aa78c73a28c124
7
+ data.tar.gz: 96421ce8b108eb57fee36cfa5e1e18b0dd318c2081573110c796320438b0c3612054fd7a38d2066caa4236cb1c7deb66e9588731d5fedc45507c7724d68a91dc
data/.gitignore ADDED
@@ -0,0 +1,14 @@
1
+ /.bundle/
2
+ /.yardoc
3
+ /Gemfile.lock
4
+ /_yardoc/
5
+ /coverage/
6
+ /doc/
7
+ /pkg/
8
+ /spec/reports/
9
+ /tmp/
10
+ *.bundle
11
+ *.so
12
+ *.o
13
+ *.a
14
+ mkmf.log
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in thrift-validator.gemspec
4
+ gemspec
data/LICENSE.txt ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2015 ahawkins
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/Makefile ADDED
@@ -0,0 +1,9 @@
1
+ THRIFT:=vendor/gen-rb/test_types.rb
2
+
3
+ $(THRIFT): test.thrift
4
+ mkdir -p $(@D)
5
+ thrift -o vendor --gen rb test.thrift
6
+
7
+ .PHONY: test
8
+ test: $(THRIFT)
9
+ bundle exec rake test
data/README.md ADDED
@@ -0,0 +1,84 @@
1
+ # Thrift::Validator
2
+
3
+ Recursive [thrift][] struct validator. The thrift library out of the
4
+ box does not validated nested structs, this library fixes that
5
+ problem. It does not monkey-patch the Thrift code. Instead this
6
+ library includes a class to recursively validate objects.
7
+
8
+ Here's an example from this libraries test. Take a look at this
9
+ protocol:
10
+
11
+ ```thrift
12
+ struct SimpleStruct {
13
+ 1: required string required_string
14
+ 2: optional string optional_string
15
+ }
16
+
17
+ struct NestedExample {
18
+ 1: required SimpleStruct required_struct
19
+ 2: optional SimpleStruct optional_struct
20
+ }
21
+ ```
22
+
23
+ Then ran some ruby:
24
+
25
+ ```ruby
26
+ struct = SimpleStruct.new
27
+ nested = NestedStruct.new required_struct: struct
28
+
29
+ # Method defined by the thrift library
30
+ struct.validate # => Thrift::ProtocolException
31
+
32
+ # Thrift only validate fields set as required on this instance.
33
+ # so since required_struct is non-nil validation succeeds.
34
+ # Also note that thrift does not validate the semantics of
35
+ # the assigned objects, so also assigning and invalid struct will
36
+ # pass its validation method.
37
+ nested.validate # => true
38
+
39
+ # With the validator
40
+ validator = Thrift::Validator.new
41
+ validator.validate nested # => Thrift::ProtocolException
42
+ ```
43
+
44
+ ## Semantics
45
+
46
+ * Original thrift validation smenatics enforces
47
+ * `optional` or `required` `struct` types pass validation
48
+ * `optional` or `required` `list<struct>` items pass validation
49
+ * `optional` or `required` `set<struct>` items pass validation
50
+ * `optional` or `required` `map` type using a `struct` for key or
51
+ value pass validation
52
+
53
+
54
+ ## Installation
55
+
56
+ Add this line to your application's Gemfile:
57
+
58
+ ```ruby
59
+ gem 'thrift-validator'
60
+ ```
61
+
62
+ And then execute:
63
+
64
+ $ bundle
65
+
66
+ Or install it yourself as:
67
+
68
+ $ gem install thrift-validator
69
+
70
+ ## Testing
71
+
72
+ First install `thrift` compilier on your platform.
73
+
74
+ $ make test
75
+
76
+ ## Contributing
77
+
78
+ 1. Fork it ( https://github.com/saltside/thrift-validator/fork )
79
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
80
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
81
+ 4. Push to the branch (`git push origin my-new-feature`)
82
+ 5. Create a new Pull Request
83
+
84
+ [thrift]: https://thrift.apache.org
data/Rakefile ADDED
@@ -0,0 +1,8 @@
1
+ require "bundler/gem_tasks"
2
+ require "rake/testtask"
3
+
4
+ Rake::TestTask.new do |t|
5
+ t.test_files = Rake::FileList['test/**/*_test.rb']
6
+ end
7
+
8
+ task default: :test
@@ -0,0 +1,5 @@
1
+ module Thrift
2
+ class Validator
3
+ VERSION = "0.1.0"
4
+ end
5
+ end
@@ -0,0 +1,36 @@
1
+ require 'thrift/validator/version'
2
+ require 'thrift'
3
+
4
+ module Thrift
5
+ class Validator
6
+ def validate(source)
7
+ source.validate
8
+
9
+ source.struct_fields.each_pair do |_, field|
10
+ type, name = field.fetch(:type), field.fetch(:name)
11
+ case type
12
+ when Types::STRUCT
13
+ validate source.send(name)
14
+ when Types::LIST, Types::SET
15
+ Array(source.send(name)).each do |item|
16
+ validate item
17
+ end
18
+ when Types::MAP
19
+ key_field = field.fetch(:key)
20
+ if key_field[:class] && key_field[:class] < ::Thrift::Struct
21
+ Hash(source.send(name)).each_key do |key_value|
22
+ validate key_value
23
+ end
24
+ end
25
+
26
+ value_field = field.fetch(:value)
27
+ if value_field[:class] && value_field[:class] < ::Thrift::Struct
28
+ Hash(source.send(name)).each_value do |value_value|
29
+ validate value_value
30
+ end
31
+ end
32
+ end
33
+ end
34
+ end
35
+ end
36
+ end
@@ -0,0 +1 @@
1
+ require 'thrift/validator'
@@ -0,0 +1,122 @@
1
+ require_relative 'test_helper'
2
+
3
+ class AcceptanceTest < MiniTest::Unit::TestCase
4
+ def test_follows_thrift_semantics
5
+ struct = SimpleStruct.new required_string: nil, optional_string: nil
6
+ refute_valid struct
7
+ end
8
+
9
+ def test_fails_if_a_required_nested_struct_is_invalid
10
+ struct = NestedExample.new
11
+ struct.required_struct = SimpleStruct.new
12
+ refute_valid struct
13
+ end
14
+
15
+ def test_fails_if_an_optional_nested_struct_is_valid
16
+ struct = NestedExample.new
17
+ struct.required_struct = SimpleStruct.new required_string: 'foo'
18
+ struct.optional_struct = SimpleStruct.new
19
+ refute_valid struct
20
+ end
21
+
22
+ def test_passes_if_nested_structs_are_valid
23
+ struct = NestedExample.new
24
+ struct.required_struct = SimpleStruct.new required_string: 'foo'
25
+ struct.optional_struct = SimpleStruct.new required_string: 'bar'
26
+ assert_valid struct
27
+ end
28
+
29
+ def test_fails_if_a_nested_list_item_is_invalid
30
+ struct = ListExample.new
31
+ struct.required_list = [ SimpleStruct.new ]
32
+ refute_valid struct
33
+ end
34
+
35
+ def test_fails_if_a_nested_list_item_is_invalid
36
+ struct = ListExample.new
37
+ struct.required_list = [ SimpleStruct.new({ required_string: 'foo' }) ]
38
+ struct.optional_list = [ SimpleStruct.new ]
39
+ refute_valid struct
40
+ end
41
+
42
+ def test_passes_if_given_valid_list_items
43
+ struct = ListExample.new
44
+ struct.required_list = [ SimpleStruct.new({ required_string: 'foo' }) ]
45
+ struct.optional_list = [ SimpleStruct.new({ required_string: 'bar' }) ]
46
+ assert_valid struct
47
+ end
48
+
49
+ def test_fails_if_a_nested_set_item_is_invalid
50
+ struct = SetExample.new
51
+ struct.required_set = Set.new([ SimpleStruct.new ])
52
+ refute_valid struct
53
+ end
54
+
55
+ def test_fails_if_a_nested_set_item_is_invalid
56
+ struct = SetExample.new
57
+ struct.required_set = Set.new([ SimpleStruct.new({ required_string: 'foo' }) ])
58
+ struct.optional_set = Set.new([ SimpleStruct.new ])
59
+ refute_valid struct
60
+ end
61
+
62
+ def test_passes_if_given_valid_set_items
63
+ struct = SetExample.new
64
+ struct.required_set = Set.new([ SimpleStruct.new({ required_string: 'foo' }) ])
65
+ struct.optional_set = Set.new([ SimpleStruct.new({ required_string: 'bar' }) ])
66
+ assert_valid struct
67
+ end
68
+
69
+ def test_fails_if_nested_map_key_is_invalid
70
+ struct = MapKeyExample.new
71
+ struct.required_map = { SimpleStruct.new => 'foo' }
72
+ refute_valid struct
73
+ end
74
+
75
+ def test_fails_if_nested_map_key_is_invalid
76
+ struct = MapKeyExample.new
77
+ struct.required_map = { SimpleStruct.new({ required_string: 'foo' }) => 'foo' }
78
+ struct.optional_map = { SimpleStruct.new => 'foo' }
79
+ refute_valid struct
80
+ end
81
+
82
+ def test_passess_when_valid_map_keys_are_given
83
+ struct = MapKeyExample.new
84
+ struct.required_map = { SimpleStruct.new({ required_string: 'foo' }) => 'foo' }
85
+ struct.optional_map = { SimpleStruct.new({ required_string: 'bar' }) => 'bar' }
86
+ assert_valid struct
87
+ end
88
+
89
+ def test_fails_if_nested_map_value_is_invalid
90
+ struct = MapValueExample.new
91
+ struct.required_map = { 'foo' => SimpleStruct.new }
92
+ refute_valid struct
93
+ end
94
+
95
+ def test_fails_if_optional_nested_map_value_is_invalid
96
+ struct = MapValueExample.new
97
+ struct.required_map = { 'foo' => SimpleStruct.new({ required_string: 'foo' }) }
98
+ struct.required_map = { 'foo' => SimpleStruct.new }
99
+ refute_valid struct
100
+ end
101
+
102
+ def test_passes_if_optional_and_required_valid_map_values_are_given
103
+ struct = MapValueExample.new
104
+ struct.required_map = { 'foo' => SimpleStruct.new({ required_string: 'foo' }) }
105
+ struct.optional_map = { 'foo' => SimpleStruct.new({ required_string: 'bar' }) }
106
+ assert_valid struct
107
+ end
108
+
109
+ private
110
+
111
+ def refute_valid(struct)
112
+ assert_raises Thrift::ProtocolException, 'Incorrect validation' do
113
+ Thrift::Validator.new.validate(struct)
114
+ end
115
+ end
116
+
117
+ def assert_valid(struct)
118
+ Thrift::Validator.new.validate(struct)
119
+ rescue Thrift::ProtocolException => ex
120
+ flunk ex
121
+ end
122
+ end
@@ -0,0 +1,12 @@
1
+ require 'bundler/setup'
2
+
3
+ root = File.expand_path '../..', __FILE__
4
+
5
+ $LOAD_PATH << "#{root}/vendor/gen-rb"
6
+
7
+ require 'thrift-validator'
8
+
9
+ Thrift.type_checking = true
10
+
11
+ require 'test_types'
12
+ require 'minitest/autorun'
data/test.thrift ADDED
@@ -0,0 +1,29 @@
1
+ struct SimpleStruct {
2
+ 1: required string required_string
3
+ 2: optional string optional_string
4
+ }
5
+
6
+ struct NestedExample {
7
+ 1: required SimpleStruct required_struct
8
+ 2: optional SimpleStruct optional_struct
9
+ }
10
+
11
+ struct ListExample {
12
+ 1: required list<SimpleStruct> required_list
13
+ 2: optional list<SimpleStruct> optional_list
14
+ }
15
+
16
+ struct SetExample {
17
+ 1: required set<SimpleStruct> required_set
18
+ 2: optional set<SimpleStruct> optional_set
19
+ }
20
+
21
+ struct MapKeyExample {
22
+ 1: required map<SimpleStruct, string> required_map
23
+ 2: optional map<SimpleStruct, string> optional_map
24
+ }
25
+
26
+ struct MapValueExample {
27
+ 1: required map<string, SimpleStruct> required_map
28
+ 2: optional map<string, SimpleStruct> optional_map
29
+ }
@@ -0,0 +1,25 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'thrift/validator/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "thrift-validator"
8
+ spec.version = Thrift::Validator::VERSION
9
+ spec.authors = ["ahawkins"]
10
+ spec.email = ["adam@hawkins.io"]
11
+ spec.summary = %q{Recursive thrift struct validator}
12
+ spec.description = %q{}
13
+ spec.homepage = "https://github.com/saltside/thrift-validator-ruby"
14
+ spec.license = "MIT"
15
+
16
+ spec.files = `git ls-files -z`.split("\x0")
17
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
18
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
+ spec.require_paths = ["lib"]
20
+
21
+ spec.add_dependency "thrift"
22
+
23
+ spec.add_development_dependency "bundler", "~> 1.7"
24
+ spec.add_development_dependency "rake", "~> 10.0"
25
+ end
@@ -0,0 +1,9 @@
1
+ #
2
+ # Autogenerated by Thrift Compiler (0.9.2)
3
+ #
4
+ # DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING
5
+ #
6
+
7
+ require 'thrift'
8
+ require 'test_types'
9
+
@@ -0,0 +1,122 @@
1
+ #
2
+ # Autogenerated by Thrift Compiler (0.9.2)
3
+ #
4
+ # DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING
5
+ #
6
+
7
+ require 'thrift'
8
+
9
+ class SimpleStruct
10
+ include ::Thrift::Struct, ::Thrift::Struct_Union
11
+ REQUIRED_STRING = 1
12
+ OPTIONAL_STRING = 2
13
+
14
+ FIELDS = {
15
+ REQUIRED_STRING => {:type => ::Thrift::Types::STRING, :name => 'required_string'},
16
+ OPTIONAL_STRING => {:type => ::Thrift::Types::STRING, :name => 'optional_string', :optional => true}
17
+ }
18
+
19
+ def struct_fields; FIELDS; end
20
+
21
+ def validate
22
+ raise ::Thrift::ProtocolException.new(::Thrift::ProtocolException::UNKNOWN, 'Required field required_string is unset!') unless @required_string
23
+ end
24
+
25
+ ::Thrift::Struct.generate_accessors self
26
+ end
27
+
28
+ class NestedExample
29
+ include ::Thrift::Struct, ::Thrift::Struct_Union
30
+ REQUIRED_STRUCT = 1
31
+ OPTIONAL_STRUCT = 2
32
+
33
+ FIELDS = {
34
+ REQUIRED_STRUCT => {:type => ::Thrift::Types::STRUCT, :name => 'required_struct', :class => ::SimpleStruct},
35
+ OPTIONAL_STRUCT => {:type => ::Thrift::Types::STRUCT, :name => 'optional_struct', :class => ::SimpleStruct, :optional => true}
36
+ }
37
+
38
+ def struct_fields; FIELDS; end
39
+
40
+ def validate
41
+ raise ::Thrift::ProtocolException.new(::Thrift::ProtocolException::UNKNOWN, 'Required field required_struct is unset!') unless @required_struct
42
+ end
43
+
44
+ ::Thrift::Struct.generate_accessors self
45
+ end
46
+
47
+ class ListExample
48
+ include ::Thrift::Struct, ::Thrift::Struct_Union
49
+ REQUIRED_LIST = 1
50
+ OPTIONAL_LIST = 2
51
+
52
+ FIELDS = {
53
+ REQUIRED_LIST => {:type => ::Thrift::Types::LIST, :name => 'required_list', :element => {:type => ::Thrift::Types::STRUCT, :class => ::SimpleStruct}},
54
+ OPTIONAL_LIST => {:type => ::Thrift::Types::LIST, :name => 'optional_list', :element => {:type => ::Thrift::Types::STRUCT, :class => ::SimpleStruct}, :optional => true}
55
+ }
56
+
57
+ def struct_fields; FIELDS; end
58
+
59
+ def validate
60
+ raise ::Thrift::ProtocolException.new(::Thrift::ProtocolException::UNKNOWN, 'Required field required_list is unset!') unless @required_list
61
+ end
62
+
63
+ ::Thrift::Struct.generate_accessors self
64
+ end
65
+
66
+ class SetExample
67
+ include ::Thrift::Struct, ::Thrift::Struct_Union
68
+ REQUIRED_SET = 1
69
+ OPTIONAL_SET = 2
70
+
71
+ FIELDS = {
72
+ REQUIRED_SET => {:type => ::Thrift::Types::SET, :name => 'required_set', :element => {:type => ::Thrift::Types::STRUCT, :class => ::SimpleStruct}},
73
+ OPTIONAL_SET => {:type => ::Thrift::Types::SET, :name => 'optional_set', :element => {:type => ::Thrift::Types::STRUCT, :class => ::SimpleStruct}, :optional => true}
74
+ }
75
+
76
+ def struct_fields; FIELDS; end
77
+
78
+ def validate
79
+ raise ::Thrift::ProtocolException.new(::Thrift::ProtocolException::UNKNOWN, 'Required field required_set is unset!') unless @required_set
80
+ end
81
+
82
+ ::Thrift::Struct.generate_accessors self
83
+ end
84
+
85
+ class MapKeyExample
86
+ include ::Thrift::Struct, ::Thrift::Struct_Union
87
+ REQUIRED_MAP = 1
88
+ OPTIONAL_MAP = 2
89
+
90
+ FIELDS = {
91
+ REQUIRED_MAP => {:type => ::Thrift::Types::MAP, :name => 'required_map', :key => {:type => ::Thrift::Types::STRUCT, :class => ::SimpleStruct}, :value => {:type => ::Thrift::Types::STRING}},
92
+ OPTIONAL_MAP => {:type => ::Thrift::Types::MAP, :name => 'optional_map', :key => {:type => ::Thrift::Types::STRUCT, :class => ::SimpleStruct}, :value => {:type => ::Thrift::Types::STRING}, :optional => true}
93
+ }
94
+
95
+ def struct_fields; FIELDS; end
96
+
97
+ def validate
98
+ raise ::Thrift::ProtocolException.new(::Thrift::ProtocolException::UNKNOWN, 'Required field required_map is unset!') unless @required_map
99
+ end
100
+
101
+ ::Thrift::Struct.generate_accessors self
102
+ end
103
+
104
+ class MapValueExample
105
+ include ::Thrift::Struct, ::Thrift::Struct_Union
106
+ REQUIRED_MAP = 1
107
+ OPTIONAL_MAP = 2
108
+
109
+ FIELDS = {
110
+ REQUIRED_MAP => {:type => ::Thrift::Types::MAP, :name => 'required_map', :key => {:type => ::Thrift::Types::STRING}, :value => {:type => ::Thrift::Types::STRUCT, :class => ::SimpleStruct}},
111
+ OPTIONAL_MAP => {:type => ::Thrift::Types::MAP, :name => 'optional_map', :key => {:type => ::Thrift::Types::STRING}, :value => {:type => ::Thrift::Types::STRUCT, :class => ::SimpleStruct}, :optional => true}
112
+ }
113
+
114
+ def struct_fields; FIELDS; end
115
+
116
+ def validate
117
+ raise ::Thrift::ProtocolException.new(::Thrift::ProtocolException::UNKNOWN, 'Required field required_map is unset!') unless @required_map
118
+ end
119
+
120
+ ::Thrift::Struct.generate_accessors self
121
+ end
122
+
metadata ADDED
@@ -0,0 +1,103 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: thrift-validator
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - ahawkins
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2015-01-14 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: thrift
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :runtime
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: '1.7'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '1.7'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rake
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '10.0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '10.0'
55
+ description: ''
56
+ email:
57
+ - adam@hawkins.io
58
+ executables: []
59
+ extensions: []
60
+ extra_rdoc_files: []
61
+ files:
62
+ - ".gitignore"
63
+ - Gemfile
64
+ - LICENSE.txt
65
+ - Makefile
66
+ - README.md
67
+ - Rakefile
68
+ - lib/thrift-validator.rb
69
+ - lib/thrift/validator.rb
70
+ - lib/thrift/validator/version.rb
71
+ - test.thrift
72
+ - test/acceptance_test.rb
73
+ - test/test_helper.rb
74
+ - thrift-validator.gemspec
75
+ - vendor/gen-rb/test_constants.rb
76
+ - vendor/gen-rb/test_types.rb
77
+ homepage: https://github.com/saltside/thrift-validator-ruby
78
+ licenses:
79
+ - MIT
80
+ metadata: {}
81
+ post_install_message:
82
+ rdoc_options: []
83
+ require_paths:
84
+ - lib
85
+ required_ruby_version: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ required_rubygems_version: !ruby/object:Gem::Requirement
91
+ requirements:
92
+ - - ">="
93
+ - !ruby/object:Gem::Version
94
+ version: '0'
95
+ requirements: []
96
+ rubyforge_project:
97
+ rubygems_version: 2.2.2
98
+ signing_key:
99
+ specification_version: 4
100
+ summary: Recursive thrift struct validator
101
+ test_files:
102
+ - test/acceptance_test.rb
103
+ - test/test_helper.rb