request_handler 1.3.0 → 2.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (34) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +14 -0
  3. data/Gemfile +2 -0
  4. data/README.md +167 -29
  5. data/lib/request_handler/base.rb +27 -33
  6. data/lib/request_handler/base_parser.rb +9 -0
  7. data/lib/request_handler/builder/base.rb +23 -0
  8. data/lib/request_handler/builder/body_builder.rb +27 -0
  9. data/lib/request_handler/builder/fieldsets_builder.rb +28 -0
  10. data/lib/request_handler/builder/fieldsets_resource_builder.rb +17 -0
  11. data/lib/request_handler/builder/filter_builder.rb +31 -0
  12. data/lib/request_handler/builder/include_options_builder.rb +23 -0
  13. data/lib/request_handler/builder/multipart_builder.rb +22 -0
  14. data/lib/request_handler/builder/multipart_resource_builder.rb +35 -0
  15. data/lib/request_handler/builder/options_builder.rb +88 -0
  16. data/lib/request_handler/builder/page_builder.rb +30 -0
  17. data/lib/request_handler/builder/page_resource_builder.rb +23 -0
  18. data/lib/request_handler/builder/query_builder.rb +23 -0
  19. data/lib/request_handler/builder/sort_options_builder.rb +23 -0
  20. data/lib/request_handler/concerns/config_helper.rb +25 -0
  21. data/lib/request_handler/config.rb +33 -0
  22. data/lib/request_handler/fieldsets_parser.rb +5 -4
  23. data/lib/request_handler/include_option_parser.rb +2 -2
  24. data/lib/request_handler/multipart_parser.rb +8 -11
  25. data/lib/request_handler/option_parser.rb +1 -1
  26. data/lib/request_handler/page_parser.rb +19 -10
  27. data/lib/request_handler/schema_parser.rb +8 -4
  28. data/lib/request_handler/sort_option_parser.rb +2 -2
  29. data/lib/request_handler/validation/definition_engine.rb +2 -1
  30. data/lib/request_handler/validation/dry_engine.rb +24 -16
  31. data/lib/request_handler/version.rb +1 -1
  32. data/lib/request_handler.rb +7 -22
  33. data/request_handler.gemspec +2 -4
  34. metadata +33 -44
@@ -0,0 +1,88 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'request_handler/builder/base'
4
+ require 'request_handler/builder/page_builder'
5
+ require 'request_handler/builder/include_options_builder'
6
+ require 'request_handler/builder/sort_options_builder'
7
+ require 'request_handler/builder/filter_builder'
8
+ require 'request_handler/builder/query_builder'
9
+ require 'request_handler/builder/body_builder'
10
+ require 'request_handler/builder/multipart_builder'
11
+ require 'request_handler/builder/fieldsets_builder'
12
+
13
+ module RequestHandler
14
+ module Builder
15
+ class OptionsBuilder < Base
16
+ Options = Struct.new(:page, :include_options, :sort_options, :filter, :query, :body,
17
+ :multipart, :fieldsets)
18
+
19
+ def create_klass_struct
20
+ @result = Options.new
21
+ end
22
+
23
+ def page(&block)
24
+ @result.page = build_page(&block)
25
+ end
26
+
27
+ def include_options(&block)
28
+ @result.include_options = build_include_options(&block)
29
+ end
30
+
31
+ def sort_options(&block)
32
+ @result.sort_options = build_sort_options(&block)
33
+ end
34
+
35
+ def filter(&block)
36
+ @result.filter = build_filter(&block)
37
+ end
38
+
39
+ def query(&block)
40
+ @result.query = build_query(&block)
41
+ end
42
+
43
+ def body(&block)
44
+ @result.body = build_body(&block)
45
+ end
46
+
47
+ def multipart(&block)
48
+ @result.multipart = build_multipart(&block)
49
+ end
50
+
51
+ def fieldsets(&block)
52
+ @result.fieldsets = build_fieldsets(&block)
53
+ end
54
+
55
+ def build_page(&block)
56
+ Docile.dsl_eval(PageBuilder.new, &block).build
57
+ end
58
+
59
+ def build_include_options(&block)
60
+ Docile.dsl_eval(IncludeOptionsBuilder.new, &block).build
61
+ end
62
+
63
+ def build_sort_options(&block)
64
+ Docile.dsl_eval(SortOptionsBuilder.new, &block).build
65
+ end
66
+
67
+ def build_filter(&block)
68
+ Docile.dsl_eval(FilterBuilder.new, &block).build
69
+ end
70
+
71
+ def build_query(&block)
72
+ Docile.dsl_eval(QueryBuilder.new, &block).build
73
+ end
74
+
75
+ def build_body(&block)
76
+ Docile.dsl_eval(BodyBuilder.new, &block).build
77
+ end
78
+
79
+ def build_multipart(&block)
80
+ Docile.dsl_eval(MultipartBuilder.new, &block).build
81
+ end
82
+
83
+ def build_fieldsets(&block)
84
+ Docile.dsl_eval(FieldsetsBuilder.new, &block).build
85
+ end
86
+ end
87
+ end
88
+ end
@@ -0,0 +1,30 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'request_handler/builder/base'
4
+ require 'request_handler/builder/page_resource_builder'
5
+
6
+ module RequestHandler
7
+ module Builder
8
+ class PageBuilder < Base
9
+ def create_klass_struct
10
+ @result = OpenStruct.new
11
+ end
12
+
13
+ def default_size(value)
14
+ @result.default_size = value
15
+ end
16
+
17
+ def max_size(value)
18
+ @result.max_size = value
19
+ end
20
+
21
+ def resource(name, &block)
22
+ @result[name.to_sym] = build_page_resource(&block)
23
+ end
24
+
25
+ def build_page_resource(&block)
26
+ Docile.dsl_eval(PageResourceBuilder.new, &block).build
27
+ end
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,23 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'request_handler/builder/base'
4
+
5
+ module RequestHandler
6
+ module Builder
7
+ class PageResourceBuilder < Base
8
+ PageResource = Struct.new(:default_size, :max_size)
9
+
10
+ def create_klass_struct
11
+ @result = PageResource.new
12
+ end
13
+
14
+ def default_size(value)
15
+ @result.default_size = value
16
+ end
17
+
18
+ def max_size(value)
19
+ @result.max_size = value
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,23 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'request_handler/builder/base'
4
+
5
+ module RequestHandler
6
+ module Builder
7
+ class QueryBuilder < Base
8
+ Query = Struct.new(:schema, :options)
9
+
10
+ def create_klass_struct
11
+ @result = Query.new
12
+ end
13
+
14
+ def schema(value)
15
+ @result.schema = value
16
+ end
17
+
18
+ def options(value)
19
+ @result.options = value
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,23 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'request_handler/builder/base'
4
+
5
+ module RequestHandler
6
+ module Builder
7
+ class SortOptionsBuilder < Base
8
+ SortOptions = Struct.new(:allowed, :defaults)
9
+
10
+ def create_klass_struct
11
+ @result = SortOptions.new
12
+ end
13
+
14
+ def allowed(value)
15
+ @result.allowed = value
16
+ end
17
+
18
+ def defaults(value)
19
+ @result.defaults = value
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,25 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RequestHandler
4
+ module Concerns
5
+ module ConfigHelper
6
+ def lookup!(hash, key)
7
+ lookup(hash, key) || (raise NoConfigAvailableError, key.to_sym => 'is not configured')
8
+ end
9
+
10
+ def lookup(config, key)
11
+ config.dig(*symbolize_key(key))
12
+ end
13
+
14
+ def symbolize_key(key)
15
+ key.split('.').map(&:to_sym)
16
+ end
17
+
18
+ def deep_to_h(obj)
19
+ obj.to_h.transform_values do |v|
20
+ v.is_a?(OpenStruct) || v.is_a?(Struct) ? deep_to_h(v) : v
21
+ end
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,33 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'docile'
4
+
5
+ module RequestHandler
6
+ class Config
7
+ def initialize(&block)
8
+ @config = Docile.dsl_eval(RequestHandler::Builder::OptionsBuilder.new, &block).build
9
+ end
10
+
11
+ attr_accessor :config
12
+
13
+ def lookup!(key)
14
+ lookup(key) || (raise NoConfigAvailableError, key.to_sym => 'is not configured')
15
+ end
16
+
17
+ def lookup(key)
18
+ @config.dig(*symbolize_key(key))
19
+ end
20
+
21
+ private
22
+
23
+ def symbolize_key(key)
24
+ key.split('.').map(&:to_sym)
25
+ end
26
+
27
+ def deep_to_h(obj)
28
+ obj.to_h.transform_values do |v|
29
+ v.is_a?(OpenStruct) || v.is_a?(Struct) ? deep_to_h(v) : v
30
+ end
31
+ end
32
+ end
33
+ end
@@ -7,9 +7,10 @@ module RequestHandler
7
7
  def initialize(params:, allowed: {}, required: [])
8
8
  @params = params
9
9
  allowed.reject! { |_k, v| v == false }
10
- allowed.each_value do |option|
10
+ allowed.each_pair do |_key, value|
11
11
  raise InternalArgumentError, allowed: 'must be a Schema or a Boolean' unless
12
- RequestHandler.engine.valid_schema?(option) || option.is_a?(TrueClass)
12
+ RequestHandler.configuration.validation_engine.valid_schema?(value) ||
13
+ value.is_a?(TrueClass) || value.is_a?(FalseClass)
13
14
  end
14
15
  @allowed = allowed
15
16
  raise InternalArgumentError, required: 'must be an Array' unless required.is_a?(Array)
@@ -39,7 +40,7 @@ module RequestHandler
39
40
  if allowed[type] == true
40
41
  option.to_sym
41
42
  else
42
- RequestHandler.engine.validate!(option, allowed[type]).output.to_sym
43
+ RequestHandler.configuration.validation_engine.validate!(option, allowed[type]).output.to_sym
43
44
  end
44
45
  rescue Validation::Error
45
46
  raise FieldsetsParamsError, [{ code: 'INVALID_QUERY_PARAMETER',
@@ -55,7 +56,7 @@ module RequestHandler
55
56
  end
56
57
 
57
58
  def raise_invalid_field_option(type)
58
- return if allowed.key?(type)
59
+ return if allowed.dig(type)
59
60
  raise OptionNotAllowedError, [
60
61
  {
61
62
  code: 'INVALID_QUERY_PARAMETER',
@@ -13,9 +13,9 @@ module RequestHandler
13
13
 
14
14
  def allowed_options(options)
15
15
  options.map do |option|
16
- option.gsub!('.', ::RequestHandler.separator)
16
+ option.gsub!('.', ::RequestHandler.configuration.separator)
17
17
  begin
18
- RequestHandler.engine.validate!(option, allowed_options_type).output.to_sym
18
+ RequestHandler.configuration.validation_engine.validate!(option, allowed_options_type).output.to_sym
19
19
  rescue Validation::Error
20
20
  raise_error('OPTION_NOT_ALLOWED', "#{option} is not an allowed include option", OptionNotAllowedError)
21
21
  end
@@ -1,11 +1,12 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require 'request_handler/error'
4
+ require 'request_handler/base_parser'
4
5
  require 'request_handler/schema_parser'
5
6
  require 'request_handler/document_parser'
6
7
 
7
8
  module RequestHandler
8
- class MultipartsParser
9
+ class MultipartsParser < BaseParser
9
10
  def initialize(request:, multipart_config:)
10
11
  @request = request
11
12
  @params = request.params
@@ -14,10 +15,10 @@ module RequestHandler
14
15
  end
15
16
 
16
17
  def run
17
- multipart_config.each_with_object({}) do |(name, config), memo|
18
+ deep_to_h(multipart_config).each_with_object({}) do |(name, config), indexed_parts|
18
19
  validate_presence!(name) if config[:required]
19
20
  next if params[name.to_s].nil?
20
- memo[name] = parse_part(name.to_s)
21
+ indexed_parts[name] = parse_part(name.to_s)
21
22
  end
22
23
  end
23
24
 
@@ -38,7 +39,7 @@ module RequestHandler
38
39
 
39
40
  def parse_part(name)
40
41
  params[name].fetch(:tempfile) { raise MultipartParamsError, [{ multipart_file: 'missing' }] }
41
- if lookup("#{name}.schema")
42
+ if lookup(multipart_config, "#{name}.schema")
42
43
  parse_data(name)
43
44
  else
44
45
  params[name]
@@ -47,12 +48,12 @@ module RequestHandler
47
48
 
48
49
  def parse_data(name)
49
50
  data = load_json(name)
50
- type = lookup("#{name}.type")
51
+ type = lookup(multipart_config, "#{name}.type")
51
52
  DocumentParser.new(
52
53
  type: type,
53
54
  document: data,
54
- schema: lookup("#{name}.schema"),
55
- schema_options: execute_options(lookup("#{name}.options"))
55
+ schema: lookup(multipart_config, "#{name}.schema"),
56
+ schema_options: execute_options(lookup(multipart_config, "#{name}.options"))
56
57
  ).run
57
58
  end
58
59
 
@@ -69,10 +70,6 @@ module RequestHandler
69
70
  params[name][:tempfile]
70
71
  end
71
72
 
72
- def lookup(key)
73
- multipart_config.lookup!(key)
74
- end
75
-
76
73
  def execute_options(options)
77
74
  return {} if options.nil?
78
75
  return options unless options.respond_to?(:call)
@@ -12,7 +12,7 @@ module RequestHandler
12
12
  private
13
13
 
14
14
  def schema?
15
- RequestHandler.engine.valid_schema?(@allowed_options_type)
15
+ RequestHandler.configuration.validation_engine.valid_schema?(@allowed_options_type)
16
16
  end
17
17
 
18
18
  def empty_param?(param)
@@ -1,8 +1,10 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require 'request_handler/error'
4
+ require 'request_handler/base_parser'
5
+
4
6
  module RequestHandler
5
- class PageParser
7
+ class PageParser < BaseParser
6
8
  def initialize(params:, page_config:)
7
9
  missing_arguments = []
8
10
  missing_arguments << { params: 'is missing' } if params.nil?
@@ -14,11 +16,10 @@ module RequestHandler
14
16
  end
15
17
 
16
18
  def run
17
- base = { number: extract_number, size: extract_size }
18
- cfg = config.keys.reduce(base) do |memo, key|
19
+ cfg = deep_to_h(config).keys.reduce(base_page) do |memo, key|
19
20
  next memo if TOP_LEVEL_PAGE_KEYS.include?(key)
20
- memo.merge!("#{key}#{::RequestHandler.separator}number".to_sym => extract_number(prefix: key),
21
- "#{key}#{::RequestHandler.separator}size".to_sym => extract_size(prefix: key))
21
+ memo.merge!("#{key}#{separator}number".to_sym => extract_number(prefix: key),
22
+ "#{key}#{separator}size".to_sym => extract_size(prefix: key))
22
23
  end
23
24
  check_for_missing_options(cfg)
24
25
  cfg
@@ -29,10 +30,14 @@ module RequestHandler
29
30
  TOP_LEVEL_PAGE_KEYS = Set.new(%i[default_size max_size])
30
31
  attr_reader :page_options, :config
31
32
 
33
+ def base_page
34
+ { number: extract_number, size: extract_size }
35
+ end
36
+
32
37
  def check_for_missing_options(config)
33
38
  missing_arguments = page_options.keys - config.keys.map(&:to_s)
34
39
  return if missing_arguments.empty?
35
- missing_arguments.map! { |e| e.gsub(::RequestHandler.separator, '.') }
40
+ missing_arguments.map! { |e| e.gsub(separator, '.') }
36
41
  warn 'client sent unknown option ' + missing_arguments.to_s unless missing_arguments.empty?
37
42
  end
38
43
 
@@ -93,11 +98,11 @@ module RequestHandler
93
98
 
94
99
  def lookup_nested_config_key(key, prefix)
95
100
  key = prefix ? "#{prefix}.#{key}" : key
96
- config.lookup!(key)
101
+ lookup(config, key)
97
102
  end
98
103
 
99
104
  def lookup_nested_params_key(key, prefix)
100
- key = prefix ? "#{prefix}#{::RequestHandler.separator}#{key}" : key
105
+ key = prefix ? "#{prefix}#{separator}#{key}" : key
101
106
  page_options.fetch(key, nil)
102
107
  end
103
108
 
@@ -105,12 +110,16 @@ module RequestHandler
105
110
  ::RequestHandler.configuration.logger.warn(message)
106
111
  end
107
112
 
108
- def raise_no_default_size(prefix, sep = ::RequestHandler.separator)
113
+ def raise_no_default_size(prefix, sep = separator)
109
114
  raise NoConfigAvailableError, :"#{prefix}#{sep}size" => 'has no default_size'
110
115
  end
111
116
 
112
- def raise_not_positive(prefix, key, sep = ::RequestHandler.separator)
117
+ def raise_not_positive(prefix, key, sep = separator)
113
118
  raise InternalArgumentError, :"#{prefix}#{sep}#{key}" => 'must be a positive Integer'
114
119
  end
120
+
121
+ def separator
122
+ ::RequestHandler.configuration.separator
123
+ end
115
124
  end
116
125
  end
@@ -8,7 +8,7 @@ module RequestHandler
8
8
  missing_arguments << { schema: 'is missing' } if schema.nil?
9
9
  missing_arguments << { schema_options: 'is missing' } if schema_options.nil?
10
10
  raise MissingArgumentError, missing_arguments unless missing_arguments.empty?
11
- raise InternalArgumentError, schema: 'must be a Schema' unless RequestHandler.engine.valid_schema?(schema)
11
+ raise InternalArgumentError, schema: 'must be a Schema' unless validation_engine.valid_schema?(schema)
12
12
  @schema = schema
13
13
  @schema_options = schema_options
14
14
  end
@@ -23,7 +23,7 @@ module RequestHandler
23
23
  end
24
24
 
25
25
  def validate(data, schema:)
26
- RequestHandler.engine.validate(data, schema, options: schema_options)
26
+ validation_engine.validate(data, schema, options: schema_options)
27
27
  end
28
28
 
29
29
  def validation_failure?(validator)
@@ -46,11 +46,11 @@ module RequestHandler
46
46
  end
47
47
 
48
48
  def error(path, element, failure)
49
- schema_pointer = RequestHandler.engine.error_pointer(failure) || (path + [element]).join('/')
49
+ schema_pointer = validation_engine.error_pointer(failure) || (path + [element]).join('/')
50
50
  {
51
51
  schema_pointer: schema_pointer,
52
52
  element: element,
53
- message: RequestHandler.engine.error_message(failure)
53
+ message: validation_engine.error_message(failure)
54
54
  }
55
55
  end
56
56
 
@@ -77,6 +77,10 @@ module RequestHandler
77
77
  memo
78
78
  end
79
79
 
80
+ def validation_engine
81
+ RequestHandler.configuration.validation_engine
82
+ end
83
+
80
84
  attr_reader :schema, :schema_options
81
85
  end
82
86
  end
@@ -20,7 +20,7 @@ module RequestHandler
20
20
  def parse_options(options)
21
21
  options.map do |option|
22
22
  name, order = parse_option(option)
23
- name.gsub!('.', ::RequestHandler.separator)
23
+ name.gsub!('.', ::RequestHandler.configuration.separator)
24
24
  allowed_option(name)
25
25
  SortOption.new(name, order)
26
26
  end
@@ -36,7 +36,7 @@ module RequestHandler
36
36
  end
37
37
 
38
38
  def allowed_option(name)
39
- RequestHandler.engine.validate!(name, allowed_options_type).output
39
+ RequestHandler.configuration.validation_engine.validate!(name, allowed_options_type).output
40
40
  rescue Validation::Error
41
41
  raise OptionNotAllowedError, [jsonapi_error("#{name} is not an allowed sort option")]
42
42
  end
@@ -18,7 +18,8 @@ module RequestHandler
18
18
 
19
19
  def self.validate!(value, schema, options: {})
20
20
  validate(value, schema, options).tap do |result|
21
- raise Validation::Error unless result.valid?
21
+ valid = result.respond_to?(:valid?) ? result.valid? : result.success?
22
+ raise Validation::Error unless valid
22
23
  end
23
24
  end
24
25
 
@@ -7,35 +7,43 @@ module RequestHandler
7
7
  module Validation
8
8
  class DryEngine < Engine
9
9
  def self.valid_schema?(schema)
10
- schema.respond_to?(:call)
10
+ schema_instance?(schema) || schema_class?(schema)
11
11
  end
12
12
 
13
13
  def self.validate(value, schema, options: {})
14
- value = value.deep_symbolize_keys if schema.respond_to?(:rules) &&
15
- schema.rules.keys.first.is_a?(Symbol)
16
- result = if options.empty?
17
- schema.call(value)
18
- else
19
- schema.with(options).call(value)
20
- end
21
-
22
- to_result(result)
14
+ value = value.deep_symbolize_keys if value.is_a?(Hash)
15
+ to_result(call_schema(value, schema, options))
23
16
  rescue Dry::Types::ConstraintError => e
24
17
  Result.new(output: nil, errors: { '' => e })
25
18
  end
26
19
 
20
+ def self.call_schema(value, schema, options)
21
+ if options.empty?
22
+ schema_instance?(schema) ? schema.call(value) : schema.new.call(value)
23
+ else
24
+ schema_instance?(schema) ? schema.with(options).call(value) : schema.new(options).call(value)
25
+ end
26
+ end
27
+
28
+ def self.schema_instance?(schema)
29
+ schema.respond_to?(:call)
30
+ end
31
+
32
+ def self.schema_class?(schema)
33
+ schema.respond_to?(:schema)
34
+ end
35
+
27
36
  def self.validate!(value, schema, options: {})
28
37
  validate(value, schema, options).tap do |result|
29
- raise Validation::Error unless result.valid?
38
+ valid = result.respond_to?(:valid?) ? result.valid? : result.success?
39
+ raise Validation::Error unless valid
30
40
  end
31
41
  end
32
42
 
33
43
  def self.to_result(result)
34
- if result.is_a?(Dry::Validation::Result)
35
- Result.new(output: result.output, errors: result.errors)
36
- else
37
- Result.new(output: result, errors: {})
38
- end
44
+ output = result.respond_to?(:to_h) ? result.to_h : result
45
+ errors = result.respond_to?(:errors) ? result.errors.to_h : {}
46
+ Result.new(output: output, errors: errors)
39
47
  end
40
48
 
41
49
  def self.error_message(validation_error)
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module RequestHandler
4
- VERSION = '1.3.0'.freeze
4
+ VERSION = '2.0.0'.freeze
5
5
  end
@@ -3,32 +3,17 @@
3
3
  require 'request_handler/version'
4
4
  require 'request_handler/base'
5
5
  require 'request_handler/validation/dry_engine'
6
- require 'confstruct'
7
- require 'dry-validation'
8
6
  require 'multi_json'
9
7
  require 'logger'
8
+ require 'gem_config'
10
9
 
11
10
  module RequestHandler
12
- class << self
13
- def configure(&block)
14
- configuration.configure(&block)
15
- end
11
+ include GemConfig::Base
16
12
 
17
- def configuration
18
- @configuration ||= ::Confstruct::Configuration.new do
19
- logger Logger.new(STDOUT)
20
- separator '__'
21
- validation_engine Validation::DryEngine
22
- raise_jsonapi_errors false
23
- end
24
- end
25
-
26
- def separator
27
- configuration.separator
28
- end
29
-
30
- def engine
31
- configuration.validation_engine
32
- end
13
+ with_configuration do
14
+ has :validation_engine
15
+ has :logger, default: Logger.new(STDOUT)
16
+ has :separator, classes: [String], default: '__'
17
+ has :raise_jsonapi_errors, default: false
33
18
  end
34
19
  end
@@ -23,12 +23,10 @@ Gem::Specification.new do |spec|
23
23
  spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
24
24
  spec.require_paths = ['lib']
25
25
 
26
- spec.add_dependency 'dry-validation', '~> 0.11', '>= 0.11.0'
27
- spec.add_dependency 'dry-types', '~> 0.11', '>= 0.11.0'
28
-
29
- spec.add_dependency 'confstruct', '~> 1.0.2'
26
+ spec.add_dependency 'docile', '~> 1.3'
30
27
  spec.add_dependency 'multi_json', '~> 1.12'
31
28
  spec.add_dependency 'activesupport', '> 4.0'
29
+ spec.add_dependency 'gem_config', '~> 0.3 '
32
30
 
33
31
  spec.add_development_dependency 'bundler'
34
32
  spec.add_development_dependency 'rake', '~> 10.0'