babl-json 0.3.3 → 0.3.4

Sign up to get free protection for your applications and to get access to all the features.
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