glimmer 0.2.1 → 0.2.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 4b8ff1cec163aa46e0b080c1cb6120839665172846db445d6c31e1593f18f8cf
4
- data.tar.gz: 5dcd208fdae24f6ed7d3f8880ab98f4fa3dad05266135bdbf17a7f404de4b997
3
+ metadata.gz: 4916b9c2b6c19c4afbdb4a49cc586d7c1a12358a94ee5f425b78520227cf3c8f
4
+ data.tar.gz: 7ce6d54b43cfecb43fe395ab6a7b39d4db928ad674f9ce26b0635c457a611f91
5
5
  SHA512:
6
- metadata.gz: 1090019bcd5de2ae940218ab836ccf1778ae1fd4fd4069e8fe52879746726677d968e1244a111dd17dd05149ec2881f47d4592db276d2f7f49f6e357774db72f
7
- data.tar.gz: bdf6ba912826c63ff7c9289abb832ce6e3059c16fd857f195098a2dc02b995ce849e1e3cfd8d35e38922a553619759a9a72afb3ebb60bed0b6fe74ef623276a1
6
+ metadata.gz: c16290f6cd39289717bd5f2446d2d42a00c1b08298f5d1ddea658e8efaa738cfdfa2e79512fae0ba3120dcb9d07fef946967c3467f28916b91f9171fc147c5cb
7
+ data.tar.gz: f51597bec5ef7193ea66f089243b29fc90c0bf406abcb7aa2dc6e1c66f31aefd210c840682c47dbfd1732ebabda0331e95c3f1efd07072df93926fe3493a84ab
@@ -66,14 +66,14 @@ Please follow these instructions to make the `glimmer` command available on your
66
66
 
67
67
  Run this command to install directly:
68
68
  ```
69
- jgem install glimmer -v 0.2.0
69
+ jgem install glimmer -v 0.2.2
70
70
  ```
71
71
 
72
72
  ### Option 2: Bundler
73
73
 
74
74
  Add the following to `Gemfile`:
75
75
  ```
76
- gem 'glimmer', '~> 0.2.0'
76
+ gem 'glimmer', '~> 0.2.2'
77
77
  ```
78
78
 
79
79
  And, then run:
@@ -131,6 +131,7 @@ Data-binding is done with `bind` command following widget property to bind and t
131
131
  Data-binding examples:
132
132
  - `text bind(contact, :first_name)`
133
133
  - `text bind(contact, 'address.street')`
134
+ - `text bind(contact, 'addresses[1].street')`
134
135
  - `text bind(contact, :name, computed_by: [:first_name, :last_name])`
135
136
 
136
137
  The first example binds the text property of a widget like `label` to the first name of a contact model.
@@ -138,7 +139,9 @@ The first example binds the text property of a widget like `label` to the first
138
139
  The second example binds the text property of a widget like `label` to the nested street of
139
140
  the address of a contact. This is called nested property data binding.
140
141
 
141
- The third example demonstrates computed value data binding whereby the value of `name` depends on changes to both `first_name` and `last_name`
142
+ The third example binds the text property of a widget like `label` to the nested indexed address street of a contact. This is called nested indexed property data binding.
143
+
144
+ The fourth example demonstrates computed value data binding whereby the value of `name` depends on changes to both `first_name` and `last_name`
142
145
 
143
146
  You may learn more about Glimmer's syntax by reading the Eclipse Zone Tutorial mentioned in resources and opening up the samples under the `samples` folder.
144
147
 
@@ -44,14 +44,6 @@ class BindCommandHandler
44
44
  binding_options = args[2] if args[2].is_a?(Hash)
45
45
  binding_options = args[3] if args[3].is_a?(Hash)
46
46
  ModelBinding.new(args[0], args[1].to_s, property_type, binding_options)
47
- #TODO replace ModelObserver with something else. It's inaccurate
48
- # it doesn't observe the model, it updates it, observing the widget
49
- # yet also contains information about observing the model, like the property
50
- # to observe. That's the real object spit out here. Must name is something else.
51
- # Maybe call ModelBinding and spin off Observer as ModelPropertyUpdateCommand
52
- # similarly create a WidgetPropertyUpdateCommand (execute not update method)
53
- # Have an observer be a general thin skeleton with an update method instead.
54
- # In the future, switch observer to a simple block.
55
47
  end
56
48
 
57
49
  end
@@ -7,7 +7,7 @@ class BlockObserver
7
7
  @updater = updater
8
8
  end
9
9
 
10
- def update(changed_value)
10
+ def update(changed_value=nil)
11
11
  @updater.call(changed_value)
12
12
  end
13
13
  end
@@ -23,8 +23,19 @@ class ModelBinding
23
23
  def nested_models
24
24
  @nested_models = [base_model]
25
25
  model_property_names.reduce(base_model) do |reduced_model, nested_model_property_name|
26
- reduced_model.send(nested_model_property_name).tap do |new_reduced_model|
26
+ if reduced_model.nil?
27
+ nil
28
+ else
29
+ if nested_model_property_name.start_with?('[')
30
+ property_method = '[]'
31
+ property_argument = nested_model_property_name[1...-1]
32
+ property_argument = property_argument.to_i if property_argument.match(/\d+/)
33
+ new_reduced_model = reduced_model.send(property_method, property_argument)
34
+ else
35
+ new_reduced_model = reduced_model.send(nested_model_property_name)
36
+ end
27
37
  @nested_models << new_reduced_model
38
+ new_reduced_model
28
39
  end
29
40
  end
30
41
  @nested_models
@@ -39,9 +50,11 @@ class ModelBinding
39
50
  nested_property? ? nested_property_name : property_name_expression
40
51
  end
41
52
  # All nested property names
42
- # e.g. property name expression "address.state" gives [:address, :state]
53
+ # e.g. property name expression "address.state" gives ['address', 'state']
54
+ # If there are any indexed property names, this returns indexes as properties.
55
+ # e.g. property name expression "addresses[1].state" gives ['addresses', '[1]', 'state']
43
56
  def nested_property_names
44
- property_name_expression.split(".")
57
+ @nested_property_names ||= property_name_expression.split(".").map {|pne| pne.match(/([^\[]+)(\[[^\]]+\])?/).to_a.drop(1)}.flatten.compact
45
58
  end
46
59
  # Final nested property name
47
60
  # e.g. property name expression "address.state" gives :state
@@ -78,8 +91,15 @@ class ModelBinding
78
91
  if nested_property?
79
92
  nested_property_observers = nested_property_observers_for(observer)
80
93
  nested_models.zip(nested_property_names).each do |model, property_name|
81
- model.extend ObservableModel unless model.is_a?(ObservableModel)
82
- model.add_observer(property_name, nested_property_observers[property_name]) unless model.has_observer?(property_name, nested_property_observers[property_name])
94
+ unless model.nil?
95
+ if property_name.start_with?('[')
96
+ model.extend ObservableArray unless model.is_a?(ObservableArray)
97
+ model.add_array_observer(nested_property_observers[property_name]) unless model.has_array_observer?(nested_property_observers[property_name])
98
+ else
99
+ model.extend ObservableModel unless model.is_a?(ObservableModel)
100
+ model.add_observer(property_name, nested_property_observers[property_name]) unless model.has_observer?(property_name, nested_property_observers[property_name])
101
+ end
102
+ end
83
103
  end
84
104
  else
85
105
  model.extend ObservableModel unless model.is_a?(ObservableModel)
@@ -87,14 +107,15 @@ class ModelBinding
87
107
  end
88
108
  end
89
109
  def update(value)
110
+ return if model.nil?
90
111
  converted_value = @@property_type_converters[@property_type].call(value)
91
112
  model.send(property_name + "=", converted_value) unless evaluate_property == converted_value
92
113
  end
93
114
  def evaluate_property
94
- model.send(property_name)
115
+ model.send(property_name) unless model.nil?
95
116
  end
96
117
  def evaluate_options_property
97
- model.send(property_name + "_options")
118
+ model.send(property_name + "_options") unless model.nil?
98
119
  end
99
120
  def options_property_name
100
121
  self.property_name + "_options"
@@ -11,6 +11,14 @@ module ObservableArray
11
11
  end
12
12
  end
13
13
 
14
+ def add_array_observer(observer)
15
+ property_observer_list << observer
16
+ end
17
+
18
+ def has_array_observer?(observer)
19
+ property_observer_list.include?(observer)
20
+ end
21
+
14
22
  def property_observer_list
15
23
  @property_observer_list = Set.new unless @property_observer_list
16
24
  @property_observer_list
@@ -21,31 +29,34 @@ module ObservableArray
21
29
  end
22
30
 
23
31
  def self.extend_object(array)
24
- array.instance_eval("alias original_add <<")
32
+ array.instance_eval("alias __original_add__ <<")
25
33
  array.instance_eval <<-end_eval, __FILE__, __LINE__
26
34
  def <<(value)
27
- self.original_add(value)
35
+ self.__original_add__(value)
28
36
  notify_observers
29
37
  end
30
38
  end_eval
31
39
 
32
- notify_observers_on_invokation(array, "delete", 1)
33
- notify_observers_on_invokation(array, "delete_at", 1)
40
+ array.instance_eval("alias __original_set_value__ []=")
41
+ array.instance_eval <<-end_eval, __FILE__, __LINE__
42
+ def []=(index, value)
43
+ self.__original_set_value__(index, value)
44
+ notify_observers
45
+ end
46
+ end_eval
47
+
48
+ notify_observers_on_invokation(array, "delete")
49
+ notify_observers_on_invokation(array, "delete_at")
34
50
  notify_observers_on_invokation(array, "clear")
35
51
 
36
52
  super
37
53
  end
38
54
 
39
- def self.notify_observers_on_invokation(model, method, argument_count=0)
40
- model.instance_eval "alias original_#{method} #{method}\n"
41
- arguments = ""
42
- for index in 1..argument_count
43
- arguments += "argument" + index.to_s + ","
44
- end
45
- arguments = arguments[0..-2]
55
+ def self.notify_observers_on_invokation(model, method)
56
+ model.instance_eval "alias __original_#{method}__ #{method}\n"
46
57
  model.instance_eval <<-end_eval, __FILE__, __LINE__
47
- def #{method}(#{arguments})
48
- self.original_#{method}(#{arguments})
58
+ def #{method}(*args, &block)
59
+ self.__original_#{method}__(*args, &block)
49
60
  notify_observers
50
61
  end
51
62
  end_eval
@@ -26,11 +26,11 @@ This runs the Glimmer application hello_world.rb
26
26
  end
27
27
 
28
28
  def jruby_command_options
29
- "#{jruby_os_specific_options} -J-classpath \"#{swt_jar_file}\" -r glimmer"
29
+ "#{jruby_os_specific_options} -J-classpath \"#{swt_jar_file}\""
30
30
  end
31
31
 
32
32
  def launch(application)
33
- system "jruby #{jruby_command_options} -S #{application}"
33
+ system "jruby #{jruby_command_options} -r glimmer -S #{application}"
34
34
  end
35
35
  end
36
36
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: glimmer
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.1
4
+ version: 0.2.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - AndyMaleh