babl-json 0.2.2 → 0.2.3
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/CHANGELOG.md +4 -0
 - data/README.md +4 -2
 - data/babl.gemspec +0 -1
 - data/lib/babl/nodes/create_pin.rb +2 -2
 - data/lib/babl/nodes/dep.rb +2 -2
 - data/lib/babl/nodes/each.rb +2 -2
 - data/lib/babl/nodes/fixed_array.rb +2 -2
 - data/lib/babl/nodes/goto_pin.rb +2 -2
 - data/lib/babl/nodes/merge.rb +4 -4
 - data/lib/babl/nodes/nav.rb +2 -2
 - data/lib/babl/nodes/object.rb +2 -2
 - data/lib/babl/nodes/parent.rb +3 -3
 - data/lib/babl/nodes/static.rb +2 -2
 - data/lib/babl/nodes/switch.rb +3 -3
 - data/lib/babl/nodes/typed.rb +10 -10
 - data/lib/babl/nodes/with.rb +2 -2
 - data/lib/babl/rendering/compiled_template.rb +2 -2
 - data/lib/babl/schema/any_of.rb +52 -20
 - data/lib/babl/schema/dyn_array.rb +2 -2
 - data/lib/babl/schema/fixed_array.rb +2 -2
 - data/lib/babl/schema/object.rb +3 -3
 - data/lib/babl/schema/static.rb +4 -2
 - data/lib/babl/schema/typed.rb +6 -6
 - data/lib/babl/utils/value.rb +37 -0
 - data/lib/babl/version.rb +1 -1
 - data/logo-babl.png +0 -0
 - data/spec/operators/switch_spec.rb +30 -1
 - data/spec/spec_helper/schema_utils.rb +1 -1
 - data/spec/utils/value_spec.rb +54 -0
 - metadata +6 -16
 
    
        checksums.yaml
    CHANGED
    
    | 
         @@ -1,7 +1,7 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            ---
         
     | 
| 
       2 
2 
     | 
    
         
             
            SHA1:
         
     | 
| 
       3 
     | 
    
         
            -
              metadata.gz:  
     | 
| 
       4 
     | 
    
         
            -
              data.tar.gz:  
     | 
| 
      
 3 
     | 
    
         
            +
              metadata.gz: de6e2596717bacec917c4ccb9b293676ba32f7b5
         
     | 
| 
      
 4 
     | 
    
         
            +
              data.tar.gz: 2756b7fd36d5fdc9c661d0a1341f1353d6200260
         
     | 
| 
       5 
5 
     | 
    
         
             
            SHA512:
         
     | 
| 
       6 
     | 
    
         
            -
              metadata.gz:  
     | 
| 
       7 
     | 
    
         
            -
              data.tar.gz:  
     | 
| 
      
 6 
     | 
    
         
            +
              metadata.gz: 78ebc4868c41208e176f32637aa781c292ec6025612b988edb88a20ed9a640e250d942864789be496687651c19208df26335e5d2c9959307900c96a304886ea8
         
     | 
| 
      
 7 
     | 
    
         
            +
              data.tar.gz: 6f1fb869d2345fabc61d52eb4065b5d2202e641afdd1d344b7218c6cdd70f1de4b3c3b919019b1fb8328e176c116c5614ae8aeff25b99b2d3305148f4b10a0b7
         
     | 
    
        data/CHANGELOG.md
    CHANGED
    
    | 
         @@ -1,5 +1,9 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            # BABL Changelog
         
     | 
| 
       2 
2 
     | 
    
         | 
| 
      
 3 
     | 
    
         
            +
            ## 0.2.3 (July 21, 2017)
         
     | 
| 
      
 4 
     | 
    
         
            +
            - Try to simplify JSON-Schema when types are specified.
         
     | 
| 
      
 5 
     | 
    
         
            +
            - Cut out dependency on [Values](https://github.com/tcrayford/Values).
         
     | 
| 
      
 6 
     | 
    
         
            +
             
     | 
| 
       3 
7 
     | 
    
         
             
            ## 0.2.2 (July 13, 2017)
         
     | 
| 
       4 
8 
     | 
    
         | 
| 
       5 
9 
     | 
    
         
             
            - Added four typing operators: `integer`, `number`, `string` and `boolean`.
         
     | 
    
        data/README.md
    CHANGED
    
    | 
         @@ -1,6 +1,8 @@ 
     | 
|
| 
       1 
     | 
    
         
            -
             
     | 
| 
      
 1 
     | 
    
         
            +
            
         
     | 
| 
       2 
2 
     | 
    
         | 
| 
       3 
3 
     | 
    
         
             
            [](https://travis-ci.org/getbannerman/babl)
         
     | 
| 
      
 4 
     | 
    
         
            +
            [](https://rubygems.org/gems/babl-json)
         
     | 
| 
      
 5 
     | 
    
         
            +
            [](https://rubygems.org/gems/babl-json)
         
     | 
| 
       4 
6 
     | 
    
         | 
| 
       5 
7 
     | 
    
         
             
            BABL (Bannerman API Builder Language) is a templating langage for generating JSON in APIs.
         
     | 
| 
       6 
8 
     | 
    
         | 
| 
         @@ -24,7 +26,7 @@ BABL template: 
     | 
|
| 
       24 
26 
     | 
    
         
             
            ```ruby
         
     | 
| 
       25 
27 
     | 
    
         
             
            object(
         
     | 
| 
       26 
28 
     | 
    
         
             
                document: object(
         
     | 
| 
       27 
     | 
    
         
            -
                    :id, :title
         
     | 
| 
      
 29 
     | 
    
         
            +
                    :id, :title,
         
     | 
| 
       28 
30 
     | 
    
         | 
| 
       29 
31 
     | 
    
         
             
                    owner: _.nullable.object(:id, :name),
         
     | 
| 
       30 
32 
     | 
    
         
             
                    authors: _.each.object(:id, :name),
         
     | 
    
        data/babl.gemspec
    CHANGED
    
    
    
        data/lib/babl/nodes/dep.rb
    CHANGED
    
    
    
        data/lib/babl/nodes/each.rb
    CHANGED
    
    | 
         @@ -1,10 +1,10 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            require 'babl/schema/dyn_array'
         
     | 
| 
       2 
2 
     | 
    
         
             
            require 'babl/errors'
         
     | 
| 
       3 
     | 
    
         
            -
            require ' 
     | 
| 
      
 3 
     | 
    
         
            +
            require 'babl/utils/value'
         
     | 
| 
       4 
4 
     | 
    
         | 
| 
       5 
5 
     | 
    
         
             
            module Babl
         
     | 
| 
       6 
6 
     | 
    
         
             
                module Nodes
         
     | 
| 
       7 
     | 
    
         
            -
                    class Each < ::Value.new(:node)
         
     | 
| 
      
 7 
     | 
    
         
            +
                    class Each < Utils::Value.new(:node)
         
     | 
| 
       8 
8 
     | 
    
         
             
                        def dependencies
         
     | 
| 
       9 
9 
     | 
    
         
             
                            { __each__: node.dependencies }
         
     | 
| 
       10 
10 
     | 
    
         
             
                        end
         
     | 
| 
         @@ -1,10 +1,10 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            require 'babl/utils/hash'
         
     | 
| 
       2 
2 
     | 
    
         
             
            require 'babl/schema/fixed_array'
         
     | 
| 
       3 
     | 
    
         
            -
            require ' 
     | 
| 
      
 3 
     | 
    
         
            +
            require 'babl/utils/value'
         
     | 
| 
       4 
4 
     | 
    
         | 
| 
       5 
5 
     | 
    
         
             
            module Babl
         
     | 
| 
       6 
6 
     | 
    
         
             
                module Nodes
         
     | 
| 
       7 
     | 
    
         
            -
                    class FixedArray < ::Value.new(:nodes)
         
     | 
| 
      
 7 
     | 
    
         
            +
                    class FixedArray < Utils::Value.new(:nodes)
         
     | 
| 
       8 
8 
     | 
    
         
             
                        def schema
         
     | 
| 
       9 
9 
     | 
    
         
             
                            Schema::FixedArray.new(nodes.map(&:schema))
         
     | 
| 
       10 
10 
     | 
    
         
             
                        end
         
     | 
    
        data/lib/babl/nodes/goto_pin.rb
    CHANGED
    
    
    
        data/lib/babl/nodes/merge.rb
    CHANGED
    
    | 
         @@ -1,10 +1,10 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            require 'babl/utils/hash'
         
     | 
| 
       2 
2 
     | 
    
         
             
            require 'babl/errors'
         
     | 
| 
       3 
     | 
    
         
            -
            require ' 
     | 
| 
      
 3 
     | 
    
         
            +
            require 'babl/utils/value'
         
     | 
| 
       4 
4 
     | 
    
         | 
| 
       5 
5 
     | 
    
         
             
            module Babl
         
     | 
| 
       6 
6 
     | 
    
         
             
                module Nodes
         
     | 
| 
       7 
     | 
    
         
            -
                    class Merge < ::Value.new(:nodes)
         
     | 
| 
      
 7 
     | 
    
         
            +
                    class Merge < Utils::Value.new(:nodes)
         
     | 
| 
       8 
8 
     | 
    
         
             
                        def dependencies
         
     | 
| 
       9 
9 
     | 
    
         
             
                            nodes.map(&:dependencies).reduce({}) { |a, b| Babl::Utils::Hash.deep_merge(a, b) }
         
     | 
| 
       10 
10 
     | 
    
         
             
                        end
         
     | 
| 
         @@ -64,7 +64,7 @@ module Babl 
     | 
|
| 
       64 
64 
     | 
    
         
             
                                .map do |name, properties|
         
     | 
| 
       65 
65 
     | 
    
         
             
                                Schema::Object::Property.new(
         
     | 
| 
       66 
66 
     | 
    
         
             
                                    name,
         
     | 
| 
       67 
     | 
    
         
            -
                                    Schema::AnyOf. 
     | 
| 
      
 67 
     | 
    
         
            +
                                    Schema::AnyOf.canonicalized(properties.map(&:value)),
         
     | 
| 
       68 
68 
     | 
    
         
             
                                    properties.size == all_docs.size && properties.all?(&:required)
         
     | 
| 
       69 
69 
     | 
    
         
             
                                )
         
     | 
| 
       70 
70 
     | 
    
         
             
                            end
         
     | 
| 
         @@ -89,7 +89,7 @@ module Babl 
     | 
|
| 
       89 
89 
     | 
    
         
             
                        def allow_anything(property)
         
     | 
| 
       90 
90 
     | 
    
         
             
                            Schema::Object::Property.new(
         
     | 
| 
       91 
91 
     | 
    
         
             
                                property.name,
         
     | 
| 
       92 
     | 
    
         
            -
                                Schema::AnyOf. 
     | 
| 
      
 92 
     | 
    
         
            +
                                Schema::AnyOf.canonicalized([property.value, Schema::Anything.instance]),
         
     | 
| 
       93 
93 
     | 
    
         
             
                                property.required
         
     | 
| 
       94 
94 
     | 
    
         
             
                            )
         
     | 
| 
       95 
95 
     | 
    
         
             
                        end
         
     | 
    
        data/lib/babl/nodes/nav.rb
    CHANGED
    
    
    
        data/lib/babl/nodes/object.rb
    CHANGED
    
    | 
         @@ -1,10 +1,10 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            require 'babl/utils/hash'
         
     | 
| 
       2 
2 
     | 
    
         
             
            require 'babl/schema/object'
         
     | 
| 
       3 
     | 
    
         
            -
            require ' 
     | 
| 
      
 3 
     | 
    
         
            +
            require 'babl/utils/value'
         
     | 
| 
       4 
4 
     | 
    
         | 
| 
       5 
5 
     | 
    
         
             
            module Babl
         
     | 
| 
       6 
6 
     | 
    
         
             
                module Nodes
         
     | 
| 
       7 
     | 
    
         
            -
                    class Object < ::Value.new(:nodes)
         
     | 
| 
      
 7 
     | 
    
         
            +
                    class Object < Utils::Value.new(:nodes)
         
     | 
| 
       8 
8 
     | 
    
         
             
                        def dependencies
         
     | 
| 
       9 
9 
     | 
    
         
             
                            nodes.values.map(&:dependencies).reduce({}) { |a, b| Babl::Utils::Hash.deep_merge(a, b) }
         
     | 
| 
       10 
10 
     | 
    
         
             
                        end
         
     | 
    
        data/lib/babl/nodes/parent.rb
    CHANGED
    
    | 
         @@ -1,13 +1,13 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            require 'babl/utils/ref'
         
     | 
| 
       2 
2 
     | 
    
         
             
            require 'babl/errors'
         
     | 
| 
       3 
     | 
    
         
            -
            require ' 
     | 
| 
      
 3 
     | 
    
         
            +
            require 'babl/utils/value'
         
     | 
| 
       4 
4 
     | 
    
         | 
| 
       5 
5 
     | 
    
         
             
            module Babl
         
     | 
| 
       6 
6 
     | 
    
         
             
                module Nodes
         
     | 
| 
       7 
     | 
    
         
            -
                    class Parent < ::Value.new(:node)
         
     | 
| 
      
 7 
     | 
    
         
            +
                    class Parent < Utils::Value.new(:node)
         
     | 
| 
       8 
8 
     | 
    
         
             
                        PARENT_MARKER = Utils::Ref.new
         
     | 
| 
       9 
9 
     | 
    
         | 
| 
       10 
     | 
    
         
            -
                        class Resolver < ::Value.new(:node)
         
     | 
| 
      
 10 
     | 
    
         
            +
                        class Resolver < Utils::Value.new(:node)
         
     | 
| 
       11 
11 
     | 
    
         
             
                            def dependencies
         
     | 
| 
       12 
12 
     | 
    
         
             
                                backpropagate_dependencies(node.dependencies)
         
     | 
| 
       13 
13 
     | 
    
         
             
                            end
         
     | 
    
        data/lib/babl/nodes/static.rb
    CHANGED
    
    | 
         @@ -1,10 +1,10 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            require 'babl/nodes/terminal_value'
         
     | 
| 
       2 
2 
     | 
    
         
             
            require 'babl/schema/static'
         
     | 
| 
       3 
     | 
    
         
            -
            require ' 
     | 
| 
      
 3 
     | 
    
         
            +
            require 'babl/utils/value'
         
     | 
| 
       4 
4 
     | 
    
         | 
| 
       5 
5 
     | 
    
         
             
            module Babl
         
     | 
| 
       6 
6 
     | 
    
         
             
                module Nodes
         
     | 
| 
       7 
     | 
    
         
            -
                    class Static < ::Value.new(:value)
         
     | 
| 
      
 7 
     | 
    
         
            +
                    class Static < Utils::Value.new(:value)
         
     | 
| 
       8 
8 
     | 
    
         
             
                        def schema
         
     | 
| 
       9 
9 
     | 
    
         
             
                            Schema::Static.new(value)
         
     | 
| 
       10 
10 
     | 
    
         
             
                        end
         
     | 
    
        data/lib/babl/nodes/switch.rb
    CHANGED
    
    | 
         @@ -1,11 +1,11 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            require 'babl/utils/hash'
         
     | 
| 
       2 
2 
     | 
    
         
             
            require 'babl/schema/any_of'
         
     | 
| 
       3 
3 
     | 
    
         
             
            require 'babl/errors'
         
     | 
| 
       4 
     | 
    
         
            -
            require ' 
     | 
| 
      
 4 
     | 
    
         
            +
            require 'babl/utils/value'
         
     | 
| 
       5 
5 
     | 
    
         | 
| 
       6 
6 
     | 
    
         
             
            module Babl
         
     | 
| 
       7 
7 
     | 
    
         
             
                module Nodes
         
     | 
| 
       8 
     | 
    
         
            -
                    class Switch < ::Value.new(:nodes)
         
     | 
| 
      
 8 
     | 
    
         
            +
                    class Switch < Utils::Value.new(:nodes)
         
     | 
| 
       9 
9 
     | 
    
         
             
                        def dependencies
         
     | 
| 
       10 
10 
     | 
    
         
             
                            (nodes.values + nodes.keys).map(&:dependencies)
         
     | 
| 
       11 
11 
     | 
    
         
             
                                .reduce({}) { |a, b| Babl::Utils::Hash.deep_merge(a, b) }
         
     | 
| 
         @@ -17,7 +17,7 @@ module Babl 
     | 
|
| 
       17 
17 
     | 
    
         
             
                        end
         
     | 
| 
       18 
18 
     | 
    
         | 
| 
       19 
19 
     | 
    
         
             
                        def schema
         
     | 
| 
       20 
     | 
    
         
            -
                            Schema::AnyOf. 
     | 
| 
      
 20 
     | 
    
         
            +
                            Schema::AnyOf.canonicalized(nodes.values.map(&:schema))
         
     | 
| 
       21 
21 
     | 
    
         
             
                        end
         
     | 
| 
       22 
22 
     | 
    
         | 
| 
       23 
23 
     | 
    
         
             
                        def render(ctx)
         
     | 
    
        data/lib/babl/nodes/typed.rb
    CHANGED
    
    | 
         @@ -1,13 +1,15 @@ 
     | 
|
| 
       1 
     | 
    
         
            -
            require ' 
     | 
| 
      
 1 
     | 
    
         
            +
            require 'babl/utils/value'
         
     | 
| 
       2 
2 
     | 
    
         
             
            require 'babl/schema/typed'
         
     | 
| 
       3 
3 
     | 
    
         | 
| 
       4 
4 
     | 
    
         
             
            module Babl
         
     | 
| 
       5 
5 
     | 
    
         
             
                module Nodes
         
     | 
| 
       6 
     | 
    
         
            -
                    class Typed < ::Value.new(: 
     | 
| 
       7 
     | 
    
         
            -
                         
     | 
| 
       8 
     | 
    
         
            -
             
     | 
| 
       9 
     | 
    
         
            -
                         
     | 
| 
       10 
     | 
    
         
            -
                         
     | 
| 
      
 6 
     | 
    
         
            +
                    class Typed < Utils::Value.new(:schema, :node)
         
     | 
| 
      
 7 
     | 
    
         
            +
                        CURRIED = method(:new).curry(2)
         
     | 
| 
      
 8 
     | 
    
         
            +
             
     | 
| 
      
 9 
     | 
    
         
            +
                        BOOLEAN = CURRIED.call(Schema::Typed::BOOLEAN)
         
     | 
| 
      
 10 
     | 
    
         
            +
                        INTEGER = CURRIED.call(Schema::Typed::INTEGER)
         
     | 
| 
      
 11 
     | 
    
         
            +
                        NUMBER = CURRIED.call(Schema::Typed::NUMBER)
         
     | 
| 
      
 12 
     | 
    
         
            +
                        STRING = CURRIED.call(Schema::Typed::STRING)
         
     | 
| 
       11 
13 
     | 
    
         | 
| 
       12 
14 
     | 
    
         
             
                        def dependencies
         
     | 
| 
       13 
15 
     | 
    
         
             
                            node.dependencies
         
     | 
| 
         @@ -19,10 +21,8 @@ module Babl 
     | 
|
| 
       19 
21 
     | 
    
         | 
| 
       20 
22 
     | 
    
         
             
                        def render(ctx)
         
     | 
| 
       21 
23 
     | 
    
         
             
                            value = node.render(ctx)
         
     | 
| 
       22 
     | 
    
         
            -
                             
     | 
| 
       23 
     | 
    
         
            -
             
     | 
| 
       24 
     | 
    
         
            -
                            end
         
     | 
| 
       25 
     | 
    
         
            -
                            value
         
     | 
| 
      
 24 
     | 
    
         
            +
                            return value if schema.classes.any? { |clazz| clazz === value }
         
     | 
| 
      
 25 
     | 
    
         
            +
                            raise Errors::RenderingError, "Expected type '#{schema.type}': #{value}\n#{ctx.formatted_stack}"
         
     | 
| 
       26 
26 
     | 
    
         
             
                        end
         
     | 
| 
       27 
27 
     | 
    
         | 
| 
       28 
28 
     | 
    
         
             
                        private
         
     | 
    
        data/lib/babl/nodes/with.rb
    CHANGED
    
    
| 
         @@ -1,10 +1,10 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            require 'oj'
         
     | 
| 
       2 
2 
     | 
    
         
             
            require 'babl/rendering/context'
         
     | 
| 
       3 
     | 
    
         
            -
            require ' 
     | 
| 
      
 3 
     | 
    
         
            +
            require 'babl/utils/value'
         
     | 
| 
       4 
4 
     | 
    
         | 
| 
       5 
5 
     | 
    
         
             
            module Babl
         
     | 
| 
       6 
6 
     | 
    
         
             
                module Rendering
         
     | 
| 
       7 
     | 
    
         
            -
                    class CompiledTemplate < ::Value.new(:node, :dependencies, :preloader, :pretty, :json_schema)
         
     | 
| 
      
 7 
     | 
    
         
            +
                    class CompiledTemplate < Utils::Value.new(:node, :dependencies, :preloader, :pretty, :json_schema)
         
     | 
| 
       8 
8 
     | 
    
         
             
                        def json(root)
         
     | 
| 
       9 
9 
     | 
    
         
             
                            data = render(root)
         
     | 
| 
       10 
10 
     | 
    
         
             
                            ::Oj.dump(data, indent: pretty ? 4 : 0, mode: :strict)
         
     | 
    
        data/lib/babl/schema/any_of.rb
    CHANGED
    
    | 
         @@ -1,11 +1,11 @@ 
     | 
|
| 
       1 
     | 
    
         
            -
            require ' 
     | 
| 
      
 1 
     | 
    
         
            +
            require 'babl/utils/value'
         
     | 
| 
       2 
2 
     | 
    
         
             
            require 'set'
         
     | 
| 
       3 
3 
     | 
    
         
             
            require 'babl/schema/static'
         
     | 
| 
       4 
4 
     | 
    
         
             
            require 'babl/schema/object'
         
     | 
| 
       5 
5 
     | 
    
         | 
| 
       6 
6 
     | 
    
         
             
            module Babl
         
     | 
| 
       7 
7 
     | 
    
         
             
                module Schema
         
     | 
| 
       8 
     | 
    
         
            -
                    class AnyOf < ::Value.new(:choice_set)
         
     | 
| 
      
 8 
     | 
    
         
            +
                    class AnyOf < Utils::Value.new(:choice_set)
         
     | 
| 
       9 
9 
     | 
    
         
             
                        attr_reader :choices
         
     | 
| 
       10 
10 
     | 
    
         | 
| 
       11 
11 
     | 
    
         
             
                        def initialize(choices)
         
     | 
| 
         @@ -22,6 +22,8 @@ module Babl 
     | 
|
| 
       22 
22 
     | 
    
         
             
                        # schema.
         
     | 
| 
       23 
23 
     | 
    
         
             
                        def simplify
         
     | 
| 
       24 
24 
     | 
    
         
             
                            simplify_single ||
         
     | 
| 
      
 25 
     | 
    
         
            +
                                simplify_boolean ||
         
     | 
| 
      
 26 
     | 
    
         
            +
                                simplify_typed_and_static ||
         
     | 
| 
       25 
27 
     | 
    
         
             
                                simplify_nullability ||
         
     | 
| 
       26 
28 
     | 
    
         
             
                                simplify_empty_array ||
         
     | 
| 
       27 
29 
     | 
    
         
             
                                simplify_push_down_dyn_array ||
         
     | 
| 
         @@ -30,7 +32,7 @@ module Babl 
     | 
|
| 
       30 
32 
     | 
    
         
             
                                self
         
     | 
| 
       31 
33 
     | 
    
         
             
                        end
         
     | 
| 
       32 
34 
     | 
    
         | 
| 
       33 
     | 
    
         
            -
                        def self. 
     | 
| 
      
 35 
     | 
    
         
            +
                        def self.canonicalized(choices)
         
     | 
| 
       34 
36 
     | 
    
         
             
                            new(choices).simplify
         
     | 
| 
       35 
37 
     | 
    
         
             
                        end
         
     | 
| 
       36 
38 
     | 
    
         | 
| 
         @@ -41,20 +43,44 @@ module Babl 
     | 
|
| 
       41 
43 
     | 
    
         
             
                            choices.size == 1 ? choices.first : nil
         
     | 
| 
       42 
44 
     | 
    
         
             
                        end
         
     | 
| 
       43 
45 
     | 
    
         | 
| 
       44 
     | 
    
         
            -
                        #  
     | 
| 
      
 46 
     | 
    
         
            +
                        # Anything is nullable, so AnyOf[null, Anything] can be replaced by Anything
         
     | 
| 
      
 47 
     | 
    
         
            +
                        # (in general, everything can be merged into Anything but I decided not to do it in order
         
     | 
| 
      
 48 
     | 
    
         
            +
                        # to retain as much information as possible)
         
     | 
| 
       45 
49 
     | 
    
         
             
                        def simplify_nullability
         
     | 
| 
       46 
     | 
    
         
            -
                             
     | 
| 
      
 50 
     | 
    
         
            +
                            return unless choice_set.include?(Static::NULL) && choice_set.include?(Anything.instance)
         
     | 
| 
      
 51 
     | 
    
         
            +
                            AnyOf.canonicalized(choice_set - [Static::NULL])
         
     | 
| 
      
 52 
     | 
    
         
            +
                        end
         
     | 
| 
      
 53 
     | 
    
         
            +
             
     | 
| 
      
 54 
     | 
    
         
            +
                        # AnyOf[true, false] is just boolean
         
     | 
| 
      
 55 
     | 
    
         
            +
                        def simplify_boolean
         
     | 
| 
      
 56 
     | 
    
         
            +
                            return unless choice_set.include?(Static::TRUE) && choice_set.include?(Static::FALSE)
         
     | 
| 
      
 57 
     | 
    
         
            +
                            AnyOf.canonicalized(choice_set - [Static::TRUE, Static::FALSE] + [Typed::BOOLEAN])
         
     | 
| 
      
 58 
     | 
    
         
            +
                        end
         
     | 
| 
      
 59 
     | 
    
         
            +
             
     | 
| 
      
 60 
     | 
    
         
            +
                        # AnyOf[string, 'a string instance', 'another string'] is just string
         
     | 
| 
      
 61 
     | 
    
         
            +
                        # AnyOf[boolean, true, false] is just boolean
         
     | 
| 
      
 62 
     | 
    
         
            +
                        # AnyOf[number, 2, 3.1] is just number
         
     | 
| 
      
 63 
     | 
    
         
            +
                        # AnyOf[integer, 2, 1] is just integer
         
     | 
| 
      
 64 
     | 
    
         
            +
                        def simplify_typed_and_static
         
     | 
| 
      
 65 
     | 
    
         
            +
                            choices.each do |typed|
         
     | 
| 
      
 66 
     | 
    
         
            +
                                next unless Typed === typed
         
     | 
| 
      
 67 
     | 
    
         
            +
                                instances = choices.select { |instance|
         
     | 
| 
      
 68 
     | 
    
         
            +
                                    Static === instance && typed.classes.any? { |clazz| clazz === instance.value }
         
     | 
| 
      
 69 
     | 
    
         
            +
                                }
         
     | 
| 
      
 70 
     | 
    
         
            +
                                next if instances.empty?
         
     | 
| 
      
 71 
     | 
    
         
            +
                                return AnyOf.canonicalized(choice_set - instances)
         
     | 
| 
      
 72 
     | 
    
         
            +
                            end
         
     | 
| 
      
 73 
     | 
    
         
            +
                            nil
         
     | 
| 
       47 
74 
     | 
    
         
             
                        end
         
     | 
| 
       48 
75 
     | 
    
         | 
| 
       49 
76 
     | 
    
         
             
                        # An always empty FixedArray is just a special case of a DynArray
         
     | 
| 
       50 
77 
     | 
    
         
             
                        # We can get rid of the former and only keep the DynArray
         
     | 
| 
       51 
78 
     | 
    
         
             
                        def simplify_empty_array
         
     | 
| 
       52 
     | 
    
         
            -
                            return unless  
     | 
| 
       53 
     | 
    
         
            -
                             
     | 
| 
       54 
     | 
    
         
            -
                            others.each do |other|
         
     | 
| 
      
 79 
     | 
    
         
            +
                            return unless choice_set.include?(FixedArray::EMPTY)
         
     | 
| 
      
 80 
     | 
    
         
            +
                            choice_set.each do |other|
         
     | 
| 
       55 
81 
     | 
    
         
             
                                next unless DynArray === other
         
     | 
| 
       56 
82 
     | 
    
         
             
                                new_other = DynArray.new(other.item)
         
     | 
| 
       57 
     | 
    
         
            -
                                return AnyOf. 
     | 
| 
      
 83 
     | 
    
         
            +
                                return AnyOf.canonicalized(choice_set - [other, FixedArray::EMPTY] + [new_other])
         
     | 
| 
       58 
84 
     | 
    
         
             
                            end
         
     | 
| 
       59 
85 
     | 
    
         
             
                            nil
         
     | 
| 
       60 
86 
     | 
    
         
             
                        end
         
     | 
| 
         @@ -63,12 +89,13 @@ module Babl 
     | 
|
| 
       63 
89 
     | 
    
         
             
                        # removed.
         
     | 
| 
       64 
90 
     | 
    
         
             
                        def simplify_dyn_and_fixed_array
         
     | 
| 
       65 
91 
     | 
    
         
             
                            fixed_arrays = choices.select { |s| FixedArray === s && s.items.uniq.size == 1 }
         
     | 
| 
      
 92 
     | 
    
         
            +
                            return if fixed_arrays.empty?
         
     | 
| 
       66 
93 
     | 
    
         | 
| 
       67 
94 
     | 
    
         
             
                            choices.each do |dyn|
         
     | 
| 
       68 
95 
     | 
    
         
             
                                next unless DynArray === dyn
         
     | 
| 
       69 
96 
     | 
    
         
             
                                fixed_arrays.each do |fixed|
         
     | 
| 
       70 
97 
     | 
    
         
             
                                    new_dyn = DynArray.new(dyn.item)
         
     | 
| 
       71 
     | 
    
         
            -
                                    return AnyOf. 
     | 
| 
      
 98 
     | 
    
         
            +
                                    return AnyOf.canonicalized(choice_set - [fixed, dyn] + [new_dyn]) if dyn.item == fixed.items.first
         
     | 
| 
       72 
99 
     | 
    
         
             
                                end
         
     | 
| 
       73 
100 
     | 
    
         
             
                            end
         
     | 
| 
       74 
101 
     | 
    
         | 
| 
         @@ -79,11 +106,15 @@ module Babl 
     | 
|
| 
       79 
106 
     | 
    
         
             
                        # having a different type, then AnyOf can be pushed down to this property.
         
     | 
| 
       80 
107 
     | 
    
         
             
                        def simplify_many_objects_only_one_difference
         
     | 
| 
       81 
108 
     | 
    
         
             
                            choices.each_with_index { |obj1, index1|
         
     | 
| 
      
 109 
     | 
    
         
            +
                                next unless Object === obj1
         
     | 
| 
      
 110 
     | 
    
         
            +
             
     | 
| 
       82 
111 
     | 
    
         
             
                                choices.each_with_index { |obj2, index2|
         
     | 
| 
       83 
     | 
    
         
            -
                                     
     | 
| 
       84 
     | 
    
         
            -
             
     | 
| 
       85 
     | 
    
         
            -
                                    next unless  
     | 
| 
       86 
     | 
    
         
            -
                                             
     | 
| 
      
 112 
     | 
    
         
            +
                                    break if index2 >= index1
         
     | 
| 
      
 113 
     | 
    
         
            +
             
     | 
| 
      
 114 
     | 
    
         
            +
                                    next unless Object === obj2 &&
         
     | 
| 
      
 115 
     | 
    
         
            +
                                            obj1.additional == obj2.additional &&
         
     | 
| 
      
 116 
     | 
    
         
            +
                                            obj1.properties.map { |p| [p.name, p.required] }.to_set ==
         
     | 
| 
      
 117 
     | 
    
         
            +
                                                    obj2.properties.map { |p| [p.name, p.required] }.to_set
         
     | 
| 
       87 
118 
     | 
    
         | 
| 
       88 
119 
     | 
    
         
             
                                    diff1 = obj1.properties - obj2.properties
         
     | 
| 
       89 
120 
     | 
    
         
             
                                    diff2 = obj2.properties - obj1.properties
         
     | 
| 
         @@ -95,14 +126,14 @@ module Babl 
     | 
|
| 
       95 
126 
     | 
    
         
             
                                            next property unless property == diff1.first
         
     | 
| 
       96 
127 
     | 
    
         
             
                                            Object::Property.new(
         
     | 
| 
       97 
128 
     | 
    
         
             
                                                property.name,
         
     | 
| 
       98 
     | 
    
         
            -
                                                AnyOf. 
     | 
| 
      
 129 
     | 
    
         
            +
                                                AnyOf.canonicalized([diff1.first.value, diff2.first.value]),
         
     | 
| 
       99 
130 
     | 
    
         
             
                                                property.required
         
     | 
| 
       100 
131 
     | 
    
         
             
                                            )
         
     | 
| 
       101 
132 
     | 
    
         
             
                                        },
         
     | 
| 
       102 
133 
     | 
    
         
             
                                        obj1.additional
         
     | 
| 
       103 
134 
     | 
    
         
             
                                    )
         
     | 
| 
       104 
135 
     | 
    
         | 
| 
       105 
     | 
    
         
            -
                                    return AnyOf. 
     | 
| 
      
 136 
     | 
    
         
            +
                                    return AnyOf.canonicalized(choice_set - [obj1, obj2] + [merged])
         
     | 
| 
       106 
137 
     | 
    
         
             
                                }
         
     | 
| 
       107 
138 
     | 
    
         
             
                            }
         
     | 
| 
       108 
139 
     | 
    
         | 
| 
         @@ -112,11 +143,12 @@ module Babl 
     | 
|
| 
       112 
143 
     | 
    
         
             
                        # Push down the AnyOf to the item if all outputs are of type DynArray
         
     | 
| 
       113 
144 
     | 
    
         
             
                        def simplify_push_down_dyn_array
         
     | 
| 
       114 
145 
     | 
    
         
             
                            choices.each_with_index { |arr1, index1|
         
     | 
| 
      
 146 
     | 
    
         
            +
                                next unless DynArray === arr1
         
     | 
| 
       115 
147 
     | 
    
         
             
                                choices.each_with_index { |arr2, index2|
         
     | 
| 
       116 
     | 
    
         
            -
                                     
     | 
| 
       117 
     | 
    
         
            -
                                    next unless DynArray ===  
     | 
| 
       118 
     | 
    
         
            -
                                    new_arr = DynArray.new(AnyOf. 
     | 
| 
       119 
     | 
    
         
            -
                                    return AnyOf. 
     | 
| 
      
 148 
     | 
    
         
            +
                                    break if index2 >= index1
         
     | 
| 
      
 149 
     | 
    
         
            +
                                    next unless DynArray === arr2
         
     | 
| 
      
 150 
     | 
    
         
            +
                                    new_arr = DynArray.new(AnyOf.canonicalized([arr1.item, arr2.item]))
         
     | 
| 
      
 151 
     | 
    
         
            +
                                    return AnyOf.canonicalized(choice_set - [arr1, arr2] + [new_arr])
         
     | 
| 
       120 
152 
     | 
    
         
             
                                }
         
     | 
| 
       121 
153 
     | 
    
         
             
                            }
         
     | 
| 
       122 
154 
     | 
    
         
             
                            nil
         
     | 
    
        data/lib/babl/schema/object.rb
    CHANGED
    
    | 
         @@ -1,9 +1,9 @@ 
     | 
|
| 
       1 
     | 
    
         
            -
            require ' 
     | 
| 
      
 1 
     | 
    
         
            +
            require 'babl/utils/value'
         
     | 
| 
       2 
2 
     | 
    
         
             
            require 'set'
         
     | 
| 
       3 
3 
     | 
    
         | 
| 
       4 
4 
     | 
    
         
             
            module Babl
         
     | 
| 
       5 
5 
     | 
    
         
             
                module Schema
         
     | 
| 
       6 
     | 
    
         
            -
                    class Object < ::Value.new(:property_set, :additional)
         
     | 
| 
      
 6 
     | 
    
         
            +
                    class Object < Utils::Value.new(:property_set, :additional)
         
     | 
| 
       7 
7 
     | 
    
         
             
                        attr_reader :properties
         
     | 
| 
       8 
8 
     | 
    
         | 
| 
       9 
9 
     | 
    
         
             
                        def initialize(properties, additional)
         
     | 
| 
         @@ -14,7 +14,7 @@ module Babl 
     | 
|
| 
       14 
14 
     | 
    
         
             
                        EMPTY = new([], false)
         
     | 
| 
       15 
15 
     | 
    
         
             
                        EMPTY_WITH_ADDITIONAL = new([], true)
         
     | 
| 
       16 
16 
     | 
    
         | 
| 
       17 
     | 
    
         
            -
                        class Property < ::Value.new(:name, :value, :required)
         
     | 
| 
      
 17 
     | 
    
         
            +
                        class Property < Utils::Value.new(:name, :value, :required)
         
     | 
| 
       18 
18 
     | 
    
         
             
                            def initialize(name, value, required)
         
     | 
| 
       19 
19 
     | 
    
         
             
                                super(name, value, required)
         
     | 
| 
       20 
20 
     | 
    
         
             
                            end
         
     | 
    
        data/lib/babl/schema/static.rb
    CHANGED
    
    | 
         @@ -1,9 +1,11 @@ 
     | 
|
| 
       1 
     | 
    
         
            -
            require ' 
     | 
| 
      
 1 
     | 
    
         
            +
            require 'babl/utils/value'
         
     | 
| 
       2 
2 
     | 
    
         | 
| 
       3 
3 
     | 
    
         
             
            module Babl
         
     | 
| 
       4 
4 
     | 
    
         
             
                module Schema
         
     | 
| 
       5 
     | 
    
         
            -
                    class Static < ::Value.new(:value)
         
     | 
| 
      
 5 
     | 
    
         
            +
                    class Static < Utils::Value.new(:value)
         
     | 
| 
       6 
6 
     | 
    
         
             
                        NULL = new(nil)
         
     | 
| 
      
 7 
     | 
    
         
            +
                        TRUE = new(true)
         
     | 
| 
      
 8 
     | 
    
         
            +
                        FALSE = new(false)
         
     | 
| 
       7 
9 
     | 
    
         | 
| 
       8 
10 
     | 
    
         
             
                        def json
         
     | 
| 
       9 
11 
     | 
    
         
             
                            return { type: 'null' } if value.nil?
         
     | 
    
        data/lib/babl/schema/typed.rb
    CHANGED
    
    | 
         @@ -1,12 +1,12 @@ 
     | 
|
| 
       1 
     | 
    
         
            -
            require ' 
     | 
| 
      
 1 
     | 
    
         
            +
            require 'babl/utils/value'
         
     | 
| 
       2 
2 
     | 
    
         | 
| 
       3 
3 
     | 
    
         
             
            module Babl
         
     | 
| 
       4 
4 
     | 
    
         
             
                module Schema
         
     | 
| 
       5 
     | 
    
         
            -
                    class Typed < ::Value.new(:type)
         
     | 
| 
       6 
     | 
    
         
            -
                        INTEGER = new('integer')
         
     | 
| 
       7 
     | 
    
         
            -
                        BOOLEAN = new('boolean')
         
     | 
| 
       8 
     | 
    
         
            -
                        NUMBER = new('number')
         
     | 
| 
       9 
     | 
    
         
            -
                        STRING = new('string')
         
     | 
| 
      
 5 
     | 
    
         
            +
                    class Typed < Utils::Value.new(:type, :classes)
         
     | 
| 
      
 6 
     | 
    
         
            +
                        INTEGER = new('integer', [::Integer])
         
     | 
| 
      
 7 
     | 
    
         
            +
                        BOOLEAN = new('boolean', [::TrueClass, ::FalseClass])
         
     | 
| 
      
 8 
     | 
    
         
            +
                        NUMBER = new('number', [::Numeric])
         
     | 
| 
      
 9 
     | 
    
         
            +
                        STRING = new('string', [::String])
         
     | 
| 
       10 
10 
     | 
    
         | 
| 
       11 
11 
     | 
    
         
             
                        def json
         
     | 
| 
       12 
12 
     | 
    
         
             
                            { type: type }
         
     | 
| 
         @@ -0,0 +1,37 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            module Babl
         
     | 
| 
      
 2 
     | 
    
         
            +
                module Utils
         
     | 
| 
      
 3 
     | 
    
         
            +
                    # Construct deeply immutable value objects
         
     | 
| 
      
 4 
     | 
    
         
            +
                    # Similar to Struct, but:
         
     | 
| 
      
 5 
     | 
    
         
            +
                    # - Properties are assumed deeply immutable (#hash is assumed constant)
         
     | 
| 
      
 6 
     | 
    
         
            +
                    # - Constructor requires all arguments
         
     | 
| 
      
 7 
     | 
    
         
            +
                    # - #== has the same meaning as #eql?
         
     | 
| 
      
 8 
     | 
    
         
            +
                    class Value
         
     | 
| 
      
 9 
     | 
    
         
            +
                        def self.new(*fields)
         
     | 
| 
      
 10 
     | 
    
         
            +
                            ::Class.new(::Struct.new(:_cached_hash, *fields)) do
         
     | 
| 
      
 11 
     | 
    
         
            +
                                field_aliases = ::Array.new(fields.size) { |i| "v#{i}" }
         
     | 
| 
      
 12 
     | 
    
         
            +
                                const_set(:FIELDS, fields.map(&:to_sym))
         
     | 
| 
      
 13 
     | 
    
         
            +
                                class_eval <<-RUBY
         
     | 
| 
      
 14 
     | 
    
         
            +
                                    def initialize(#{field_aliases.join(',')})
         
     | 
| 
      
 15 
     | 
    
         
            +
                                        super(#{['nil', field_aliases].join(',')})
         
     | 
| 
      
 16 
     | 
    
         
            +
                                        hash
         
     | 
| 
      
 17 
     | 
    
         
            +
                                        freeze
         
     | 
| 
      
 18 
     | 
    
         
            +
                                    end
         
     | 
| 
      
 19 
     | 
    
         
            +
             
     | 
| 
      
 20 
     | 
    
         
            +
                                    def hash
         
     | 
| 
      
 21 
     | 
    
         
            +
                                        self._cached_hash ||= super
         
     | 
| 
      
 22 
     | 
    
         
            +
                                    end
         
     | 
| 
      
 23 
     | 
    
         
            +
             
     | 
| 
      
 24 
     | 
    
         
            +
                                    def ==(other)
         
     | 
| 
      
 25 
     | 
    
         
            +
                                        eql?(other)
         
     | 
| 
      
 26 
     | 
    
         
            +
                                    end
         
     | 
| 
      
 27 
     | 
    
         
            +
             
     | 
| 
      
 28 
     | 
    
         
            +
                                    def self.with(hash = {})
         
     | 
| 
      
 29 
     | 
    
         
            +
                                        raise ::ArgumentError unless ::Hash === hash && (hash.keys - FIELDS).empty?
         
     | 
| 
      
 30 
     | 
    
         
            +
                                        new(*FIELDS.map { |f| hash.fetch(f) })
         
     | 
| 
      
 31 
     | 
    
         
            +
                                    end
         
     | 
| 
      
 32 
     | 
    
         
            +
                                RUBY
         
     | 
| 
      
 33 
     | 
    
         
            +
                            end
         
     | 
| 
      
 34 
     | 
    
         
            +
                        end
         
     | 
| 
      
 35 
     | 
    
         
            +
                    end
         
     | 
| 
      
 36 
     | 
    
         
            +
                end
         
     | 
| 
      
 37 
     | 
    
         
            +
            end
         
     | 
    
        data/lib/babl/version.rb
    CHANGED
    
    
    
        data/logo-babl.png
    ADDED
    
    | 
         Binary file 
     | 
| 
         @@ -113,9 +113,38 @@ describe Babl::Operators::Switch do 
     | 
|
| 
       113 
113 
     | 
    
         
             
                        it { expect(schema).to eq s_any_of(s_null, s_dyn_array(s_any_of(s_static('a'), s_static('c'), s_static('b')))) }
         
     | 
| 
       114 
114 
     | 
    
         
             
                    end
         
     | 
| 
       115 
115 
     | 
    
         | 
| 
      
 116 
     | 
    
         
            +
                    context 'switch between true and false' do
         
     | 
| 
      
 117 
     | 
    
         
            +
                        template { switch(1 => true, 2 => false) }
         
     | 
| 
      
 118 
     | 
    
         
            +
                        it { expect(schema).to eq s_boolean }
         
     | 
| 
      
 119 
     | 
    
         
            +
                    end
         
     | 
| 
      
 120 
     | 
    
         
            +
             
     | 
| 
      
 121 
     | 
    
         
            +
                    context 'switch between true and a string' do
         
     | 
| 
      
 122 
     | 
    
         
            +
                        template { switch(1 => true, 3 => string) }
         
     | 
| 
      
 123 
     | 
    
         
            +
                        it { expect(schema).to eq s_any_of(s_static(true), s_string) }
         
     | 
| 
      
 124 
     | 
    
         
            +
                    end
         
     | 
| 
      
 125 
     | 
    
         
            +
             
     | 
| 
      
 126 
     | 
    
         
            +
                    context 'switch between any string and a specific string' do
         
     | 
| 
      
 127 
     | 
    
         
            +
                        template { switch(1 => string, 3 => 'lol') }
         
     | 
| 
      
 128 
     | 
    
         
            +
                        it { expect(schema).to eq s_string }
         
     | 
| 
      
 129 
     | 
    
         
            +
                    end
         
     | 
| 
      
 130 
     | 
    
         
            +
             
     | 
| 
      
 131 
     | 
    
         
            +
                    context 'switch between any boolean and a specific boolean' do
         
     | 
| 
      
 132 
     | 
    
         
            +
                        template { switch(1 => boolean, 3 => true) }
         
     | 
| 
      
 133 
     | 
    
         
            +
                        it { expect(schema).to eq s_boolean }
         
     | 
| 
      
 134 
     | 
    
         
            +
                    end
         
     | 
| 
      
 135 
     | 
    
         
            +
             
     | 
| 
      
 136 
     | 
    
         
            +
                    context 'switch between a specific float, specific integer and any number' do
         
     | 
| 
      
 137 
     | 
    
         
            +
                        template { switch(1 => 1.2, 2 => 2, 3 => number) }
         
     | 
| 
      
 138 
     | 
    
         
            +
                        it { expect(schema).to eq s_number }
         
     | 
| 
      
 139 
     | 
    
         
            +
                    end
         
     | 
| 
      
 140 
     | 
    
         
            +
             
     | 
| 
      
 141 
     | 
    
         
            +
                    context 'switch between a specific float, specific integer and any integer' do
         
     | 
| 
      
 142 
     | 
    
         
            +
                        template { switch(1 => 1.2, 2 => 2, 3 => integer) }
         
     | 
| 
      
 143 
     | 
    
         
            +
                        it { expect(schema).to eq s_any_of(s_integer, s_static(1.2)) }
         
     | 
| 
      
 144 
     | 
    
         
            +
                    end
         
     | 
| 
      
 145 
     | 
    
         
            +
             
     | 
| 
       116 
146 
     | 
    
         
             
                    context 'with dependencies' do
         
     | 
| 
       117 
147 
     | 
    
         
             
                        template { nav(:test).switch(nav(:keke) => parent.nav(:lol)) }
         
     | 
| 
       118 
     | 
    
         
            -
             
     | 
| 
       119 
148 
     | 
    
         
             
                        it { expect(dependencies).to eq(test: { keke: {} }, lol: {}) }
         
     | 
| 
       120 
149 
     | 
    
         
             
                    end
         
     | 
| 
       121 
150 
     | 
    
         
             
                end
         
     | 
| 
         @@ -0,0 +1,54 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            require 'babl/utils/value'
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
            describe Babl::Utils::Value do
         
     | 
| 
      
 4 
     | 
    
         
            +
                let(:clazz) { described_class.new(:val1) }
         
     | 
| 
      
 5 
     | 
    
         
            +
                let(:inst1) { clazz.new([1]) }
         
     | 
| 
      
 6 
     | 
    
         
            +
                let(:inst2) { clazz.new([1]) }
         
     | 
| 
      
 7 
     | 
    
         
            +
             
     | 
| 
      
 8 
     | 
    
         
            +
                it { expect(inst1).to eq inst2 }
         
     | 
| 
      
 9 
     | 
    
         
            +
                it { expect(inst1).to eql inst2 }
         
     | 
| 
      
 10 
     | 
    
         
            +
                it { expect(inst1.hash).to eq inst2.hash }
         
     | 
| 
      
 11 
     | 
    
         
            +
             
     | 
| 
      
 12 
     | 
    
         
            +
                describe 'immutability' do
         
     | 
| 
      
 13 
     | 
    
         
            +
                    it { expect { inst1.val1 = 2 }.to raise_error ::RuntimeError }
         
     | 
| 
      
 14 
     | 
    
         
            +
                end
         
     | 
| 
      
 15 
     | 
    
         
            +
             
     | 
| 
      
 16 
     | 
    
         
            +
                describe 'test when not equal' do
         
     | 
| 
      
 17 
     | 
    
         
            +
                    before { inst2.val1 << 3 }
         
     | 
| 
      
 18 
     | 
    
         
            +
             
     | 
| 
      
 19 
     | 
    
         
            +
                    it { expect(inst1).not_to eq inst2 }
         
     | 
| 
      
 20 
     | 
    
         
            +
                    it { expect(inst1.hash).to eq inst2.hash }
         
     | 
| 
      
 21 
     | 
    
         
            +
                end
         
     | 
| 
      
 22 
     | 
    
         
            +
             
     | 
| 
      
 23 
     | 
    
         
            +
                describe 'use hash for equality test' do
         
     | 
| 
      
 24 
     | 
    
         
            +
                    let(:inst1dup) { inst1.dup }
         
     | 
| 
      
 25 
     | 
    
         
            +
             
     | 
| 
      
 26 
     | 
    
         
            +
                    it { expect(inst1dup).to eq inst1 }
         
     | 
| 
      
 27 
     | 
    
         
            +
             
     | 
| 
      
 28 
     | 
    
         
            +
                    context do
         
     | 
| 
      
 29 
     | 
    
         
            +
                        before { inst1dup._cached_hash = 42 }
         
     | 
| 
      
 30 
     | 
    
         
            +
                        it { expect(inst1dup).not_to eq inst1 }
         
     | 
| 
      
 31 
     | 
    
         
            +
                        it { expect(inst1dup).not_to eq inst2 }
         
     | 
| 
      
 32 
     | 
    
         
            +
                    end
         
     | 
| 
      
 33 
     | 
    
         
            +
                end
         
     | 
| 
      
 34 
     | 
    
         
            +
             
     | 
| 
      
 35 
     | 
    
         
            +
                describe 'ensure eql? behavior' do
         
     | 
| 
      
 36 
     | 
    
         
            +
                    let(:inst1) { clazz.new(1.0) }
         
     | 
| 
      
 37 
     | 
    
         
            +
                    let(:inst2) { clazz.new(1) }
         
     | 
| 
      
 38 
     | 
    
         
            +
             
     | 
| 
      
 39 
     | 
    
         
            +
                    it { expect(inst1).not_to eql inst2 }
         
     | 
| 
      
 40 
     | 
    
         
            +
                    it { expect(inst1).not_to eq inst2 }
         
     | 
| 
      
 41 
     | 
    
         
            +
                end
         
     | 
| 
      
 42 
     | 
    
         
            +
             
     | 
| 
      
 43 
     | 
    
         
            +
                describe 'no property' do
         
     | 
| 
      
 44 
     | 
    
         
            +
                    let(:clazz1) { described_class.new }
         
     | 
| 
      
 45 
     | 
    
         
            +
                    let(:clazz2) { described_class.new }
         
     | 
| 
      
 46 
     | 
    
         
            +
             
     | 
| 
      
 47 
     | 
    
         
            +
                    let(:clazz1_inst1) { clazz1.new }
         
     | 
| 
      
 48 
     | 
    
         
            +
                    let(:clazz1_inst2) { clazz1.new }
         
     | 
| 
      
 49 
     | 
    
         
            +
                    let(:clazz2_inst1) { clazz2.new }
         
     | 
| 
      
 50 
     | 
    
         
            +
             
     | 
| 
      
 51 
     | 
    
         
            +
                    it { expect(clazz1_inst1).to eq clazz1_inst2 }
         
     | 
| 
      
 52 
     | 
    
         
            +
                    it { expect(clazz1_inst1).not_to eq clazz2_inst1 }
         
     | 
| 
      
 53 
     | 
    
         
            +
                end
         
     | 
| 
      
 54 
     | 
    
         
            +
            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.2. 
     | 
| 
      
 4 
     | 
    
         
            +
              version: 0.2.3
         
     | 
| 
       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-07- 
     | 
| 
      
 11 
     | 
    
         
            +
            date: 2017-07-21 00:00:00.000000000 Z
         
     | 
| 
       12 
12 
     | 
    
         
             
            dependencies:
         
     | 
| 
       13 
13 
     | 
    
         
             
            - !ruby/object:Gem::Dependency
         
     | 
| 
       14 
14 
     | 
    
         
             
              name: pry
         
     | 
| 
         @@ -80,20 +80,6 @@ dependencies: 
     | 
|
| 
       80 
80 
     | 
    
         
             
                - - "~>"
         
     | 
| 
       81 
81 
     | 
    
         
             
                  - !ruby/object:Gem::Version
         
     | 
| 
       82 
82 
     | 
    
         
             
                    version: '3.0'
         
     | 
| 
       83 
     | 
    
         
            -
            - !ruby/object:Gem::Dependency
         
     | 
| 
       84 
     | 
    
         
            -
              name: values
         
     | 
| 
       85 
     | 
    
         
            -
              requirement: !ruby/object:Gem::Requirement
         
     | 
| 
       86 
     | 
    
         
            -
                requirements:
         
     | 
| 
       87 
     | 
    
         
            -
                - - "~>"
         
     | 
| 
       88 
     | 
    
         
            -
                  - !ruby/object:Gem::Version
         
     | 
| 
       89 
     | 
    
         
            -
                    version: '1.8'
         
     | 
| 
       90 
     | 
    
         
            -
              type: :runtime
         
     | 
| 
       91 
     | 
    
         
            -
              prerelease: false
         
     | 
| 
       92 
     | 
    
         
            -
              version_requirements: !ruby/object:Gem::Requirement
         
     | 
| 
       93 
     | 
    
         
            -
                requirements:
         
     | 
| 
       94 
     | 
    
         
            -
                - - "~>"
         
     | 
| 
       95 
     | 
    
         
            -
                  - !ruby/object:Gem::Version
         
     | 
| 
       96 
     | 
    
         
            -
                    version: '1.8'
         
     | 
| 
       97 
83 
     | 
    
         
             
            description: JSON templating on steroids
         
     | 
| 
       98 
84 
     | 
    
         
             
            email:
         
     | 
| 
       99 
85 
     | 
    
         
             
            - frederic.terrazzoni@gmail.com
         
     | 
| 
         @@ -164,7 +150,9 @@ files: 
     | 
|
| 
       164 
150 
     | 
    
         
             
            - lib/babl/template.rb
         
     | 
| 
       165 
151 
     | 
    
         
             
            - lib/babl/utils/hash.rb
         
     | 
| 
       166 
152 
     | 
    
         
             
            - lib/babl/utils/ref.rb
         
     | 
| 
      
 153 
     | 
    
         
            +
            - lib/babl/utils/value.rb
         
     | 
| 
       167 
154 
     | 
    
         
             
            - lib/babl/version.rb
         
     | 
| 
      
 155 
     | 
    
         
            +
            - logo-babl.png
         
     | 
| 
       168 
156 
     | 
    
         
             
            - spec/operators/array_spec.rb
         
     | 
| 
       169 
157 
     | 
    
         
             
            - spec/operators/call_spec.rb
         
     | 
| 
       170 
158 
     | 
    
         
             
            - spec/operators/continue_spec.rb
         
     | 
| 
         @@ -189,6 +177,7 @@ files: 
     | 
|
| 
       189 
177 
     | 
    
         
             
            - spec/spec_helper.rb
         
     | 
| 
       190 
178 
     | 
    
         
             
            - spec/spec_helper/operator_testing.rb
         
     | 
| 
       191 
179 
     | 
    
         
             
            - spec/spec_helper/schema_utils.rb
         
     | 
| 
      
 180 
     | 
    
         
            +
            - spec/utils/value_spec.rb
         
     | 
| 
       192 
181 
     | 
    
         
             
            homepage: https://github.com/getbannerman/babl
         
     | 
| 
       193 
182 
     | 
    
         
             
            licenses:
         
     | 
| 
       194 
183 
     | 
    
         
             
            - MIT
         
     | 
| 
         @@ -238,3 +227,4 @@ test_files: 
     | 
|
| 
       238 
227 
     | 
    
         
             
            - spec/spec_helper.rb
         
     | 
| 
       239 
228 
     | 
    
         
             
            - spec/spec_helper/operator_testing.rb
         
     | 
| 
       240 
229 
     | 
    
         
             
            - spec/spec_helper/schema_utils.rb
         
     | 
| 
      
 230 
     | 
    
         
            +
            - spec/utils/value_spec.rb
         
     |