motion-loco 0.2.2 → 0.3.0
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/README.md +0 -35
- data/lib/motion-loco/associatable.rb +18 -13
- data/lib/motion-loco/fixture_adapter.rb +2 -1
- data/lib/motion-loco/observable.rb +4 -8
- data/lib/motion-loco/record_array.rb +2 -1
- data/lib/motion-loco/text_alignable.rb +47 -0
- data/lib/motion-loco/version.rb +1 -1
- data/lib/motion-loco/views.rb +23 -40
- metadata +4 -4
- data/lib/motion-loco/table_view.rb +0 -114
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 8365d10e57e456f796f6847f82ed4c65d0ca82c1
|
4
|
+
data.tar.gz: aacf5c5adfc39986d23e112c66eb941e900bda0e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 993356f6d2402a523fcfb23f1d9f5fd95850a8f286dc71c286e857dba84fc8a11ae0702a42f5e3ed70f28effe34766f053afe1f3a41658114beba2e3186afe57
|
7
|
+
data.tar.gz: 0935b838d4ef0981bd77d1811419e98181592d86cf8d788cd83cd2f1eba3f1408d0ab4bce5563331ba80015a134f7fb7874813e6d7e91c4db0fb69264d1e8637
|
data/README.md
CHANGED
@@ -106,41 +106,6 @@ PersonController.content = @person
|
|
106
106
|
@label.text # "Brian Pattison"
|
107
107
|
```
|
108
108
|
|
109
|
-
### Loco::UI::TableView
|
110
|
-
|
111
|
-
A `Loco::UI::TableView` is used for to easily bind a collection of objects
|
112
|
-
to a `UITableView` and each item in the collection to a reusable `UITableViewCell`.
|
113
|
-
|
114
|
-
```ruby
|
115
|
-
class MyTableViewCell < Loco::UI::TableViewCell
|
116
|
-
# The `view_setup` method is called the first time the cell is created.
|
117
|
-
# Bindings can be made to the item assigned to the cell
|
118
|
-
# by binding to `parentView.content`.
|
119
|
-
def view_setup
|
120
|
-
@label = Loco::UI::Label.alloc.initWithFrame(
|
121
|
-
textBinding: 'parentView.content.first_name',
|
122
|
-
height: 30,
|
123
|
-
left: 60,
|
124
|
-
right: 30,
|
125
|
-
top: 5
|
126
|
-
)
|
127
|
-
self.addSubview(@label)
|
128
|
-
end
|
129
|
-
end
|
130
|
-
|
131
|
-
class MyTableView < Loco::UI::TableView
|
132
|
-
item_view_class MyTableViewCell
|
133
|
-
end
|
134
|
-
|
135
|
-
@table_view = MyTableView.alloc.initWithFrame(
|
136
|
-
content: [Person.new(first_name: 'Brian'), Person.new(first_name: 'Kirsten')],
|
137
|
-
bottom: 0,
|
138
|
-
left: 0,
|
139
|
-
right: 0,
|
140
|
-
top: 0
|
141
|
-
)
|
142
|
-
```
|
143
|
-
|
144
109
|
### Loco::FixtureAdapter
|
145
110
|
|
146
111
|
```ruby
|
@@ -10,20 +10,20 @@ module Loco
|
|
10
10
|
|
11
11
|
def initialize_relationships
|
12
12
|
self.class.get_class_relationships.select{|relationship| relationship[:has_many] }.each do |relationship|
|
13
|
-
has_many_class = relationship[:has_many].to_s.classify.constantize
|
14
|
-
self.send("#{relationship[:has_many]}=", RecordArray.new(item_class: has_many_class, belongs_to: self))
|
13
|
+
has_many_class = relationship[:class_name] ? relationship[:class_name].to_s.classify.constantize : relationship[:has_many].to_s.classify.constantize
|
14
|
+
self.send("#{relationship[:has_many]}=", RecordArray.new(relationship: relationship, item_class: has_many_class, belongs_to: self))
|
15
15
|
self.send("#{relationship[:has_many].to_s.singularize}_ids=", [])
|
16
16
|
end
|
17
17
|
end
|
18
18
|
|
19
19
|
module ClassMethods
|
20
20
|
|
21
|
-
def belongs_to(model)
|
21
|
+
def belongs_to(model, options={})
|
22
22
|
attr_accessor model
|
23
23
|
attr_accessor "#{model}_id"
|
24
24
|
|
25
25
|
define_method "#{model}" do |&block|
|
26
|
-
belongs_to_class = model.to_s.classify.constantize
|
26
|
+
belongs_to_class = options[:class_name] ? options[:class_name].to_s.classify.constantize : model.to_s.classify.constantize
|
27
27
|
record = instance_variable_get("@#{model}")
|
28
28
|
if record
|
29
29
|
block.call(record) if block.is_a? Proc
|
@@ -43,24 +43,26 @@ module Loco
|
|
43
43
|
end
|
44
44
|
|
45
45
|
define_method "#{model}=" do |record|
|
46
|
-
belongs_to_class = model.to_s.classify.constantize
|
46
|
+
belongs_to_class = options[:class_name] ? options[:class_name].to_s.classify.constantize : model.to_s.classify.constantize
|
47
47
|
raise TypeError, "Expecting a #{belongs_to_class} as defined by #belongs_to :#{model}" unless record.is_a? belongs_to_class
|
48
48
|
instance_variable_set("@#{model}", record)
|
49
49
|
self.send("#{model}_id=", (record.nil? ? nil : record.id))
|
50
50
|
record
|
51
51
|
end
|
52
52
|
|
53
|
+
alias_method model.to_s.camelize(:lower), model
|
54
|
+
alias_method "#{model.to_s.camelize(:lower)}=", "#{model}="
|
55
|
+
|
53
56
|
relationships = get_class_relationships
|
54
|
-
relationships << { belongs_to: model }
|
57
|
+
relationships << { belongs_to: model, class_name: options[:class_name] }
|
55
58
|
end
|
56
59
|
|
57
|
-
def has_many(model)
|
60
|
+
def has_many(model, options={})
|
58
61
|
attr_accessor model
|
59
62
|
attr_accessor "#{model.to_s.singularize}_ids"
|
60
63
|
|
61
64
|
define_method "#{model}" do |&block|
|
62
|
-
has_many_class = model.to_s.singularize.classify.constantize
|
63
|
-
|
65
|
+
has_many_class = options[:class_name] ? options[:class_name].to_s.classify.constantize : model.to_s.singularize.classify.constantize
|
64
66
|
record_array = instance_variable_get("@#{model}")
|
65
67
|
if record_array.is_loaded
|
66
68
|
block.call(record_array) if block.is_a? Proc
|
@@ -76,7 +78,8 @@ module Loco
|
|
76
78
|
record_array.load(array)
|
77
79
|
else
|
78
80
|
query = {}
|
79
|
-
|
81
|
+
foreign_key = options[:foreign_key] ? options[:foreign_key] : "#{self.class.to_s.underscore.singularize}_id"
|
82
|
+
query[foreign_key] = self.id
|
80
83
|
array = has_many_class.find(query) do |records|
|
81
84
|
record_array.load(records)
|
82
85
|
instance_variable_set("@#{model}", record_array)
|
@@ -90,8 +93,7 @@ module Loco
|
|
90
93
|
end
|
91
94
|
|
92
95
|
define_method "#{model}=" do |records|
|
93
|
-
has_many_class = model.to_s.singularize.classify.constantize
|
94
|
-
|
96
|
+
has_many_class = options[:class_name] ? options[:class_name].to_s.classify.constantize : model.to_s.singularize.classify.constantize
|
95
97
|
if (records.is_a?(RecordArray) || records.is_a?(Array)) && (records.length == 0 || (records.length > 0 && records.first.class == has_many_class))
|
96
98
|
unless records.is_a?(RecordArray)
|
97
99
|
record_array = RecordArray.new(item_class: has_many_class, belongs_to: self)
|
@@ -107,8 +109,11 @@ module Loco
|
|
107
109
|
records
|
108
110
|
end
|
109
111
|
|
112
|
+
alias_method model.to_s.camelize(:lower), model
|
113
|
+
alias_method "#{model.to_s.camelize(:lower)}=", "#{model}="
|
114
|
+
|
110
115
|
relationships = get_class_relationships
|
111
|
-
relationships << { has_many: model }
|
116
|
+
relationships << { has_many: model, class_name: options[:class_name] }
|
112
117
|
end
|
113
118
|
|
114
119
|
end
|
@@ -13,7 +13,8 @@ module Loco
|
|
13
13
|
def find(record, id, &block)
|
14
14
|
type = record.class
|
15
15
|
error = Pointer.new(:id)
|
16
|
-
|
16
|
+
filename = File.join(NSBundle.mainBundle.resourcePath, "fixtures", "#{type.to_s.underscore.gsub('nskvo_notifying_', '').pluralize}.json")
|
17
|
+
file = File.read(filename)
|
17
18
|
data = NSJSONSerialization.JSONObjectWithData(file.to_data, options:JSON_OPTIONS, error:error).find{|obj| obj[:id] == id }
|
18
19
|
if data
|
19
20
|
load(type, record, data)
|
@@ -20,14 +20,6 @@ module Loco
|
|
20
20
|
self
|
21
21
|
end
|
22
22
|
|
23
|
-
# Used to create observable table view cells
|
24
|
-
def initWithStyle(style, reuseIdentifier:reuseIdentifier)
|
25
|
-
super
|
26
|
-
initialize_bindings
|
27
|
-
set_properties({})
|
28
|
-
self
|
29
|
-
end
|
30
|
-
|
31
23
|
# Change one or many properties from a hash of properties with values.
|
32
24
|
# @param [Hash] properties_hash
|
33
25
|
def set_properties(properties_hash)
|
@@ -36,6 +28,7 @@ module Loco
|
|
36
28
|
self.send("#{key}=", value)
|
37
29
|
end
|
38
30
|
end
|
31
|
+
alias_method :setProperties, :set_properties
|
39
32
|
|
40
33
|
# Change one or many properties from a hash of properties with values.
|
41
34
|
# Only updates attributes defined with #property.
|
@@ -48,6 +41,7 @@ module Loco
|
|
48
41
|
end
|
49
42
|
end
|
50
43
|
end
|
44
|
+
alias_method :updateAttributes, :update_attributes
|
51
45
|
|
52
46
|
def method_missing(method, *args, &block)
|
53
47
|
if method.end_with?('_binding=') || method.end_with?('Binding=')
|
@@ -143,6 +137,8 @@ module Loco
|
|
143
137
|
|
144
138
|
unless @class_properties.include? name
|
145
139
|
attr_accessor name
|
140
|
+
alias_method name.to_s.camelize(:lower), name
|
141
|
+
alias_method "#{name.to_s.camelize(:lower)}=", "#{name}="
|
146
142
|
end
|
147
143
|
|
148
144
|
if type.is_a? Proc
|
@@ -9,6 +9,7 @@ module Loco
|
|
9
9
|
property :is_loaded, :string
|
10
10
|
property :item_class
|
11
11
|
property :length, :integer
|
12
|
+
property :relationship, :hash
|
12
13
|
|
13
14
|
def <<(record)
|
14
15
|
self.addObjectsFromArray([record])
|
@@ -56,7 +57,7 @@ module Loco
|
|
56
57
|
def update_properties
|
57
58
|
self.length = self.content.length
|
58
59
|
if self.belongs_to
|
59
|
-
self.belongs_to.send("#{self.
|
60
|
+
self.belongs_to.send("#{self.relationship[:has_many].to_s.singularize}_ids=", self.content.map(&:id))
|
60
61
|
end
|
61
62
|
end
|
62
63
|
|
@@ -0,0 +1,47 @@
|
|
1
|
+
module Loco
|
2
|
+
|
3
|
+
module TextAlignable
|
4
|
+
|
5
|
+
def text_align
|
6
|
+
case self.textAlignment
|
7
|
+
when NSTextAlignmentLeft
|
8
|
+
'left'
|
9
|
+
when NSTextAlignmentCenter
|
10
|
+
'center'
|
11
|
+
when NSTextAlignmentRight
|
12
|
+
'right'
|
13
|
+
when NSTextAlignmentJustified
|
14
|
+
'justified'
|
15
|
+
when NSTextAlignmentNatural
|
16
|
+
'natural'
|
17
|
+
end
|
18
|
+
end
|
19
|
+
alias_method :textAlign, :text_align
|
20
|
+
|
21
|
+
def text_align=(alignment)
|
22
|
+
case alignment
|
23
|
+
when 'left'
|
24
|
+
self.textAlignment = NSTextAlignmentLeft
|
25
|
+
when 'center'
|
26
|
+
self.textAlignment = NSTextAlignmentCenter
|
27
|
+
when 'right'
|
28
|
+
self.textAlignment = NSTextAlignmentRight
|
29
|
+
when 'justified'
|
30
|
+
self.textAlignment = NSTextAlignmentJustified
|
31
|
+
when 'natural'
|
32
|
+
self.textAlignment = NSTextAlignmentNatural
|
33
|
+
end
|
34
|
+
end
|
35
|
+
alias_method :textAlign=, :text_align=
|
36
|
+
|
37
|
+
def textAlignment=(alignment)
|
38
|
+
if alignment.is_a? String
|
39
|
+
self.text_align = alignment
|
40
|
+
else
|
41
|
+
super
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
end
|
46
|
+
|
47
|
+
end
|
data/lib/motion-loco/version.rb
CHANGED
data/lib/motion-loco/views.rb
CHANGED
@@ -19,46 +19,7 @@ module Loco
|
|
19
19
|
|
20
20
|
class Label < UILabel
|
21
21
|
include Resizable
|
22
|
-
|
23
|
-
def text_align
|
24
|
-
case self.textAlignment
|
25
|
-
when NSTextAlignmentLeft
|
26
|
-
'left'
|
27
|
-
when NSTextAlignmentCenter
|
28
|
-
'center'
|
29
|
-
when NSTextAlignmentRight
|
30
|
-
'right'
|
31
|
-
when NSTextAlignmentJustified
|
32
|
-
'justified'
|
33
|
-
when NSTextAlignmentNatural
|
34
|
-
'natural'
|
35
|
-
end
|
36
|
-
end
|
37
|
-
alias_method :textAlign, :text_align
|
38
|
-
|
39
|
-
def text_align=(alignment)
|
40
|
-
case alignment
|
41
|
-
when 'left'
|
42
|
-
self.textAlignment = NSTextAlignmentLeft
|
43
|
-
when 'center'
|
44
|
-
self.textAlignment = NSTextAlignmentCenter
|
45
|
-
when 'right'
|
46
|
-
self.textAlignment = NSTextAlignmentRight
|
47
|
-
when 'justified'
|
48
|
-
self.textAlignment = NSTextAlignmentJustified
|
49
|
-
when 'natural'
|
50
|
-
self.textAlignment = NSTextAlignmentNatural
|
51
|
-
end
|
52
|
-
end
|
53
|
-
alias_method :textAlign=, :text_align=
|
54
|
-
|
55
|
-
def textAlignment=(alignment)
|
56
|
-
if alignment.is_a? String
|
57
|
-
self.text_align = alignment
|
58
|
-
else
|
59
|
-
super
|
60
|
-
end
|
61
|
-
end
|
22
|
+
include TextAlignable
|
62
23
|
end
|
63
24
|
|
64
25
|
class PageControl < UIPageControl
|
@@ -80,6 +41,28 @@ module Loco
|
|
80
41
|
class Slider < UISlider
|
81
42
|
include Resizable
|
82
43
|
end
|
44
|
+
|
45
|
+
class TableView < UITableView
|
46
|
+
include Resizable
|
47
|
+
end
|
48
|
+
|
49
|
+
class TableViewCell < UITableViewCell
|
50
|
+
include Observable
|
51
|
+
|
52
|
+
property :content
|
53
|
+
|
54
|
+
def initWithStyle(style, reuseIdentifier:reuseIdentifier)
|
55
|
+
initialize_bindings
|
56
|
+
set_properties({})
|
57
|
+
view_setup # Needed because it's not Loco::Resizable
|
58
|
+
self
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
class TextField < UITextField
|
63
|
+
include Resizable
|
64
|
+
include TextAlignable
|
65
|
+
end
|
83
66
|
|
84
67
|
class TextView < UITextView
|
85
68
|
include Resizable
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: motion-loco
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Brian Pattison
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2013-09-
|
11
|
+
date: 2013-09-27 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: awesome_print_motion
|
@@ -104,7 +104,7 @@ files:
|
|
104
104
|
- lib/motion-loco/resizable.rb
|
105
105
|
- lib/motion-loco/rest_adapter.rb
|
106
106
|
- lib/motion-loco/sqlite_adapter.rb
|
107
|
-
- lib/motion-loco/
|
107
|
+
- lib/motion-loco/text_alignable.rb
|
108
108
|
- lib/motion-loco/version.rb
|
109
109
|
- lib/motion-loco/view_controller.rb
|
110
110
|
- lib/motion-loco/views.rb
|
@@ -129,7 +129,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
129
129
|
version: '0'
|
130
130
|
requirements: []
|
131
131
|
rubyforge_project:
|
132
|
-
rubygems_version: 2.1.
|
132
|
+
rubygems_version: 2.1.5
|
133
133
|
signing_key:
|
134
134
|
specification_version: 4
|
135
135
|
summary: Library for RubyMotion that includes Ember.js inspired bindings, computed
|
@@ -1,114 +0,0 @@
|
|
1
|
-
motion_require 'observable'
|
2
|
-
motion_require 'resizable'
|
3
|
-
|
4
|
-
module Loco
|
5
|
-
|
6
|
-
module UI
|
7
|
-
|
8
|
-
class TableViewCell < UITableViewCell
|
9
|
-
include Observable
|
10
|
-
|
11
|
-
property :content
|
12
|
-
|
13
|
-
def initWithStyle(style, reuseIdentifier:reuseIdentifier)
|
14
|
-
if super
|
15
|
-
view_setup # Needed because it's not Loco::Resizable
|
16
|
-
end
|
17
|
-
self
|
18
|
-
end
|
19
|
-
|
20
|
-
def select
|
21
|
-
Loco.debug("Override #{self.class}#select with the action to take when the row is selected")
|
22
|
-
end
|
23
|
-
|
24
|
-
def view_controller(superview=nil)
|
25
|
-
if superview
|
26
|
-
view_controller = superview.nextResponder
|
27
|
-
else
|
28
|
-
view_controller = self.superview.nextResponder
|
29
|
-
end
|
30
|
-
if view_controller.is_a? UIViewController
|
31
|
-
view_controller
|
32
|
-
elsif view_controller.is_a? UIView
|
33
|
-
self.view_controller(view_controller)
|
34
|
-
end
|
35
|
-
end
|
36
|
-
alias_method :viewController, :view_controller
|
37
|
-
|
38
|
-
def view_setup
|
39
|
-
viewSetup
|
40
|
-
end
|
41
|
-
|
42
|
-
def viewSetup
|
43
|
-
Loco.debug("Override #{self.class}#viewSetup or #{self.class}#view_setup to customize the view")
|
44
|
-
end
|
45
|
-
end
|
46
|
-
|
47
|
-
class TableView < UITableView
|
48
|
-
include Resizable
|
49
|
-
include Observable
|
50
|
-
|
51
|
-
property :content
|
52
|
-
|
53
|
-
def content=(value)
|
54
|
-
super
|
55
|
-
self.reloadData
|
56
|
-
end
|
57
|
-
|
58
|
-
def cell_id
|
59
|
-
@cell_id ||= "CELL_#{self.object_id}"
|
60
|
-
end
|
61
|
-
|
62
|
-
def initWithFrame(frame)
|
63
|
-
super(frame)
|
64
|
-
self.dataSource = self.delegate = self
|
65
|
-
end
|
66
|
-
|
67
|
-
def item_view_class
|
68
|
-
self.class.get_item_view_class
|
69
|
-
end
|
70
|
-
|
71
|
-
# UITableViewDelegate implementation for returning the cell at a given indexPath.
|
72
|
-
# @return [Loco::TableViewCell]
|
73
|
-
def tableView(tableView, cellForRowAtIndexPath:indexPath)
|
74
|
-
cell = tableView.dequeueReusableCellWithIdentifier(cell_id)
|
75
|
-
unless cell
|
76
|
-
cell = self.item_view_class.alloc.initWithStyle(UITableViewCellStyleDefault, reuseIdentifier:cell_id)
|
77
|
-
end
|
78
|
-
cell.content = self.content[indexPath.row]
|
79
|
-
cell
|
80
|
-
end
|
81
|
-
|
82
|
-
# UITableViewDelegate implementation for selecting a cell at a given indexPath.
|
83
|
-
def tableView(tableView, didSelectRowAtIndexPath:indexPath)
|
84
|
-
cell = tableView.cellForRowAtIndexPath(indexPath)
|
85
|
-
cell.select
|
86
|
-
end
|
87
|
-
|
88
|
-
# UITableViewDelegate implementation for returning the number of rows in a section.
|
89
|
-
# @return [Integer]
|
90
|
-
def tableView(tableView, numberOfRowsInSection:section)
|
91
|
-
if self.content.is_a? Array
|
92
|
-
self.content.length
|
93
|
-
else
|
94
|
-
0
|
95
|
-
end
|
96
|
-
end
|
97
|
-
|
98
|
-
class << self
|
99
|
-
|
100
|
-
def item_view_class(view_class)
|
101
|
-
@item_view_class = view_class
|
102
|
-
end
|
103
|
-
alias_method :itemViewClass, :item_view_class
|
104
|
-
|
105
|
-
def get_item_view_class
|
106
|
-
@item_view_class ||= TableViewCell
|
107
|
-
end
|
108
|
-
|
109
|
-
end
|
110
|
-
end
|
111
|
-
|
112
|
-
end
|
113
|
-
|
114
|
-
end
|