babl-json 0.3.3 → 0.3.4

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
  SHA1:
3
- metadata.gz: b410d536ca032602510a9af64d29a29dc91f536c
4
- data.tar.gz: 9a002b4137992699842abce14054d9a21d48a92a
3
+ metadata.gz: 36cb4d94d13851bb8c5a28ab9d8c4ab5a19fa6de
4
+ data.tar.gz: '0298c5489089f88c5ce9a171568e418fb8cb0dc6'
5
5
  SHA512:
6
- metadata.gz: bd1979b476227686cd13d3b994629a36fa95fbd1d55ff7d7cec466fa2304c1a414f5f1cec0a816d879d7eeb667e12934f18561c4a4920aa9be4dabd87d7d4ee0
7
- data.tar.gz: 6b23b6086b16a94a5594cb1390fc0307881fd3fefeb8ee4e59ee67aede28c564ae7cce2d0d2a069c1417a0f108e426c16d7294bc9f5b717217fc425a546897fd
6
+ metadata.gz: a0b1e9ce1e461766292ad33f43aa528d61c8fde897a94a7791a8c4b9ffcfb0f53806fbaea2dad7b981c8d2131552b20f22550aaa1eb01888449a2af08cedec50
7
+ data.tar.gz: 8ad1d7732551481f3309dd06797fe11faaa3aec11c8bc222972c4789c721b427c37f22fbedd987e139fc37174f87c3933dea272c7bd9054be7ced88dadaf725c
@@ -1,5 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
  require 'babl/nodes'
3
+ require 'babl/utils'
3
4
  require 'babl/builder'
4
5
  require 'babl/rendering'
5
6
 
@@ -9,9 +10,9 @@ module Babl
9
10
  #
10
11
  # Since the BABL code is run via #instance_eval within an instance of this class, we want to
11
12
  # define as few methods as possible here.
12
- class TemplateBase
13
+ class TemplateBase < Utils::Value.new(:builder)
13
14
  def initialize(builder = ChainBuilder.new(&:itself))
14
- @builder = builder
15
+ super(builder)
15
16
  end
16
17
 
17
18
  def compile(preloader: Rendering::NoopPreloader, pretty: true, optimize: true)
@@ -56,7 +57,7 @@ module Babl
56
57
  self.class.new builder.construct_terminal(&block)
57
58
  end
58
59
 
59
- attr_reader :builder
60
+ protected :builder
60
61
  end
61
62
  end
62
63
  end
@@ -4,10 +4,6 @@ require 'babl/utils'
4
4
  module Babl
5
5
  module Nodes
6
6
  class Dep < Utils::Value.new(:node, :path)
7
- def initialize(node, path)
8
- super(node, canonicalize(path))
9
- end
10
-
11
7
  def render(ctx)
12
8
  node.render(ctx)
13
9
  end
@@ -27,16 +23,6 @@ module Babl
27
23
  def optimize
28
24
  Dep.new(node.optimize, path)
29
25
  end
30
-
31
- private
32
-
33
- def canonicalize(path)
34
- case path
35
- when ::Array then path.reduce(Utils::Hash::EMPTY) { |a, p| a.merge(canonicalize(p)) }
36
- when ::Hash then path.map { |k, v| [k.to_sym, canonicalize(v)] }.to_h
37
- else { path.to_sym => Utils::Hash::EMPTY }
38
- end
39
- end
40
26
  end
41
27
  end
42
28
  end
@@ -7,7 +7,13 @@ module Babl
7
7
  module Nodes
8
8
  class Each < Utils::Value.new(:node)
9
9
  def dependencies
10
- { __each__: node.dependencies }
10
+ node_deps = node.dependencies
11
+ child_deps = node.dependencies.reject { |key, _| key == Parent::PARENT_MARKER }
12
+
13
+ Babl::Utils::Hash.deep_merge(
14
+ node_deps[Parent::PARENT_MARKER] || Utils::Hash::EMPTY,
15
+ __each__: child_deps
16
+ )
11
17
  end
12
18
 
13
19
  def schema
@@ -26,7 +26,7 @@ module Babl
26
26
  optimized_nodes = nodes.map(&:optimize)
27
27
  fixed_array = FixedArray.new(optimized_nodes)
28
28
  return fixed_array unless optimized_nodes.all? { |node| Constant === node }
29
- Constant.new(fixed_array.render(nil), fixed_array.schema)
29
+ Constant.new(fixed_array.nodes.map(&:value).freeze, fixed_array.schema)
30
30
  end
31
31
  end
32
32
  end
@@ -38,7 +38,7 @@ module Babl
38
38
  private
39
39
 
40
40
  def optimize_empty
41
- Constant.new({}, Schema::Object::EMPTY) if nodes.empty?
41
+ Constant.new(Utils::Hash::EMPTY, Schema::Object::EMPTY) if nodes.empty?
42
42
  end
43
43
 
44
44
  def optimize_single
@@ -5,9 +5,15 @@ require 'babl/nodes/parent'
5
5
 
6
6
  module Babl
7
7
  module Nodes
8
- class Nav < Utils::Value.new(:through, :node)
8
+ class Nav < Utils::Value.new(:property, :node)
9
9
  def dependencies
10
- { through => node.dependencies }
10
+ node_deps = node.dependencies
11
+ child_deps = node.dependencies.reject { |key, _| key == Parent::PARENT_MARKER }
12
+
13
+ Babl::Utils::Hash.deep_merge(
14
+ node_deps[Parent::PARENT_MARKER] || Utils::Hash::EMPTY,
15
+ property => child_deps
16
+ )
11
17
  end
12
18
 
13
19
  def schema
@@ -20,18 +26,18 @@ module Babl
20
26
 
21
27
  def render(ctx)
22
28
  value = begin
23
- ::Hash === ctx.object ? ctx.object.fetch(through) : ctx.object.send(through)
29
+ ::Hash === ctx.object ? ctx.object.fetch(property) : ctx.object.send(property)
24
30
  rescue StandardError => e
25
- raise Errors::RenderingError, "#{e.message}\n" + ctx.formatted_stack(through), e.backtrace
31
+ raise Errors::RenderingError, "#{e.message}\n" + ctx.formatted_stack(property), e.backtrace
26
32
  end
27
- node.render(ctx.move_forward(value, through))
33
+ node.render(ctx.move_forward(value, property))
28
34
  end
29
35
 
30
36
  def optimize
31
37
  optimized = node.optimize
32
38
  return optimized if Constant === optimized
33
39
  return optimized.node if Parent === optimized
34
- Nav.new(through, optimized)
40
+ Nav.new(property, optimized)
35
41
  end
36
42
  end
37
43
  end
@@ -6,7 +6,7 @@ require 'babl/nodes/constant'
6
6
  module Babl
7
7
  module Nodes
8
8
  class Object < Utils::Value.new(:nodes)
9
- EMPTY = new({})
9
+ EMPTY = new(Utils::Hash::EMPTY)
10
10
 
11
11
  def dependencies
12
12
  nodes.values.map(&:dependencies).reduce(Utils::Hash::EMPTY) { |a, b| Babl::Utils::Hash.deep_merge(a, b) }
@@ -32,7 +32,7 @@ module Babl
32
32
  optimized_nodes = nodes.map { |k, v| [k, v.optimize] }.to_h
33
33
  optimized_object = Object.new(optimized_nodes)
34
34
  return optimized_object unless optimized_nodes.values.all? { |node| Constant === node }
35
- Constant.new(optimized_object.render(nil), optimized_object.schema)
35
+ Constant.new(optimized_object.nodes.map { |k, v| [k, v.value] }.to_h.freeze, optimized_object.schema)
36
36
  end
37
37
  end
38
38
  end
@@ -7,9 +7,11 @@ module Babl
7
7
  class Parent < Utils::Value.new(:node)
8
8
  PARENT_MARKER = Utils::Ref.new
9
9
 
10
- class Resolver < Utils::Value.new(:node)
10
+ class Verifier < Utils::Value.new(:node)
11
11
  def dependencies
12
- backpropagate_dependencies(node.dependencies)
12
+ deps = node.dependencies
13
+ raise Errors::InvalidTemplate, 'Out of context parent dependency' if deps.key? PARENT_MARKER
14
+ deps
13
15
  end
14
16
 
15
17
  def schema
@@ -25,26 +27,7 @@ module Babl
25
27
  end
26
28
 
27
29
  def optimize
28
- Resolver.new(node.optimize)
29
- end
30
-
31
- private
32
-
33
- def backpropagate_dependencies(deps)
34
- raise Errors::InvalidTemplate, 'Out of context parent dependency' if deps.key? PARENT_MARKER
35
- new_deps = backpropagate_dependencies_one_level(deps)
36
- deps == new_deps ? new_deps : backpropagate_dependencies(new_deps)
37
- end
38
-
39
- def backpropagate_dependencies_one_level(deps)
40
- deps.reduce(Utils::Hash::EMPTY) do |out, (k, v)|
41
- next out if k == PARENT_MARKER
42
-
43
- Babl::Utils::Hash.deep_merge(
44
- Babl::Utils::Hash.deep_merge(out, k => backpropagate_dependencies_one_level(v)),
45
- v[PARENT_MARKER] || Utils::Hash::EMPTY
46
- )
47
- end
30
+ Verifier.new(node.optimize)
48
31
  end
49
32
  end
50
33
 
@@ -38,11 +38,18 @@ module Babl
38
38
  optimize_truthy_conditions ||
39
39
  optimize_always_same_outputs ||
40
40
  optimize_same_conditions ||
41
+ optimize_continue_to_switch ||
41
42
  self
42
43
  end
43
44
 
44
45
  private
45
46
 
47
+ def optimize_continue_to_switch
48
+ cond, val = nodes.last
49
+ return unless Switch === val && Constant === cond && cond.value
50
+ Switch.new(nodes[0...-1] + val.nodes).optimize
51
+ end
52
+
46
53
  def optimize_same_conditions
47
54
  conds = Set.new
48
55
  new_nodes = nodes.map { |cond, val|
@@ -2,33 +2,83 @@
2
2
  require 'babl/utils'
3
3
  require 'babl/schema'
4
4
  require 'babl/nodes/terminal_value'
5
+ require 'singleton'
5
6
 
6
7
  module Babl
7
8
  module Nodes
8
- class Typed < Utils::Value.new(:schema)
9
- BOOLEAN = new(Schema::Typed::BOOLEAN)
10
- INTEGER = new(Schema::Typed::INTEGER)
11
- NUMBER = new(Schema::Typed::NUMBER)
12
- STRING = new(Schema::Typed::STRING)
13
-
14
- def dependencies
15
- Utils::Hash::EMPTY
9
+ module Typed
10
+ class Base
11
+ include Singleton
12
+
13
+ def dependencies
14
+ Utils::Hash::EMPTY
15
+ end
16
+
17
+ def pinned_dependencies
18
+ Utils::Hash::EMPTY
19
+ end
20
+
21
+ def optimize
22
+ self
23
+ end
16
24
  end
17
25
 
18
- def pinned_dependencies
19
- Utils::Hash::EMPTY
26
+ class String < Base
27
+ def schema
28
+ Schema::Typed::STRING
29
+ end
30
+
31
+ def render(ctx)
32
+ value = ctx.object
33
+ return value if ::String === value
34
+ return value.to_s if ::Symbol === value
35
+
36
+ raise Errors::RenderingError,
37
+ "Expected a string, got #{value}\n#{ctx.formatted_stack}"
38
+ end
20
39
  end
21
40
 
22
- def render(ctx)
23
- value = ctx.object
24
- if schema.classes.any? { |clazz| clazz === value }
25
- return ::Numeric === value ? TerminalValue.instance.render_object(value) : value
41
+ class Integer < Base
42
+ def schema
43
+ Schema::Typed::INTEGER
44
+ end
45
+
46
+ def render(ctx)
47
+ value = ctx.object
48
+ return value if ::Integer === value
49
+
50
+ raise Errors::RenderingError,
51
+ "Expected an integer, got #{value}\n#{ctx.formatted_stack}"
26
52
  end
27
- raise Errors::RenderingError, "Expected type '#{schema.type}': #{value}\n#{ctx.formatted_stack}"
28
53
  end
29
54
 
30
- def optimize
31
- self
55
+ class Number < Base
56
+ def schema
57
+ Schema::Typed::NUMBER
58
+ end
59
+
60
+ def render(ctx)
61
+ value = ctx.object
62
+ return value if ::Integer === value
63
+ return value.to_f if ::Numeric === value
64
+
65
+ raise Errors::RenderingError,
66
+ "Expected a number, got #{value}\n#{ctx.formatted_stack}"
67
+ end
68
+ end
69
+
70
+ class Boolean < Base
71
+ def schema
72
+ Schema::Typed::BOOLEAN
73
+ end
74
+
75
+ def render(ctx)
76
+ value = ctx.object
77
+ return value if true == value || false == value
78
+
79
+ raise Errors::RenderingError,
80
+ "Expected a boolean, got #{value}\n#{ctx.formatted_stack}"
81
+ end
32
82
  end
33
83
  end
34
84
  end
@@ -10,8 +10,12 @@ module Babl
10
10
  end
11
11
 
12
12
  def dependencies
13
- # Dependencies of 'node' are explicitely ignored
14
- nodes.map(&:dependencies).reduce(Utils::Hash::EMPTY) { |a, b| Babl::Utils::Hash.deep_merge(a, b) }
13
+ Babl::Utils::Hash.deep_merge(
14
+ node.dependencies[Parent::PARENT_MARKER] || Utils::Hash::EMPTY,
15
+ nodes.map(&:dependencies).reduce(Utils::Hash::EMPTY) { |a, b|
16
+ Babl::Utils::Hash.deep_merge(a, b)
17
+ }
18
+ )
15
19
  end
16
20
 
17
21
  def pinned_dependencies
@@ -32,6 +36,7 @@ module Babl
32
36
  def optimize
33
37
  optimized = node.optimize
34
38
  return optimized if Constant === optimized
39
+ return optimized.node if Parent === optimized
35
40
  With.new(optimized, nodes.map(&:optimize), block)
36
41
  end
37
42
  end
@@ -7,9 +7,11 @@ module Babl
7
7
  module DSL
8
8
  # Produce an fixed-size array, using the provided templates to populate its elements.
9
9
  def array(*templates)
10
+ templates = templates.map { |t| unscoped.call(t) }
11
+
10
12
  construct_terminal { |ctx|
11
13
  Nodes::FixedArray.new(templates.map { |t|
12
- unscoped.call(t).builder.precompile(Nodes::TerminalValue.instance, ctx.merge(continue: nil))
14
+ t.builder.precompile(Nodes::TerminalValue.instance, ctx.merge(continue: nil))
13
15
  })
14
16
  }
15
17
  end
@@ -18,7 +18,7 @@ module Babl
18
18
  when Utils::DslProxy then call(arg.itself)
19
19
  when ::Symbol then nav(arg)
20
20
  when ::Proc then call(&arg)
21
- when ::Hash then object(**arg.map { |k, v| [:"#{k}", v] }.to_h)
21
+ when ::Hash then object(arg)
22
22
  when ::Array then array(*arg)
23
23
  when ::String, ::Numeric, ::NilClass, ::TrueClass, ::FalseClass then static(arg)
24
24
  else raise Errors::InvalidTemplate, "call() received invalid argument: #{arg}"
@@ -4,10 +4,19 @@ require 'babl/nodes'
4
4
  module Babl
5
5
  module Operators
6
6
  module Dep
7
+ def self.canonicalize(path)
8
+ case path
9
+ when ::Array then path.reduce(Utils::Hash::EMPTY) { |a, p| a.merge(canonicalize(p)) }
10
+ when ::Hash then path.map { |k, v| [k.dup.freeze, canonicalize(v)] }.to_h
11
+ else { path.dup.freeze => Utils::Hash::EMPTY }
12
+ end
13
+ end
14
+
7
15
  module DSL
8
16
  # Declare dependencies as if they were generated by nav()
9
17
  # but without navigating.
10
18
  def dep(*path)
19
+ path = Dep.canonicalize(path)
11
20
  construct_node(continue: nil) { |node| Nodes::Dep.new(node, path) }
12
21
  end
13
22
  end
@@ -9,11 +9,12 @@ module Babl
9
9
  # Merge multiple JSON objects (non-deep)
10
10
  def merge(*templates)
11
11
  return call(Utils::Hash::EMPTY) if templates.empty?
12
+ templates = templates.map { |t| unscoped.call(t) }
12
13
 
13
14
  construct_terminal { |context|
14
15
  Nodes::Merge.new(
15
16
  templates.map { |t|
16
- unscoped.call(t).builder.precompile(
17
+ t.builder.precompile(
17
18
  Nodes::TerminalValue.instance,
18
19
  context.merge(continue: nil)
19
20
  )
@@ -14,8 +14,8 @@ module Babl
14
14
  if path.empty?
15
15
  return (block ? with(unscoped, &block) : construct_node(key: nil, continue: nil) { |node| node })
16
16
  end
17
-
18
- construct_node(key: nil, continue: nil) { |node| Nodes::Nav.new(path.first, node) }
17
+ property = path.first.dup.freeze
18
+ construct_node(key: nil, continue: nil) { |node| Nodes::Nav.new(property, node) }
19
19
  .nav(*path[1..-1], &block)
20
20
  end
21
21
  end
@@ -1,5 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
  require 'babl/nodes'
3
+ require 'babl/utils'
3
4
  require 'babl/errors'
4
5
 
5
6
  module Babl
@@ -7,24 +8,28 @@ module Babl
7
8
  module Object
8
9
  module DSL
9
10
  # Create a JSON object node with static structure
10
- def object(*attrs, **nested)
11
- (attrs.map(&:to_sym) + nested.keys).group_by(&:itself).each_value do |keys|
11
+ def object(*args)
12
+ kwargs = ::Hash === args.last ? args.pop : Utils::Hash::EMPTY
13
+
14
+ (args.map(&:to_sym) + kwargs.keys.map(&:to_sym)).group_by(&:itself).each_value do |keys|
12
15
  raise Errors::InvalidTemplate, "Duplicate key in object(): #{keys.first}" if keys.size > 1
13
16
  end
14
17
 
18
+ templates = args
19
+ .map { |name| [name.to_sym, unscoped.nav(name)] }.to_h
20
+ .merge(kwargs)
21
+ .map { |k, v| [k, unscoped.call(v)] }
22
+
15
23
  construct_terminal { |ctx|
16
- nodes = attrs
17
- .map { |name| [name.to_sym, unscoped.enter] }.to_h
18
- .merge(nested)
19
- .map { |k, v|
20
- [k, unscoped.call(v).builder.precompile(
24
+ Nodes::Object.new(templates.map { |key, template|
25
+ [
26
+ key.to_sym,
27
+ template.builder.precompile(
21
28
  Nodes::TerminalValue.instance,
22
- ctx.merge(key: k, continue: nil)
23
- )]
24
- }
25
- .to_h
26
-
27
- Nodes::Object.new(nodes)
29
+ ctx.merge(key: key, continue: nil)
30
+ )
31
+ ]
32
+ }.to_h)
28
33
  }
29
34
  end
30
35
  end
@@ -14,7 +14,7 @@ module Babl
14
14
 
15
15
  # Override TemplateBase#precompile to add parent dependencies verification
16
16
  def precompile
17
- Nodes::Parent::Resolver.new(super)
17
+ Nodes::Parent::Verifier.new(super)
18
18
  end
19
19
  end
20
20
  end
@@ -6,7 +6,9 @@ module Babl
6
6
  module DSL
7
7
  # Parse BABL source into a Template
8
8
  def source(*args, &block)
9
- call(block ? Utils::DslProxy.eval(unscoped, &block) : unscoped.instance_eval(*args))
9
+ raise Errors::InvalidTemplate, 'source() expects a block xor a string' unless args.empty? ^ block.nil?
10
+ block ||= proc { instance_eval(*args) }
11
+ call Utils::DslProxy.eval(unscoped, &block)
10
12
  end
11
13
  end
12
14
  end
@@ -12,7 +12,10 @@ module Babl
12
12
 
13
13
  case sanitized_val
14
14
  when ::String, ::Numeric, ::NilClass, ::TrueClass, ::FalseClass
15
- construct_terminal { Nodes::Constant.new(sanitized_val, Schema::Primitive.new(sanitized_val)) }
15
+ frozen_val = sanitized_val.dup.freeze
16
+ construct_terminal {
17
+ Nodes::Constant.new(frozen_val, Schema::Primitive.new(frozen_val))
18
+ }
16
19
  else call(sanitized_val)
17
20
  end
18
21
  rescue Errors::RenderingError => exception
@@ -8,13 +8,19 @@ module Babl
8
8
  module DSL
9
9
  # Conditional switching between different templates
10
10
  def switch(conds = Utils::Hash::EMPTY)
11
+ conds = conds.map { |cond, value| [unscoped.call(cond), unscoped.call(value)] }
12
+
11
13
  construct_node(continue: nil) { |node, context|
12
14
  nodes = conds.map { |cond, value|
13
- cond_node = unscoped.call(cond).builder
14
- .precompile(Nodes::InternalValue.instance, context.merge(continue: nil))
15
+ cond_node = cond.builder.precompile(
16
+ Nodes::InternalValue.instance,
17
+ context.merge(continue: nil)
18
+ )
15
19
 
16
- value_node = unscoped.call(value).builder
17
- .precompile(Nodes::TerminalValue.instance, context.merge(continue: node))
20
+ value_node = value.builder.precompile(
21
+ Nodes::TerminalValue.instance,
22
+ context.merge(continue: node)
23
+ )
18
24
 
19
25
  [cond_node, value_node]
20
26
  }
@@ -6,19 +6,19 @@ module Babl
6
6
  module Typed
7
7
  module DSL
8
8
  def integer
9
- construct_terminal { Nodes::Typed::INTEGER }
9
+ construct_terminal { Nodes::Typed::Integer.instance }
10
10
  end
11
11
 
12
12
  def number
13
- construct_terminal { Nodes::Typed::NUMBER }
13
+ construct_terminal { Nodes::Typed::Number.instance }
14
14
  end
15
15
 
16
16
  def string
17
- construct_terminal { Nodes::Typed::STRING }
17
+ construct_terminal { Nodes::Typed::String.instance }
18
18
  end
19
19
 
20
20
  def boolean
21
- construct_terminal { Nodes::Typed::BOOLEAN }
21
+ construct_terminal { Nodes::Typed::Boolean.instance }
22
22
  end
23
23
  end
24
24
  end
@@ -7,13 +7,15 @@ module Babl
7
7
  module DSL
8
8
  # Produce a value by calling the block, passing it the output value of the templates passed as argument.
9
9
  def with(*templates, &block)
10
+ templates = templates.map { |t| unscoped.call(t) }
11
+
10
12
  construct_node(key: nil, continue: nil) do |node, context|
11
- Nodes::With.new(node, templates.map do |t|
12
- unscoped.call(t).builder.precompile(
13
+ Nodes::With.new(node, templates.map { |t|
14
+ t.builder.precompile(
13
15
  Nodes::InternalValue.instance,
14
16
  context.merge(continue: nil)
15
17
  )
16
- end, block)
18
+ }, block)
17
19
  end
18
20
  end
19
21
  end
@@ -9,7 +9,8 @@ module Babl
9
9
  # correctly.
10
10
  class DslProxy
11
11
  NON_PROXIED_METHODS = Set[
12
- :__send__, :send, :object_id, :__id__, :equal?, :instance_eval
12
+ :__send__, :send, :object_id, :__id__, :equal?, :instance_eval, :instance_exec,
13
+ :respond_to?, :method, :freeze
13
14
  ]
14
15
 
15
16
  instance_methods.each do |method|
@@ -31,7 +32,7 @@ module Babl
31
32
  @__fallback__.respond_to?(method, include_private)
32
33
  end
33
34
 
34
- def self.eval(dsl, *args, &block)
35
+ def self.eval(dsl, &block)
35
36
  new(dsl, block.binding.receiver).instance_eval(&block)
36
37
  end
37
38
 
data/lib/babl/version.rb CHANGED
@@ -1,4 +1,4 @@
1
1
  # frozen_string_literal: true
2
2
  module Babl
3
- VERSION = '0.3.3'
3
+ VERSION = '0.3.4'
4
4
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: babl-json
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.3
4
+ version: 0.3.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Frederic Terrazzoni
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-09-20 00:00:00.000000000 Z
11
+ date: 2017-10-01 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: pry