glimmer 1.0.2 → 1.0.7
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 +25 -3
 - data/LICENSE.txt +1 -1
 - data/PROCESS.md +2 -2
 - data/README.md +335 -230
 - data/VERSION +1 -1
 - data/glimmer.gemspec +8 -8
 - data/lib/glimmer.rb +5 -5
 - data/lib/glimmer/config.rb +6 -6
 - data/lib/glimmer/data_binding/model_binding.rb +10 -10
 - data/lib/glimmer/data_binding/observable.rb +4 -4
 - data/lib/glimmer/data_binding/observable_array.rb +12 -12
 - data/lib/glimmer/data_binding/observable_model.rb +30 -11
 - data/lib/glimmer/data_binding/observer.rb +8 -6
 - data/lib/glimmer/dsl/engine.rb +13 -12
 - data/lib/glimmer/dsl/expression.rb +5 -5
 - data/lib/glimmer/dsl/expression_handler.rb +4 -4
 - data/lib/glimmer/dsl/parent_expression.rb +4 -4
 - data/lib/glimmer/dsl/static_expression.rb +6 -6
 - data/lib/glimmer/dsl/top_level_expression.rb +4 -4
 - data/lib/glimmer/error.rb +4 -4
 - data/lib/glimmer/invalid_keyword_error.rb +4 -4
 - metadata +13 -12
 
    
        data/VERSION
    CHANGED
    
    | 
         @@ -1 +1 @@ 
     | 
|
| 
       1 
     | 
    
         
            -
            1.0. 
     | 
| 
      
 1 
     | 
    
         
            +
            1.0.7
         
     | 
    
        data/glimmer.gemspec
    CHANGED
    
    | 
         @@ -2,17 +2,17 @@ 
     | 
|
| 
       2 
2 
     | 
    
         
             
            # DO NOT EDIT THIS FILE DIRECTLY
         
     | 
| 
       3 
3 
     | 
    
         
             
            # Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
         
     | 
| 
       4 
4 
     | 
    
         
             
            # -*- encoding: utf-8 -*-
         
     | 
| 
       5 
     | 
    
         
            -
            # stub: glimmer 1.0. 
     | 
| 
      
 5 
     | 
    
         
            +
            # stub: glimmer 1.0.7 ruby lib
         
     | 
| 
       6 
6 
     | 
    
         | 
| 
       7 
7 
     | 
    
         
             
            Gem::Specification.new do |s|
         
     | 
| 
       8 
8 
     | 
    
         
             
              s.name = "glimmer".freeze
         
     | 
| 
       9 
     | 
    
         
            -
              s.version = "1.0. 
     | 
| 
      
 9 
     | 
    
         
            +
              s.version = "1.0.7"
         
     | 
| 
       10 
10 
     | 
    
         | 
| 
       11 
11 
     | 
    
         
             
              s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version=
         
     | 
| 
       12 
12 
     | 
    
         
             
              s.require_paths = ["lib".freeze]
         
     | 
| 
       13 
13 
     | 
    
         
             
              s.authors = ["AndyMaleh".freeze]
         
     | 
| 
       14 
     | 
    
         
            -
              s.date = " 
     | 
| 
       15 
     | 
    
         
            -
              s.description = "Glimmer is a Ruby DSL  
     | 
| 
      
 14 
     | 
    
         
            +
              s.date = "2021-01-11"
         
     | 
| 
      
 15 
     | 
    
         
            +
              s.description = "Glimmer is a Ruby DSL Framework consisting of a DSL Engine and an Observable/Observer/Data-Binding Library. Used in the Glimmer DSL for SWT (JRuby Desktop Development GUI Framework), the Glimmer DSL for Tk (Ruby Desktop Development GUI Library), the Glimmer DSL for Opal (Pure Ruby Web GUI and Auto-Webifier of Desktop Apps), the Glimmer DSL for XML (& HTML), and the Glimmer DSL for CSS.".freeze
         
     | 
| 
       16 
16 
     | 
    
         
             
              s.email = "andy.am@gmail.com".freeze
         
     | 
| 
       17 
17 
     | 
    
         
             
              s.extra_rdoc_files = [
         
     | 
| 
       18 
18 
     | 
    
         
             
                "CHANGELOG.md",
         
     | 
| 
         @@ -53,7 +53,7 @@ Gem::Specification.new do |s| 
     | 
|
| 
       53 
53 
     | 
    
         
             
              end
         
     | 
| 
       54 
54 
     | 
    
         | 
| 
       55 
55 
     | 
    
         
             
              if s.respond_to? :add_runtime_dependency then
         
     | 
| 
       56 
     | 
    
         
            -
                s.add_runtime_dependency(%q<array_include_methods>.freeze, [">= 1.0. 
     | 
| 
      
 56 
     | 
    
         
            +
                s.add_runtime_dependency(%q<array_include_methods>.freeze, [">= 1.0.4", "< 2.0.0"])
         
     | 
| 
       57 
57 
     | 
    
         
             
                s.add_runtime_dependency(%q<facets>.freeze, [">= 3.1.0", "< 4.0.0"])
         
     | 
| 
       58 
58 
     | 
    
         
             
                s.add_development_dependency(%q<rspec-mocks>.freeze, ["~> 3.5.0"])
         
     | 
| 
       59 
59 
     | 
    
         
             
                s.add_development_dependency(%q<rspec>.freeze, ["~> 3.5.0"])
         
     | 
| 
         @@ -61,12 +61,12 @@ Gem::Specification.new do |s| 
     | 
|
| 
       61 
61 
     | 
    
         
             
                s.add_development_dependency(%q<rake>.freeze, [">= 10.1.0", "< 14.0.0"])
         
     | 
| 
       62 
62 
     | 
    
         
             
                s.add_development_dependency(%q<jeweler>.freeze, [">= 2.0.0", "< 3.0.0"])
         
     | 
| 
       63 
63 
     | 
    
         
             
                s.add_development_dependency(%q<rdoc>.freeze, [">= 6.2.1", "< 7.0.0"])
         
     | 
| 
       64 
     | 
    
         
            -
                s.add_development_dependency(%q<coveralls>.freeze, [" 
     | 
| 
      
 64 
     | 
    
         
            +
                s.add_development_dependency(%q<coveralls>.freeze, [">= 0"])
         
     | 
| 
       65 
65 
     | 
    
         
             
                s.add_development_dependency(%q<simplecov>.freeze, ["~> 0.16.1"])
         
     | 
| 
       66 
66 
     | 
    
         
             
                s.add_development_dependency(%q<simplecov-lcov>.freeze, ["~> 0.7.0"])
         
     | 
| 
       67 
67 
     | 
    
         
             
                s.add_development_dependency(%q<rake-tui>.freeze, [">= 0"])
         
     | 
| 
       68 
68 
     | 
    
         
             
              else
         
     | 
| 
       69 
     | 
    
         
            -
                s.add_dependency(%q<array_include_methods>.freeze, [">= 1.0. 
     | 
| 
      
 69 
     | 
    
         
            +
                s.add_dependency(%q<array_include_methods>.freeze, [">= 1.0.4", "< 2.0.0"])
         
     | 
| 
       70 
70 
     | 
    
         
             
                s.add_dependency(%q<facets>.freeze, [">= 3.1.0", "< 4.0.0"])
         
     | 
| 
       71 
71 
     | 
    
         
             
                s.add_dependency(%q<rspec-mocks>.freeze, ["~> 3.5.0"])
         
     | 
| 
       72 
72 
     | 
    
         
             
                s.add_dependency(%q<rspec>.freeze, ["~> 3.5.0"])
         
     | 
| 
         @@ -74,7 +74,7 @@ Gem::Specification.new do |s| 
     | 
|
| 
       74 
74 
     | 
    
         
             
                s.add_dependency(%q<rake>.freeze, [">= 10.1.0", "< 14.0.0"])
         
     | 
| 
       75 
75 
     | 
    
         
             
                s.add_dependency(%q<jeweler>.freeze, [">= 2.0.0", "< 3.0.0"])
         
     | 
| 
       76 
76 
     | 
    
         
             
                s.add_dependency(%q<rdoc>.freeze, [">= 6.2.1", "< 7.0.0"])
         
     | 
| 
       77 
     | 
    
         
            -
                s.add_dependency(%q<coveralls>.freeze, [" 
     | 
| 
      
 77 
     | 
    
         
            +
                s.add_dependency(%q<coveralls>.freeze, [">= 0"])
         
     | 
| 
       78 
78 
     | 
    
         
             
                s.add_dependency(%q<simplecov>.freeze, ["~> 0.16.1"])
         
     | 
| 
       79 
79 
     | 
    
         
             
                s.add_dependency(%q<simplecov-lcov>.freeze, ["~> 0.7.0"])
         
     | 
| 
       80 
80 
     | 
    
         
             
                s.add_dependency(%q<rake-tui>.freeze, [">= 0"])
         
     | 
    
        data/lib/glimmer.rb
    CHANGED
    
    | 
         @@ -1,5 +1,5 @@ 
     | 
|
| 
       1 
     | 
    
         
            -
            # Copyright (c) 2007- 
     | 
| 
       2 
     | 
    
         
            -
            # 
     | 
| 
      
 1 
     | 
    
         
            +
            # Copyright (c) 2007-2021 Andy Maleh
         
     | 
| 
      
 2 
     | 
    
         
            +
            #
         
     | 
| 
       3 
3 
     | 
    
         
             
            # Permission is hereby granted, free of charge, to any person obtaining
         
     | 
| 
       4 
4 
     | 
    
         
             
            # a copy of this software and associated documentation files (the
         
     | 
| 
       5 
5 
     | 
    
         
             
            # "Software"), to deal in the Software without restriction, including
         
     | 
| 
         @@ -7,10 +7,10 @@ 
     | 
|
| 
       7 
7 
     | 
    
         
             
            # distribute, sublicense, and/or sell copies of the Software, and to
         
     | 
| 
       8 
8 
     | 
    
         
             
            # permit persons to whom the Software is furnished to do so, subject to
         
     | 
| 
       9 
9 
     | 
    
         
             
            # the following conditions:
         
     | 
| 
       10 
     | 
    
         
            -
            # 
     | 
| 
      
 10 
     | 
    
         
            +
            #
         
     | 
| 
       11 
11 
     | 
    
         
             
            # The above copyright notice and this permission notice shall be
         
     | 
| 
       12 
12 
     | 
    
         
             
            # included in all copies or substantial portions of the Software.
         
     | 
| 
       13 
     | 
    
         
            -
            # 
     | 
| 
      
 13 
     | 
    
         
            +
            #
         
     | 
| 
       14 
14 
     | 
    
         
             
            # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
         
     | 
| 
       15 
15 
     | 
    
         
             
            # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
         
     | 
| 
       16 
16 
     | 
    
         
             
            # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
         
     | 
| 
         @@ -70,7 +70,7 @@ module Glimmer 
     | 
|
| 
       70 
70 
     | 
    
         
             
                  end
         
     | 
| 
       71 
71 
     | 
    
         
             
                  Glimmer.loop_last_data = new_loop_data
         
     | 
| 
       72 
72 
     | 
    
         
             
                  Glimmer::Config.logger.info {"Interpreting keyword: #{method_symbol}"}
         
     | 
| 
       73 
     | 
    
         
            -
                  Glimmer::DSL::Engine.interpret(method_symbol, *args, &block) 
     | 
| 
      
 73 
     | 
    
         
            +
                  Glimmer::DSL::Engine.interpret(method_symbol, *args, &block)
         
     | 
| 
       74 
74 
     | 
    
         
             
                end
         
     | 
| 
       75 
75 
     | 
    
         
             
              rescue InvalidKeywordError => e
         
     | 
| 
       76 
76 
     | 
    
         
             
                Glimmer::Config.logger.error {"Encountered an invalid keyword at this object: #{self}"}
         
     | 
    
        data/lib/glimmer/config.rb
    CHANGED
    
    | 
         @@ -1,5 +1,5 @@ 
     | 
|
| 
       1 
     | 
    
         
            -
            # Copyright (c) 2007- 
     | 
| 
       2 
     | 
    
         
            -
            # 
     | 
| 
      
 1 
     | 
    
         
            +
            # Copyright (c) 2007-2021 Andy Maleh
         
     | 
| 
      
 2 
     | 
    
         
            +
            #
         
     | 
| 
       3 
3 
     | 
    
         
             
            # Permission is hereby granted, free of charge, to any person obtaining
         
     | 
| 
       4 
4 
     | 
    
         
             
            # a copy of this software and associated documentation files (the
         
     | 
| 
       5 
5 
     | 
    
         
             
            # "Software"), to deal in the Software without restriction, including
         
     | 
| 
         @@ -7,10 +7,10 @@ 
     | 
|
| 
       7 
7 
     | 
    
         
             
            # distribute, sublicense, and/or sell copies of the Software, and to
         
     | 
| 
       8 
8 
     | 
    
         
             
            # permit persons to whom the Software is furnished to do so, subject to
         
     | 
| 
       9 
9 
     | 
    
         
             
            # the following conditions:
         
     | 
| 
       10 
     | 
    
         
            -
            # 
     | 
| 
      
 10 
     | 
    
         
            +
            #
         
     | 
| 
       11 
11 
     | 
    
         
             
            # The above copyright notice and this permission notice shall be
         
     | 
| 
       12 
12 
     | 
    
         
             
            # included in all copies or substantial portions of the Software.
         
     | 
| 
       13 
     | 
    
         
            -
            # 
     | 
| 
      
 13 
     | 
    
         
            +
            #
         
     | 
| 
       14 
14 
     | 
    
         
             
            # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
         
     | 
| 
       15 
15 
     | 
    
         
             
            # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
         
     | 
| 
       16 
16 
     | 
    
         
             
            # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
         
     | 
| 
         @@ -46,7 +46,7 @@ module Glimmer 
     | 
|
| 
       46 
46 
     | 
    
         
             
                  end
         
     | 
| 
       47 
47 
     | 
    
         | 
| 
       48 
48 
     | 
    
         
             
                  # Returns Glimmer logger (standard Ruby logger)
         
     | 
| 
       49 
     | 
    
         
            -
                  def logger 
     | 
| 
      
 49 
     | 
    
         
            +
                  def logger
         
     | 
| 
       50 
50 
     | 
    
         
             
                    reset_logger! unless defined? @@logger
         
     | 
| 
       51 
51 
     | 
    
         
             
                    @@logger
         
     | 
| 
       52 
52 
     | 
    
         
             
                  end
         
     | 
| 
         @@ -56,7 +56,7 @@ module Glimmer 
     | 
|
| 
       56 
56 
     | 
    
         
             
                  end
         
     | 
| 
       57 
57 
     | 
    
         | 
| 
       58 
58 
     | 
    
         
             
                  def reset_logger!
         
     | 
| 
       59 
     | 
    
         
            -
                    self.logger = Logger.new(STDOUT).tap do |logger| 
     | 
| 
      
 59 
     | 
    
         
            +
                    self.logger = Logger.new(STDOUT).tap do |logger|
         
     | 
| 
       60 
60 
     | 
    
         
             
                      logger.level = Logger::ERROR
         
     | 
| 
       61 
61 
     | 
    
         
             
                      begin
         
     | 
| 
       62 
62 
     | 
    
         
             
                        logger.level = ENV['GLIMMER_LOGGER_LEVEL'].strip.downcase if ENV['GLIMMER_LOGGER_LEVEL']
         
     | 
| 
         @@ -1,5 +1,5 @@ 
     | 
|
| 
       1 
     | 
    
         
            -
            # Copyright (c) 2007- 
     | 
| 
       2 
     | 
    
         
            -
            # 
     | 
| 
      
 1 
     | 
    
         
            +
            # Copyright (c) 2007-2021 Andy Maleh
         
     | 
| 
      
 2 
     | 
    
         
            +
            #
         
     | 
| 
       3 
3 
     | 
    
         
             
            # Permission is hereby granted, free of charge, to any person obtaining
         
     | 
| 
       4 
4 
     | 
    
         
             
            # a copy of this software and associated documentation files (the
         
     | 
| 
       5 
5 
     | 
    
         
             
            # "Software"), to deal in the Software without restriction, including
         
     | 
| 
         @@ -7,10 +7,10 @@ 
     | 
|
| 
       7 
7 
     | 
    
         
             
            # distribute, sublicense, and/or sell copies of the Software, and to
         
     | 
| 
       8 
8 
     | 
    
         
             
            # permit persons to whom the Software is furnished to do so, subject to
         
     | 
| 
       9 
9 
     | 
    
         
             
            # the following conditions:
         
     | 
| 
       10 
     | 
    
         
            -
            # 
     | 
| 
      
 10 
     | 
    
         
            +
            #
         
     | 
| 
       11 
11 
     | 
    
         
             
            # The above copyright notice and this permission notice shall be
         
     | 
| 
       12 
12 
     | 
    
         
             
            # included in all copies or substantial portions of the Software.
         
     | 
| 
       13 
     | 
    
         
            -
            # 
     | 
| 
      
 13 
     | 
    
         
            +
            #
         
     | 
| 
       14 
14 
     | 
    
         
             
            # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
         
     | 
| 
       15 
15 
     | 
    
         
             
            # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
         
     | 
| 
       16 
16 
     | 
    
         
             
            # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
         
     | 
| 
         @@ -81,9 +81,9 @@ module Glimmer 
     | 
|
| 
       81 
81 
     | 
    
         
             
                  end
         
     | 
| 
       82 
82 
     | 
    
         | 
| 
       83 
83 
     | 
    
         
             
                  def apply_converter(converter, value)
         
     | 
| 
       84 
     | 
    
         
            -
                    return value if converter.nil? 
     | 
| 
       85 
     | 
    
         
            -
                    return value.send(converter) if (converter.is_a?(String) || converter.is_a?(Symbol)) && value.respond_to?(converter) 
     | 
| 
       86 
     | 
    
         
            -
                    return converter.call(value) if converter.respond_to?(:call, value) 
     | 
| 
      
 84 
     | 
    
         
            +
                    return value if converter.nil?
         
     | 
| 
      
 85 
     | 
    
         
            +
                    return value.send(converter) if (converter.is_a?(String) || converter.is_a?(Symbol)) && value.respond_to?(converter)
         
     | 
| 
      
 86 
     | 
    
         
            +
                    return converter.call(value) if converter.respond_to?(:call, value)
         
     | 
| 
       87 
87 
     | 
    
         
             
                    raise Glimmer::Error, "Unsupported bind converter: #{converter.inspect}"
         
     | 
| 
       88 
88 
     | 
    
         
             
                  end
         
     | 
| 
       89 
89 
     | 
    
         | 
| 
         @@ -209,11 +209,11 @@ module Glimmer 
     | 
|
| 
       209 
209 
     | 
    
         
             
                  def call(value)
         
     | 
| 
       210 
210 
     | 
    
         
             
                    return if model.nil?
         
     | 
| 
       211 
211 
     | 
    
         
             
                    converted_value = value
         
     | 
| 
       212 
     | 
    
         
            -
                    invoke_property_writer(model, "#{property_name}=", converted_value) unless  
     | 
| 
      
 212 
     | 
    
         
            +
                    invoke_property_writer(model, "#{property_name}=", converted_value) unless converted_value == evaluate_property
         
     | 
| 
       213 
213 
     | 
    
         
             
                  end
         
     | 
| 
       214 
214 
     | 
    
         | 
| 
       215 
215 
     | 
    
         
             
                  def evaluate_property
         
     | 
| 
       216 
     | 
    
         
            -
                    value = nil 
     | 
| 
      
 216 
     | 
    
         
            +
                    value = nil
         
     | 
| 
       217 
217 
     | 
    
         
             
                    value = invoke_property_reader(model, property_name) unless model.nil?
         
     | 
| 
       218 
218 
     | 
    
         
             
                    convert_on_read(value)
         
     | 
| 
       219 
219 
     | 
    
         
             
                  end
         
     | 
| 
         @@ -242,7 +242,7 @@ module Glimmer 
     | 
|
| 
       242 
242 
     | 
    
         
             
                  end
         
     | 
| 
       243 
243 
     | 
    
         | 
| 
       244 
244 
     | 
    
         
             
                  def invoke_property_writer(object, property_expression, value)
         
     | 
| 
       245 
     | 
    
         
            -
                     
     | 
| 
      
 245 
     | 
    
         
            +
                    raise "Cannot invoke `#{property_expression}` because ModelBinding#binding_options[:read_only]=true" if @binding_options[:read_only]
         
     | 
| 
       246 
246 
     | 
    
         
             
                    value = convert_on_write(value)
         
     | 
| 
       247 
247 
     | 
    
         
             
                    if property_indexed?(property_expression)
         
     | 
| 
       248 
248 
     | 
    
         
             
                      property_method = '[]='
         
     | 
| 
         @@ -1,5 +1,5 @@ 
     | 
|
| 
       1 
     | 
    
         
            -
            # Copyright (c) 2007- 
     | 
| 
       2 
     | 
    
         
            -
            # 
     | 
| 
      
 1 
     | 
    
         
            +
            # Copyright (c) 2007-2021 Andy Maleh
         
     | 
| 
      
 2 
     | 
    
         
            +
            #
         
     | 
| 
       3 
3 
     | 
    
         
             
            # Permission is hereby granted, free of charge, to any person obtaining
         
     | 
| 
       4 
4 
     | 
    
         
             
            # a copy of this software and associated documentation files (the
         
     | 
| 
       5 
5 
     | 
    
         
             
            # "Software"), to deal in the Software without restriction, including
         
     | 
| 
         @@ -7,10 +7,10 @@ 
     | 
|
| 
       7 
7 
     | 
    
         
             
            # distribute, sublicense, and/or sell copies of the Software, and to
         
     | 
| 
       8 
8 
     | 
    
         
             
            # permit persons to whom the Software is furnished to do so, subject to
         
     | 
| 
       9 
9 
     | 
    
         
             
            # the following conditions:
         
     | 
| 
       10 
     | 
    
         
            -
            # 
     | 
| 
      
 10 
     | 
    
         
            +
            #
         
     | 
| 
       11 
11 
     | 
    
         
             
            # The above copyright notice and this permission notice shall be
         
     | 
| 
       12 
12 
     | 
    
         
             
            # included in all copies or substantial portions of the Software.
         
     | 
| 
       13 
     | 
    
         
            -
            # 
     | 
| 
      
 13 
     | 
    
         
            +
            #
         
     | 
| 
       14 
14 
     | 
    
         
             
            # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
         
     | 
| 
       15 
15 
     | 
    
         
             
            # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
         
     | 
| 
       16 
16 
     | 
    
         
             
            # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
         
     | 
| 
         @@ -1,5 +1,5 @@ 
     | 
|
| 
       1 
     | 
    
         
            -
            # Copyright (c) 2007- 
     | 
| 
       2 
     | 
    
         
            -
            # 
     | 
| 
      
 1 
     | 
    
         
            +
            # Copyright (c) 2007-2021 Andy Maleh
         
     | 
| 
      
 2 
     | 
    
         
            +
            #
         
     | 
| 
       3 
3 
     | 
    
         
             
            # Permission is hereby granted, free of charge, to any person obtaining
         
     | 
| 
       4 
4 
     | 
    
         
             
            # a copy of this software and associated documentation files (the
         
     | 
| 
       5 
5 
     | 
    
         
             
            # "Software"), to deal in the Software without restriction, including
         
     | 
| 
         @@ -7,10 +7,10 @@ 
     | 
|
| 
       7 
7 
     | 
    
         
             
            # distribute, sublicense, and/or sell copies of the Software, and to
         
     | 
| 
       8 
8 
     | 
    
         
             
            # permit persons to whom the Software is furnished to do so, subject to
         
     | 
| 
       9 
9 
     | 
    
         
             
            # the following conditions:
         
     | 
| 
       10 
     | 
    
         
            -
            # 
     | 
| 
      
 10 
     | 
    
         
            +
            #
         
     | 
| 
       11 
11 
     | 
    
         
             
            # The above copyright notice and this permission notice shall be
         
     | 
| 
       12 
12 
     | 
    
         
             
            # included in all copies or substantial portions of the Software.
         
     | 
| 
       13 
     | 
    
         
            -
            # 
     | 
| 
      
 13 
     | 
    
         
            +
            #
         
     | 
| 
       14 
14 
     | 
    
         
             
            # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
         
     | 
| 
       15 
15 
     | 
    
         
             
            # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
         
     | 
| 
       16 
16 
     | 
    
         
             
            # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
         
     | 
| 
         @@ -48,7 +48,7 @@ module Glimmer 
     | 
|
| 
       48 
48 
     | 
    
         
             
                  def add_element_observer(element, observer)
         
     | 
| 
       49 
49 
     | 
    
         
             
                    element_properties_for(observer).each do |property|
         
     | 
| 
       50 
50 
     | 
    
         
             
                      observer.observe(element, property)
         
     | 
| 
       51 
     | 
    
         
            -
                    end 
     | 
| 
      
 51 
     | 
    
         
            +
                    end
         
     | 
| 
       52 
52 
     | 
    
         
             
                  end
         
     | 
| 
       53 
53 
     | 
    
         | 
| 
       54 
54 
     | 
    
         
             
                  def remove_observer(observer, *element_properties)
         
     | 
| 
         @@ -62,20 +62,20 @@ module Glimmer 
     | 
|
| 
       62 
62 
     | 
    
         
             
                      property_observer_list.delete(observer)
         
     | 
| 
       63 
63 
     | 
    
         
             
                      observer_element_properties.delete(observer)
         
     | 
| 
       64 
64 
     | 
    
         
             
                      each { |element| remove_element_observer(element, observer) }
         
     | 
| 
       65 
     | 
    
         
            -
                    end 
     | 
| 
      
 65 
     | 
    
         
            +
                    end
         
     | 
| 
       66 
66 
     | 
    
         
             
                    observer
         
     | 
| 
       67 
67 
     | 
    
         
             
                  end
         
     | 
| 
       68 
68 
     | 
    
         | 
| 
       69 
69 
     | 
    
         
             
                  def remove_element_observers(element)
         
     | 
| 
       70 
70 
     | 
    
         
             
                    property_observer_list.each do |observer|
         
     | 
| 
       71 
71 
     | 
    
         
             
                      remove_element_observer(element, observer)
         
     | 
| 
       72 
     | 
    
         
            -
                    end 
     | 
| 
      
 72 
     | 
    
         
            +
                    end
         
     | 
| 
       73 
73 
     | 
    
         
             
                  end
         
     | 
| 
       74 
74 
     | 
    
         | 
| 
       75 
75 
     | 
    
         
             
                  def remove_element_observer(element, observer)
         
     | 
| 
       76 
76 
     | 
    
         
             
                    element_properties_for(observer).each do |property|
         
     | 
| 
       77 
77 
     | 
    
         
             
                      observer.unobserve(element, property)
         
     | 
| 
       78 
     | 
    
         
            -
                    end 
     | 
| 
      
 78 
     | 
    
         
            +
                    end
         
     | 
| 
       79 
79 
     | 
    
         
             
                  end
         
     | 
| 
       80 
80 
     | 
    
         | 
| 
       81 
81 
     | 
    
         
             
                  def has_observer?(observer)
         
     | 
| 
         @@ -104,7 +104,7 @@ module Glimmer 
     | 
|
| 
       104 
104 
     | 
    
         | 
| 
       105 
105 
     | 
    
         
             
                  def <<(element)
         
     | 
| 
       106 
106 
     | 
    
         
             
                    super(element).tap do
         
     | 
| 
       107 
     | 
    
         
            -
                      add_element_observers(element) 
     | 
| 
      
 107 
     | 
    
         
            +
                      add_element_observers(element)
         
     | 
| 
       108 
108 
     | 
    
         
             
                      notify_observers
         
     | 
| 
       109 
109 
     | 
    
         
             
                    end
         
     | 
| 
       110 
110 
     | 
    
         
             
                  end
         
     | 
| 
         @@ -115,7 +115,7 @@ module Glimmer 
     | 
|
| 
       115 
115 
     | 
    
         
             
                    old_value = self[index]
         
     | 
| 
       116 
116 
     | 
    
         
             
                    unregister_dependent_observers(old_value)
         
     | 
| 
       117 
117 
     | 
    
         
             
                    remove_element_observers(old_value)
         
     | 
| 
       118 
     | 
    
         
            -
                    add_element_observers(value) 
     | 
| 
      
 118 
     | 
    
         
            +
                    add_element_observers(value)
         
     | 
| 
       119 
119 
     | 
    
         
             
                    super(index, value).tap do
         
     | 
| 
       120 
120 
     | 
    
         
             
                      notify_observers
         
     | 
| 
       121 
121 
     | 
    
         
             
                    end
         
     | 
| 
         @@ -151,7 +151,7 @@ module Glimmer 
     | 
|
| 
       151 
151 
     | 
    
         
             
                    if block_given?
         
     | 
| 
       152 
152 
     | 
    
         
             
                      old_array = Array.new(self)
         
     | 
| 
       153 
153 
     | 
    
         
             
                      super(&block).tap do |new_array|
         
     | 
| 
       154 
     | 
    
         
            -
                        (old_array - new_array).each do |element| 
     | 
| 
      
 154 
     | 
    
         
            +
                        (old_array - new_array).each do |element|
         
     | 
| 
       155 
155 
     | 
    
         
             
                          unregister_dependent_observers(element)
         
     | 
| 
       156 
156 
     | 
    
         
             
                          remove_element_observers(element)
         
     | 
| 
       157 
157 
     | 
    
         
             
                        end
         
     | 
| 
         @@ -264,7 +264,7 @@ module Glimmer 
     | 
|
| 
       264 
264 
     | 
    
         | 
| 
       265 
265 
     | 
    
         
             
                  def unshift(element)
         
     | 
| 
       266 
266 
     | 
    
         
             
                    super(element).tap do
         
     | 
| 
       267 
     | 
    
         
            -
                      add_element_observers(element) 
     | 
| 
      
 267 
     | 
    
         
            +
                      add_element_observers(element)
         
     | 
| 
       268 
268 
     | 
    
         
             
                      notify_observers
         
     | 
| 
       269 
269 
     | 
    
         
             
                    end
         
     | 
| 
       270 
270 
     | 
    
         
             
                  end
         
     | 
| 
         @@ -1,5 +1,5 @@ 
     | 
|
| 
       1 
     | 
    
         
            -
            # Copyright (c) 2007- 
     | 
| 
       2 
     | 
    
         
            -
            # 
     | 
| 
      
 1 
     | 
    
         
            +
            # Copyright (c) 2007-2021 Andy Maleh
         
     | 
| 
      
 2 
     | 
    
         
            +
            #
         
     | 
| 
       3 
3 
     | 
    
         
             
            # Permission is hereby granted, free of charge, to any person obtaining
         
     | 
| 
       4 
4 
     | 
    
         
             
            # a copy of this software and associated documentation files (the
         
     | 
| 
       5 
5 
     | 
    
         
             
            # "Software"), to deal in the Software without restriction, including
         
     | 
| 
         @@ -7,10 +7,10 @@ 
     | 
|
| 
       7 
7 
     | 
    
         
             
            # distribute, sublicense, and/or sell copies of the Software, and to
         
     | 
| 
       8 
8 
     | 
    
         
             
            # permit persons to whom the Software is furnished to do so, subject to
         
     | 
| 
       9 
9 
     | 
    
         
             
            # the following conditions:
         
     | 
| 
       10 
     | 
    
         
            -
            # 
     | 
| 
      
 10 
     | 
    
         
            +
            #
         
     | 
| 
       11 
11 
     | 
    
         
             
            # The above copyright notice and this permission notice shall be
         
     | 
| 
       12 
12 
     | 
    
         
             
            # included in all copies or substantial portions of the Software.
         
     | 
| 
       13 
     | 
    
         
            -
            # 
     | 
| 
      
 13 
     | 
    
         
            +
            #
         
     | 
| 
       14 
14 
     | 
    
         
             
            # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
         
     | 
| 
       15 
15 
     | 
    
         
             
            # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
         
     | 
| 
       16 
16 
     | 
    
         
             
            # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
         
     | 
| 
         @@ -43,7 +43,7 @@ module Glimmer 
     | 
|
| 
       43 
43 
     | 
    
         
             
                    lambda do |value|
         
     | 
| 
       44 
44 
     | 
    
         
             
                      old_value = self.send(property_name)
         
     | 
| 
       45 
45 
     | 
    
         
             
                      unregister_dependent_observers(property_name, old_value)
         
     | 
| 
       46 
     | 
    
         
            -
                      self.send(" 
     | 
| 
      
 46 
     | 
    
         
            +
                      self.send("__original__#{property_writer_name}", value)
         
     | 
| 
       47 
47 
     | 
    
         
             
                      notify_observers(property_name)
         
     | 
| 
       48 
48 
     | 
    
         
             
                      ensure_array_object_observer(property_name, value, old_value)
         
     | 
| 
       49 
49 
     | 
    
         
             
                    end
         
     | 
| 
         @@ -57,7 +57,26 @@ module Glimmer 
     | 
|
| 
       57 
57 
     | 
    
         
             
                  end
         
     | 
| 
       58 
58 
     | 
    
         | 
| 
       59 
59 
     | 
    
         
             
                  def remove_observer(observer, property_name)
         
     | 
| 
       60 
     | 
    
         
            -
                     
     | 
| 
      
 60 
     | 
    
         
            +
                    if has_observer?(observer, property_name)
         
     | 
| 
      
 61 
     | 
    
         
            +
                      property_observer_list(property_name).delete(observer)
         
     | 
| 
      
 62 
     | 
    
         
            +
                      observer.unobserve(self, property_name)
         
     | 
| 
      
 63 
     | 
    
         
            +
                    end
         
     | 
| 
      
 64 
     | 
    
         
            +
                  end
         
     | 
| 
      
 65 
     | 
    
         
            +
             
     | 
| 
      
 66 
     | 
    
         
            +
                  def remove_observers(property_name)
         
     | 
| 
      
 67 
     | 
    
         
            +
                    property_observer_hash[property_name.to_sym].each do |observer|
         
     | 
| 
      
 68 
     | 
    
         
            +
                      remove_observer(observer, property_name)
         
     | 
| 
      
 69 
     | 
    
         
            +
                    end
         
     | 
| 
      
 70 
     | 
    
         
            +
                    property_observer_hash.delete(property_name.to_sym)
         
     | 
| 
      
 71 
     | 
    
         
            +
                  end
         
     | 
| 
      
 72 
     | 
    
         
            +
             
     | 
| 
      
 73 
     | 
    
         
            +
                  def remove_all_observers
         
     | 
| 
      
 74 
     | 
    
         
            +
                    all_observers = property_observer_hash.clone
         
     | 
| 
      
 75 
     | 
    
         
            +
                    property_observer_hash.keys.each do |property_name|
         
     | 
| 
      
 76 
     | 
    
         
            +
                      remove_observers(property_name)
         
     | 
| 
      
 77 
     | 
    
         
            +
                    end
         
     | 
| 
      
 78 
     | 
    
         
            +
                    property_observer_hash.clear
         
     | 
| 
      
 79 
     | 
    
         
            +
                    all_observers
         
     | 
| 
       61 
80 
     | 
    
         
             
                  end
         
     | 
| 
       62 
81 
     | 
    
         | 
| 
       63 
82 
     | 
    
         
             
                  def has_observer?(observer, property_name)
         
     | 
| 
         @@ -86,9 +105,9 @@ module Glimmer 
     | 
|
| 
       86 
105 
     | 
    
         
             
                    method(property_writer_name)
         
     | 
| 
       87 
106 
     | 
    
         
             
                    ensure_array_object_observer(property_name, send(property_name))
         
     | 
| 
       88 
107 
     | 
    
         
             
                    begin
         
     | 
| 
       89 
     | 
    
         
            -
                       
     | 
| 
      
 108 
     | 
    
         
            +
                      method("__original__#{property_writer_name}")
         
     | 
| 
       90 
109 
     | 
    
         
             
                    rescue
         
     | 
| 
       91 
     | 
    
         
            -
                      define_singleton_method(" 
     | 
| 
      
 110 
     | 
    
         
            +
                      define_singleton_method("__original__#{property_writer_name}", property_writer_method(property_writer_name))
         
     | 
| 
       92 
111 
     | 
    
         
             
                      define_singleton_method(property_writer_name, &PROPERTY_WRITER_FACTORY.call(property_name))
         
     | 
| 
       93 
112 
     | 
    
         
             
                    end
         
     | 
| 
       94 
113 
     | 
    
         
             
                  rescue => e
         
     | 
| 
         @@ -97,7 +116,7 @@ module Glimmer 
     | 
|
| 
       97 
116 
     | 
    
         
             
                  end
         
     | 
| 
       98 
117 
     | 
    
         | 
| 
       99 
118 
     | 
    
         
             
                  def property_writer_method(property_writer_name)
         
     | 
| 
       100 
     | 
    
         
            -
                    self.class.instance_method(property_writer_name) rescue self.method(property_writer_name) 
     | 
| 
      
 119 
     | 
    
         
            +
                    self.class.instance_method(property_writer_name) rescue self.method(property_writer_name)
         
     | 
| 
       101 
120 
     | 
    
         
             
                  end
         
     | 
| 
       102 
121 
     | 
    
         | 
| 
       103 
122 
     | 
    
         
             
                  def unregister_dependent_observers(property_name, old_value)
         
     | 
| 
         @@ -107,7 +126,7 @@ module Glimmer 
     | 
|
| 
       107 
126 
     | 
    
         
             
                  end
         
     | 
| 
       108 
127 
     | 
    
         | 
| 
       109 
128 
     | 
    
         
             
                  def ensure_array_object_observer(property_name, object, old_object = nil)
         
     | 
| 
       110 
     | 
    
         
            -
                    return unless object 
     | 
| 
      
 129 
     | 
    
         
            +
                    return unless object&.is_a?(Array)
         
     | 
| 
       111 
130 
     | 
    
         
             
                    array_object_observer = array_object_observer_for(property_name)
         
     | 
| 
       112 
131 
     | 
    
         
             
                    array_observer_registration = array_object_observer.observe(object)
         
     | 
| 
       113 
132 
     | 
    
         
             
                    property_observer_list(property_name).each do |observer|
         
     | 
| 
         @@ -118,7 +137,7 @@ module Glimmer 
     | 
|
| 
       118 
137 
     | 
    
         
             
                  end
         
     | 
| 
       119 
138 
     | 
    
         | 
| 
       120 
139 
     | 
    
         
             
                  def array_object_observer_for(property_name)
         
     | 
| 
       121 
     | 
    
         
            -
                    @array_object_observers ||= {} 
     | 
| 
      
 140 
     | 
    
         
            +
                    @array_object_observers ||= {}
         
     | 
| 
       122 
141 
     | 
    
         
             
                    @array_object_observers[property_name] = ObservableModel::Notifier.new(self, property_name) unless @array_object_observers.has_key?(property_name)
         
     | 
| 
       123 
142 
     | 
    
         
             
                    @array_object_observers[property_name]
         
     | 
| 
       124 
143 
     | 
    
         
             
                  end
         
     | 
| 
         @@ -1,5 +1,5 @@ 
     | 
|
| 
       1 
     | 
    
         
            -
            # Copyright (c) 2007- 
     | 
| 
       2 
     | 
    
         
            -
            # 
     | 
| 
      
 1 
     | 
    
         
            +
            # Copyright (c) 2007-2021 Andy Maleh
         
     | 
| 
      
 2 
     | 
    
         
            +
            #
         
     | 
| 
       3 
3 
     | 
    
         
             
            # Permission is hereby granted, free of charge, to any person obtaining
         
     | 
| 
       4 
4 
     | 
    
         
             
            # a copy of this software and associated documentation files (the
         
     | 
| 
       5 
5 
     | 
    
         
             
            # "Software"), to deal in the Software without restriction, including
         
     | 
| 
         @@ -7,10 +7,10 @@ 
     | 
|
| 
       7 
7 
     | 
    
         
             
            # distribute, sublicense, and/or sell copies of the Software, and to
         
     | 
| 
       8 
8 
     | 
    
         
             
            # permit persons to whom the Software is furnished to do so, subject to
         
     | 
| 
       9 
9 
     | 
    
         
             
            # the following conditions:
         
     | 
| 
       10 
     | 
    
         
            -
            # 
     | 
| 
      
 10 
     | 
    
         
            +
            #
         
     | 
| 
       11 
11 
     | 
    
         
             
            # The above copyright notice and this permission notice shall be
         
     | 
| 
       12 
12 
     | 
    
         
             
            # included in all copies or substantial portions of the Software.
         
     | 
| 
       13 
     | 
    
         
            -
            # 
     | 
| 
      
 13 
     | 
    
         
            +
            #
         
     | 
| 
       14 
14 
     | 
    
         
             
            # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
         
     | 
| 
       15 
15 
     | 
    
         
             
            # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
         
     | 
| 
       16 
16 
     | 
    
         
             
            # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
         
     | 
| 
         @@ -51,6 +51,7 @@ module Glimmer 
     | 
|
| 
       51 
51 
     | 
    
         
             
                      observer.unobserve(observable, property)
         
     | 
| 
       52 
52 
     | 
    
         
             
                    end
         
     | 
| 
       53 
53 
     | 
    
         
             
                    alias unobserve unregister
         
     | 
| 
      
 54 
     | 
    
         
            +
                    alias deregister unregister
         
     | 
| 
       54 
55 
     | 
    
         
             
                  end
         
     | 
| 
       55 
56 
     | 
    
         | 
| 
       56 
57 
     | 
    
         
             
                  class << self
         
     | 
| 
         @@ -99,13 +100,14 @@ module Glimmer 
     | 
|
| 
       99 
100 
     | 
    
         
             
                  def unregister(observable, property = nil)
         
     | 
| 
       100 
101 
     | 
    
         
             
                    return unless observable.is_a?(Observable)
         
     | 
| 
       101 
102 
     | 
    
         
             
                    # TODO optimize performance in the future via indexing and/or making a registration official object/class
         
     | 
| 
       102 
     | 
    
         
            -
                    observable.remove_observer(*[self, property].compact)
         
     | 
| 
       103 
103 
     | 
    
         
             
                    registration = registration_for(observable, property)
         
     | 
| 
       104 
104 
     | 
    
         
             
                    dependents_for(registration).each do |dependent|
         
     | 
| 
       105 
105 
     | 
    
         
             
                      dependent.unregister
         
     | 
| 
       106 
106 
     | 
    
         
             
                      remove_dependent(registration => dependent)
         
     | 
| 
       107 
107 
     | 
    
         
             
                    end
         
     | 
| 
       108 
     | 
    
         
            -
                    registrations.delete(registration)
         
     | 
| 
      
 108 
     | 
    
         
            +
                    registrations.delete(registration).tap do |registration|
         
     | 
| 
      
 109 
     | 
    
         
            +
                      observable.remove_observer(*[self, property].compact)
         
     | 
| 
      
 110 
     | 
    
         
            +
                    end
         
     | 
| 
       109 
111 
     | 
    
         
             
                  end
         
     | 
| 
       110 
112 
     | 
    
         
             
                  alias unobserve unregister
         
     | 
| 
       111 
113 
     | 
    
         | 
    
        data/lib/glimmer/dsl/engine.rb
    CHANGED
    
    | 
         @@ -1,5 +1,5 @@ 
     | 
|
| 
       1 
     | 
    
         
            -
            # Copyright (c) 2007- 
     | 
| 
       2 
     | 
    
         
            -
            # 
     | 
| 
      
 1 
     | 
    
         
            +
            # Copyright (c) 2007-2021 Andy Maleh
         
     | 
| 
      
 2 
     | 
    
         
            +
            #
         
     | 
| 
       3 
3 
     | 
    
         
             
            # Permission is hereby granted, free of charge, to any person obtaining
         
     | 
| 
       4 
4 
     | 
    
         
             
            # a copy of this software and associated documentation files (the
         
     | 
| 
       5 
5 
     | 
    
         
             
            # "Software"), to deal in the Software without restriction, including
         
     | 
| 
         @@ -7,10 +7,10 @@ 
     | 
|
| 
       7 
7 
     | 
    
         
             
            # distribute, sublicense, and/or sell copies of the Software, and to
         
     | 
| 
       8 
8 
     | 
    
         
             
            # permit persons to whom the Software is furnished to do so, subject to
         
     | 
| 
       9 
9 
     | 
    
         
             
            # the following conditions:
         
     | 
| 
       10 
     | 
    
         
            -
            # 
     | 
| 
      
 10 
     | 
    
         
            +
            #
         
     | 
| 
       11 
11 
     | 
    
         
             
            # The above copyright notice and this permission notice shall be
         
     | 
| 
       12 
12 
     | 
    
         
             
            # included in all copies or substantial portions of the Software.
         
     | 
| 
       13 
     | 
    
         
            -
            # 
     | 
| 
      
 13 
     | 
    
         
            +
            #
         
     | 
| 
       14 
14 
     | 
    
         
             
            # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
         
     | 
| 
       15 
15 
     | 
    
         
             
            # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
         
     | 
| 
       16 
16 
     | 
    
         
             
            # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
         
     | 
| 
         @@ -51,7 +51,7 @@ module Glimmer 
     | 
|
| 
       51 
51 
     | 
    
         
             
                        end
         
     | 
| 
       52 
52 
     | 
    
         
             
                        if interpretation
         
     | 
| 
       53 
53 
     | 
    
         
             
                          interpretation
         
     | 
| 
       54 
     | 
    
         
            -
                        else 
     | 
| 
      
 54 
     | 
    
         
            +
                        else
         
     | 
| 
       55 
55 
     | 
    
         
             
                          raise Glimmer::Error, "Unsupported keyword: #{keyword}" unless static_expression_dsl || retrieved_static_expression
         
     | 
| 
       56 
56 
     | 
    
         
             
                          Glimmer::DSL::Engine.dsl_stack.push(static_expression_dsl || Glimmer::DSL::Engine.dsl)
         
     | 
| 
       57 
57 
     | 
    
         
             
                          static_expression = Glimmer::DSL::Engine.static_expressions[keyword][Glimmer::DSL::Engine.dsl]
         
     | 
| 
         @@ -62,8 +62,8 @@ module Glimmer 
     | 
|
| 
       62 
62 
     | 
    
         
             
                            Glimmer::DSL::Engine.interpret_expression(static_expression, keyword, *args, &block)
         
     | 
| 
       63 
63 
     | 
    
         
             
                          end
         
     | 
| 
       64 
64 
     | 
    
         
             
                        end
         
     | 
| 
       65 
     | 
    
         
            -
                      end 
     | 
| 
       66 
     | 
    
         
            -
                    end 
     | 
| 
      
 65 
     | 
    
         
            +
                      end
         
     | 
| 
      
 66 
     | 
    
         
            +
                    end
         
     | 
| 
       67 
67 
     | 
    
         
             
                  end
         
     | 
| 
       68 
68 
     | 
    
         | 
| 
       69 
69 
     | 
    
         
             
                  class << self
         
     | 
| 
         @@ -115,7 +115,7 @@ module Glimmer 
     | 
|
| 
       115 
115 
     | 
    
         
             
                    # Static expressions indexed by keyword and dsl
         
     | 
| 
       116 
116 
     | 
    
         
             
                    def static_expressions
         
     | 
| 
       117 
117 
     | 
    
         
             
                      @static_expressions ||= {}
         
     | 
| 
       118 
     | 
    
         
            -
                    end 
     | 
| 
      
 118 
     | 
    
         
            +
                    end
         
     | 
| 
       119 
119 
     | 
    
         | 
| 
       120 
120 
     | 
    
         
             
                    # Sets dynamic expression chains of responsibility. Useful for internal testing
         
     | 
| 
       121 
121 
     | 
    
         
             
                    attr_writer :dynamic_expression_chains_of_responsibility
         
     | 
| 
         @@ -132,7 +132,7 @@ module Glimmer 
     | 
|
| 
       132 
132 
     | 
    
         
             
                    # Pattern when interpretting a DSL expression
         
     | 
| 
       133 
133 
     | 
    
         
             
                    def add_dynamic_expressions(dsl_namespace, *expression_names)
         
     | 
| 
       134 
134 
     | 
    
         
             
                      expression_names = expression_names.flatten
         
     | 
| 
       135 
     | 
    
         
            -
                      dsl = dsl_namespace.name.split("::").last.downcase.to_sym 
     | 
| 
      
 135 
     | 
    
         
            +
                      dsl = dsl_namespace.name.split("::").last.downcase.to_sym
         
     | 
| 
       136 
136 
     | 
    
         
             
                      dynamic_expression_chains_of_responsibility[dsl] = expression_names.reverse.map do |expression_name|
         
     | 
| 
       137 
137 
     | 
    
         
             
                        expression_class(dsl_namespace, expression_name).new
         
     | 
| 
       138 
138 
     | 
    
         
             
                      end.reduce(nil) do |last_expresion_handler, expression|
         
     | 
| 
         @@ -140,7 +140,7 @@ module Glimmer 
     | 
|
| 
       140 
140 
     | 
    
         
             
                        expression_handler = ExpressionHandler.new(expression)
         
     | 
| 
       141 
141 
     | 
    
         
             
                        expression_handler.next = last_expresion_handler if last_expresion_handler
         
     | 
| 
       142 
142 
     | 
    
         
             
                        expression_handler
         
     | 
| 
       143 
     | 
    
         
            -
                      end 
     | 
| 
      
 143 
     | 
    
         
            +
                      end
         
     | 
| 
       144 
144 
     | 
    
         
             
                    end
         
     | 
| 
       145 
145 
     | 
    
         | 
| 
       146 
146 
     | 
    
         
             
                    def add_static_expression(static_expression)
         
     | 
| 
         @@ -161,10 +161,11 @@ module Glimmer 
     | 
|
| 
       161 
161 
     | 
    
         
             
                    end
         
     | 
| 
       162 
162 
     | 
    
         | 
| 
       163 
163 
     | 
    
         
             
                    # Interprets Glimmer dynamic DSL expression consisting of keyword, args, and block (e.g. shell(:no_resize) { ... })
         
     | 
| 
       164 
     | 
    
         
            -
                    def interpret(keyword, *args, &block) 
     | 
| 
      
 164 
     | 
    
         
            +
                    def interpret(keyword, *args, &block)
         
     | 
| 
       165 
165 
     | 
    
         
             
                      return puts(MESSAGE_NO_DSLS) if no_dsls?
         
     | 
| 
       166 
166 
     | 
    
         
             
                      keyword = keyword.to_s
         
     | 
| 
       167 
167 
     | 
    
         
             
                      dynamic_expression_dsl = (dynamic_expression_chains_of_responsibility.keys - disabled_dsls).first if dsl.nil?
         
     | 
| 
      
 168 
     | 
    
         
            +
                      # TODO consider pushing this code into interpret_expresion to provide hooks that work around it regardless of static vs dynamic
         
     | 
| 
       168 
169 
     | 
    
         
             
                      dsl_stack.push(dynamic_expression_dsl || dsl)
         
     | 
| 
       169 
170 
     | 
    
         
             
                      expression = dynamic_expression_chains_of_responsibility[dsl].handle(parent, keyword, *args, &block)
         
     | 
| 
       170 
171 
     | 
    
         
             
                      interpret_expression(expression, keyword, *args, &block)
         
     | 
| 
         @@ -185,7 +186,7 @@ module Glimmer 
     | 
|
| 
       185 
186 
     | 
    
         
             
                    def add_content(parent, expression, &block)
         
     | 
| 
       186 
187 
     | 
    
         
             
                      if block_given? && expression.is_a?(ParentExpression)
         
     | 
| 
       187 
188 
     | 
    
         
             
                        dsl_stack.push(expression.class.dsl)
         
     | 
| 
       188 
     | 
    
         
            -
                        parent_stack.push(parent) 
     | 
| 
      
 189 
     | 
    
         
            +
                        parent_stack.push(parent)
         
     | 
| 
       189 
190 
     | 
    
         
             
                        begin
         
     | 
| 
       190 
191 
     | 
    
         
             
                          expression.add_content(parent, &block)
         
     | 
| 
       191 
192 
     | 
    
         
             
                        ensure
         
     |