Module: Glimmer

Defined in:
lib/glimmer.rb,
lib/glimmer/error.rb,
lib/glimmer/config.rb,
lib/glimmer/dsl/engine.rb,
lib/glimmer/dsl/expression.rb,
lib/glimmer/data_binding/observer.rb,
lib/glimmer/dsl/parent_expression.rb,
lib/glimmer/dsl/static_expression.rb,
lib/glimmer/invalid_keyword_error.rb,
lib/glimmer/dsl/expression_handler.rb,
lib/glimmer/excluded_keyword_error.rb,
lib/glimmer/data_binding/observable.rb,
lib/glimmer/dsl/top_level_expression.rb,
lib/glimmer/data_binding/model_binding.rb,
lib/glimmer/data_binding/observable_array.rb,
lib/glimmer/data_binding/observable_model.rb

Overview

Glimmer provides a JRuby Desktop UI DSL + Data-Binding functionality

A desktop UI application class must include Glimmer to gain access to Glimmer DSL

Glimmer DSL static keywords (e.g. rgb, bind, etc..) are available as inherited methods Glimmer DSL dynamic keywords (e.g. label, combo, etc…) are available via method_missing

Defined Under Namespace

Modules: Config, DSL, DataBinding Classes: Error, ExcludedKeywordError, InvalidKeywordError

Constant Summary collapse

REGEX_METHODS_EXCLUDED =

TODO make it configurable to include or not include perhaps reverting to using included

/^(to_|\[)/

Class Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Dynamic Method Handling

This class handles dynamic methods through the method_missing method

#method_missing(method_symbol, *args, &block) ⇒ Object



40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
# File 'lib/glimmer.rb', line 40

def method_missing(method_symbol, *args, &block)
  new_loop_data = [method_symbol, args, block]
  if new_loop_data == Glimmer.loop_last_data
    Glimmer.loop_increment!
    if Glimmer.loop == Config.loop_max_count
      raise "Glimmer looped #{Config.loop_max_count} times with keyword '#{new_loop_data[0]}'! Check code for errors."
    end
  else
    Glimmer.loop_reset!
  end
  Glimmer.loop_last_data = new_loop_data
  # This if statement speeds up Glimmer in girb or whenever directly including on main object
  if method_symbol.to_s.match(REGEX_METHODS_EXCLUDED)
    raise ExcludedKeywordError, "Glimmer excluded keyword: #{method_symbol}"
  end
  Glimmer::Config.logger&.debug "Interpreting keyword: #{method_symbol}"
  Glimmer::DSL::Engine.interpret(method_symbol, *args, &block)
rescue ExcludedKeywordError => e
  # TODO add a feature to show excluded keywords optionally for debugging purposes
  super(method_symbol, *args, &block)
rescue InvalidKeywordError => e
  if !method_symbol.to_s.match(REGEX_METHODS_EXCLUDED)
    Glimmer::Config.logger&.error e.message
  end
  Glimmer::Config.logger&.debug "#{e.message}\n#{e.backtrace.join("\n")}"
  super(method_symbol, *args, &block)
end

Class Attribute Details

.loop_last_dataObject

Returns the value of attribute loop_last_data.



24
25
26
# File 'lib/glimmer.rb', line 24

def loop_last_data
  @loop_last_data
end

Class Method Details

.loopObject



31
32
33
# File 'lib/glimmer.rb', line 31

def loop
  @loop ||= loop_reset!
end

.loop_increment!Object



35
36
37
# File 'lib/glimmer.rb', line 35

def loop_increment!
  @loop = loop + 1
end

.loop_reset!(including_loop_last_data = false) ⇒ Object



26
27
28
29
# File 'lib/glimmer.rb', line 26

def loop_reset!(including_loop_last_data = false)
  @loop_last_data = nil if including_loop_last_data
  @loop = 1
end