motion-prime 0.1.3 → 0.1.4

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,15 +1,15 @@
1
1
  ---
2
2
  !binary "U0hBMQ==":
3
3
  metadata.gz: !binary |-
4
- Yjc5ZTE2MmM1MzZjZjg1MmY4NzAyZmE1YTk1YTM2YjMxNzcwOTk2Ng==
4
+ NzcwMzdlNzc2NDFkODU4MzU1MzA2NjQ1NjcxYTg2MWMyODJmODkwYg==
5
5
  data.tar.gz: !binary |-
6
- MTlkMDA1NjI5ODJiYzEwM2NjM2E4MzUyZWQ5ZDc0N2YzYWY1YzgyMA==
6
+ MTcyZjUyODMwN2ZjMzAyMzU3NzVkZmNmYjA0MzY0ODY1ODliMDEyMQ==
7
7
  !binary "U0hBNTEy":
8
8
  metadata.gz: !binary |-
9
- NzZiYjU5Yjg0MTY3ZDU3ZThjOGE1MTVjYjRjNWMxZDU3MTg4NTA5ZWIyZTcz
10
- MTgxNTdkOGNiODI2MTZiZWU1Nzg2ZTYxOWUxZDk0MjM2ZWFhY2UyMzk5YjEw
11
- NzI4MzRmZWVjOTczYTZlZDE2ZWM3YWI5NjMxMDBjNzA4ODg0MjI=
9
+ ZTBlOTI1M2I0NDkyZmNiNzg5YWVjOTIwYzViYTQyZTZmNjdmM2U4MTIxY2Uz
10
+ YmVjMjQ4MGZkYjcxODY1MTRkMDkxYzQ1YTFiODY3MmEzM2M5Nzk4NzBkMDVi
11
+ OGUwYTI4ZTY0ZDVkMmNmN2Y2N2YzMGYyYzgwMjhkYjdhMzIyZTE=
12
12
  data.tar.gz: !binary |-
13
- MjY5MDgzMDIxOWViYjVkMWE5MGNlZGQwOWZmOTBlNmI3ZTU4Yzc3YzQwNjg3
14
- YWI3OGEwMDViMWZjNGEyMWFjNzU3YzZiN2JlODkyOTg2ZDk1NTY5NGNlNzNm
15
- M2IzODlkNzFiN2IzOWM1ZTBiMTdkNWY1NDhlNWI5NTU4ZTU3MTY=
13
+ NTFmZmNmZmU4YWNmZjUzY2VjNjY3NGEyZjQ4ZGU1YTYzYTc5ZTg5NGEwMTJm
14
+ N2FmMDA3YTg2ZjIzNDI2NTZkMzRjNDMwNmQ0ODhkZmI1YWVjNTRhZThlYzY3
15
+ ZjgwZmI4ZjhjNmM2NTBjMDBjYzVhYzg5MzU1NDhkNDA1Yjg3YmI=
data/CHANGELOG.md CHANGED
@@ -1,3 +1,9 @@
1
+ === 0.1.4 (Breaking changes)
2
+ * MotionPrime::BaseModel#sync_with_url renamed to fetch_with_url
3
+ * MotionPrime::BaseModel#sync_with_attributes renamed to fetch_with_attributes
4
+ * MotionPrime::BaseModel#sync_association renamed to fetch_association
5
+ * MotionPrime::BaseModel#sync_attributes renamed to updatable_attributes
6
+
1
7
  === 0.1.3
2
8
  * added google map element support
3
9
  * fixes for tabbed section
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- motion-prime (0.1.3)
4
+ motion-prime (0.1.4)
5
5
  bubble-wrap
6
6
  cocoapods
7
7
  motion-cocoapods
data/doc/FAQ.md ADDED
@@ -0,0 +1,2 @@
1
+ Q: Error: `Unable to find a specification for `Something``
2
+ A: Try running `pod install`
data/lib/motion-prime.rb CHANGED
@@ -3,12 +3,5 @@ require 'motion-require'
3
3
  Motion::Require.all(Dir.glob(File.expand_path('../../motion-prime/**/*.rb', __FILE__)))
4
4
 
5
5
  Motion::Project::App.setup do |app|
6
- app.pods do
7
- pod 'PKRevealController'
8
- pod 'NanoStore', '~> 2.7.7'
9
- pod 'SDWebImage'
10
- pod 'SVPullToRefresh'
11
- pod 'MBAlertView'
12
- end
13
6
  app.detect_dependencies = false
14
7
  end
@@ -11,7 +11,7 @@ module MotionPrime
11
11
 
12
12
  def initialize(options = {})
13
13
  @options = options
14
- @section = WeakRef.new(options.delete(:section))
14
+ @section = options.delete(:section)
15
15
  @name = options[:name]
16
16
  @block = options.delete(:block)
17
17
  @view_class = options.delete(:view_class) || "UIView"
@@ -19,7 +19,7 @@ module MotionPrime
19
19
  end
20
20
 
21
21
  def render(options = {}, &block)
22
- self.screen = options[:to]
22
+ @screen = options[:to]
23
23
  run_callbacks :render do
24
24
  render!(&block)
25
25
  end
@@ -24,9 +24,9 @@ module MotionPrime
24
24
 
25
25
  # calculate width if width is relative, e.g 0.7
26
26
  if width > 0 && width <= 1
27
- computed_max_width * width
27
+ width * computed_max_width
28
28
  else
29
- computed_max_width < width ? width : computed_max_width
29
+ width > computed_max_width ? computed_max_width : width
30
30
  end
31
31
  end
32
32
 
@@ -36,9 +36,9 @@ module MotionPrime
36
36
 
37
37
  # calculate height if height is relative, e.g 0.7
38
38
  if height > 0 && height <= 1
39
- computed_max_height * height
39
+ height * computed_max_height
40
40
  else
41
- computed_max_height < height ? height : computed_max_height
41
+ height > computed_max_height ? computed_max_height : height
42
42
  end
43
43
  end
44
44
 
@@ -1,10 +1,15 @@
1
1
  module MotionPrime
2
2
  module HasAuthorization
3
3
  def current_user
4
- @current_user = User.current
4
+ if defined?(User) && User.respond_to?(:current)
5
+ @current_user = User.current
6
+ end
7
+ end
8
+ def user_signed_in?
9
+ current_user.present?
5
10
  end
6
11
  def api_client
7
- @api_client ||= ApiClient.new(access_token: current_user.access_token)
12
+ @api_client ||= ApiClient.new(access_token: current_user.try(:access_token))
8
13
  end
9
14
  end
10
15
  end
@@ -70,7 +70,7 @@ module MotionPrime
70
70
  self.send(bag_name).clear
71
71
 
72
72
  association = association_name.classify.constantize.new
73
- association.sync_with_attributes(value)
73
+ association.fetch_with_attributes(value)
74
74
  association.save
75
75
  self.send(:"#{bag_name}") << association
76
76
  association
@@ -97,7 +97,7 @@ module MotionPrime
97
97
  association = []
98
98
  value.each do |attrs|
99
99
  model = association_name.classify.constantize.new
100
- model.sync_with_attributes(attrs)
100
+ model.fetch_with_attributes(attrs)
101
101
  association << model
102
102
  end
103
103
  self.send(:"#{bag_name}=", association)
@@ -7,7 +7,7 @@ motion_require './store_extension.rb'
7
7
  module MotionPrime
8
8
  class BaseModel < NSFNanoObject
9
9
  class_attribute :sync_url
10
- class_attribute :sync_attributes
10
+ class_attribute :_updatable_attributes
11
11
  class_attribute :_associations
12
12
  alias_method :attributes, :info
13
13
  include MotionPrime::HasAuthorization
@@ -32,6 +32,7 @@ module MotionPrime
32
32
  id.blank?
33
33
  end
34
34
 
35
+ # destroy on server and delete on local
35
36
  def destroy(&block)
36
37
  use_callback = block_given?
37
38
  api_client.delete(sync_url) do
@@ -40,41 +41,12 @@ module MotionPrime
40
41
  delete
41
42
  end
42
43
 
43
- # fetch attributes from url
44
- def sync_with_url(url, &block)
45
- api_client.get(url) do |data|
46
- if data.present?
47
- sync_with_attributes(data, &block)
48
- end
49
- end
50
- end
51
-
52
- def update_with_url(url, &block)
53
- use_callback = block_given?
54
- post_data = { model_name => filtered_sync_attributes}
55
- api_client.send(id ? :put : :post, url, post_data) do |data|
56
- self.id ||= data['id']
57
- block.call() if use_callback
58
- end
59
- end
60
-
61
- # set attributes
62
- def sync_with_attributes(attrs, &block)
63
- attrs.each do |key, value|
64
- if respond_to?(:"sync_#{key}")
65
- self.send(:"sync_#{key}", value)
66
- elsif respond_to?(:"#{key}=")
67
- self.send(:"#{key}=", value)
68
- end
69
- end
70
- block.call(self) if block_given?
71
- end
72
-
44
+ # sync with server and save on local
73
45
  def sync!(sync_options = {}, &block)
74
46
  sync(sync_options.merge(save: true), &block)
75
47
  end
76
48
 
77
- # sync with url and
49
+ # sync with with server
78
50
  # TODO: order of fetch/update should be based on updated time
79
51
  def sync(sync_options = {}, &block)
80
52
  use_callback = block_given?
@@ -84,7 +56,7 @@ module MotionPrime
84
56
  should_fetch = !new_record? if should_fetch.nil?
85
57
  should_update = new_record? if should_update.nil?
86
58
 
87
- sync_with_url self.sync_url do
59
+ fetch_with_url self.sync_url do
88
60
  save if sync_options[:save]
89
61
  block.call if use_callback
90
62
  end if should_fetch
@@ -93,24 +65,55 @@ module MotionPrime
93
65
  block.call if use_callback
94
66
  end if should_update
95
67
 
96
- sync_associations(sync_options)
68
+ fetch_associations(sync_options)
97
69
  end
98
70
 
99
- def sync_associations(sync_options = {})
71
+ # fetch from server using url
72
+ def fetch_with_url(url, &block)
73
+ api_client.get(url) do |data|
74
+ if data.present?
75
+ fetch_with_attributes(data, &block)
76
+ end
77
+ end
78
+ end
79
+
80
+ # update on server using url
81
+ def update_with_url(url, &block)
82
+ use_callback = block_given?
83
+ post_data = { model_name => filtered_updatable_attributes}
84
+ api_client.send(id ? :put : :post, url, post_data) do |data|
85
+ self.id ||= data['id']
86
+ block.call() if use_callback
87
+ end
88
+ end
89
+
90
+ # set attributes, using fetch
91
+ def fetch_with_attributes(attrs, &block)
92
+ attrs.each do |key, value|
93
+ if respond_to?(:"fetch_#{key}")
94
+ self.send(:"fetch_#{key}", value)
95
+ elsif respond_to?(:"#{key}=")
96
+ self.send(:"#{key}=", value)
97
+ end
98
+ end
99
+ block.call(self) if block_given?
100
+ end
101
+
102
+ def fetch_associations(sync_options = {})
100
103
  (self.class._associations || []).each do |key, options|
101
- sync_association(key, sync_options)
104
+ fetch_association(key, sync_options)
102
105
  end
103
106
  end
104
107
 
105
- def sync_association(key, sync_options = {}, &block)
108
+ def fetch_association(key, sync_options = {}, &block)
106
109
  options = self.class._associations[key]
107
110
  return unless options[:sync_url]
108
111
  options[:type] == :many ?
109
- sync_has_many(key, options, sync_options, &block) :
110
- sync_has_one(key, options, sync_options, &block)
112
+ fetch_has_many(key, options, sync_options, &block) :
113
+ fetch_has_one(key, options, sync_options, &block)
111
114
  end
112
115
 
113
- def sync_has_many(key, options = {}, sync_options = {}, &block)
116
+ def fetch_has_many(key, options = {}, sync_options = {}, &block)
114
117
  old_collection = self.send(key)
115
118
  use_callback = block_given?
116
119
  puts "SYNC: started sync for #{key} in #{self.class.name}"
@@ -123,7 +126,7 @@ module MotionPrime
123
126
  model = key.singularize.to_s.classify.constantize.new
124
127
  self.send(:"#{key}_bag") << model
125
128
  end
126
- model.sync_with_attributes(attributes)
129
+ model.fetch_with_attributes(attributes)
127
130
  model.save if sync_options[:save]
128
131
  end
129
132
  old_collection.each do |old_model|
@@ -142,7 +145,7 @@ module MotionPrime
142
145
  end
143
146
  end
144
147
 
145
- def sync_has_one(key, options = {}, &block)
148
+ def fetch_has_one(key, options = {}, &block)
146
149
  # TODO: add implementation
147
150
  end
148
151
 
@@ -150,10 +153,16 @@ module MotionPrime
150
153
  "#<#{self.class}:0x#{self.object_id.to_s(16)}> " + MotionPrime::JSON.generate(attributes)
151
154
  end
152
155
 
153
- def filtered_sync_attributes
154
- return attributes if self.class.sync_attributes.blank?
155
- attributes.reject do |key, value|
156
- self.class.sync_attributes.exclude?(key.to_sym)
156
+ def filtered_updatable_attributes
157
+ return attributes if self.class.updatable_attributes.blank?
158
+ self.class.updatable_attributes.to_a.inject({}) do |hash, attribute|
159
+ key, options = *attribute
160
+ if block = options[:block]
161
+ value = instance_eval(&block)
162
+ else
163
+ value = attributes[key]
164
+ end
165
+ hash.merge!(key => value)
157
166
  end
158
167
  end
159
168
 
@@ -162,8 +171,17 @@ module MotionPrime
162
171
  url ? self.sync_url = url : super
163
172
  end
164
173
 
165
- def sync_attributes(*attrs)
166
- attrs ? self.sync_attributes = attrs : super
174
+ def updatable_attributes(*attrs)
175
+ return self._updatable_attributes if attrs.blank?
176
+ attrs.each do |attribute|
177
+ updatable_attribute attribute
178
+ end
179
+ end
180
+
181
+ def updatable_attribute(attribute, options = {}, &block)
182
+ options[:block] = block if block_given?
183
+ self._updatable_attributes ||= {}
184
+ self._updatable_attributes[attribute] = options
167
185
  end
168
186
  end
169
187
  end
@@ -4,7 +4,7 @@ module MotionPrime
4
4
 
5
5
  def initialize(options = {})
6
6
  super
7
- @form = WeakRef.new(options.delete(:form))
7
+ @form = options.delete(:form)
8
8
  @container_options = options.delete(:container)
9
9
  end
10
10
 
@@ -38,8 +38,6 @@ module MotionPrime
38
38
  end
39
39
 
40
40
  def render_cell(index, table)
41
- cell = cached_cell(index)
42
- return cell if cell
43
41
  item = data[index.row]
44
42
 
45
43
  screen.table_view_cell styles: [:base_form_field, :"#{name}_field"], reuse_identifier: cell_name(table, index) do
@@ -31,8 +31,6 @@ module MotionPrime
31
31
  end
32
32
 
33
33
  def render_cell(index, table)
34
- cell = cached_cell(index)
35
- return cell if cell
36
34
  item = data[index.row]
37
35
 
38
36
  # define default styles for cell
@@ -2,7 +2,7 @@ class DMCellWithSection < UITableViewCell
2
2
  attr_accessor :section
3
3
 
4
4
  def setSection(section)
5
- @section = WeakRef.new(section)
5
+ @section = section
6
6
  end
7
7
 
8
8
  def drawRect(rect)
@@ -2,7 +2,7 @@ class DMViewWithSection < UIView
2
2
  attr_accessor :section
3
3
 
4
4
  def setSection(section)
5
- @section = WeakRef.new(section)
5
+ @section = section
6
6
  end
7
7
 
8
8
  def drawRect(rect)
@@ -1,3 +1,3 @@
1
1
  module MotionPrime
2
- VERSION = "0.1.3"
2
+ VERSION = "0.1.4"
3
3
  end
@@ -8,17 +8,17 @@ module MotionPrime
8
8
  end
9
9
 
10
10
  def view_for_class(klass, root_klass, options = {})
11
- if VIEWS_MAP.key?(klass)
12
- VIEWS_MAP[klass].call root_klass, options
11
+ if VIEWS_MAP.key?(klass.name)
12
+ VIEWS_MAP[klass.name].call root_klass, options
13
13
  else
14
14
  view_for_class klass.superclass, root_klass, options
15
15
  end
16
16
  end
17
17
 
18
18
  VIEWS_MAP = {
19
- UIView => Proc.new {|klass, options| klass.alloc.initWithFrame CGRectZero },
20
- UIControl => Proc.new {|klass, options| klass.alloc.init },
21
- UIActionSheet => Proc.new {|klass, options|
19
+ 'UIView' => Proc.new {|klass, options| klass.alloc.initWithFrame CGRectZero },
20
+ 'UIControl' => Proc.new {|klass, options| klass.alloc.init },
21
+ 'UIActionSheet' => Proc.new {|klass, options|
22
22
  title = options.delete(:title) || ''
23
23
  delegate = options.delete(:delegate)
24
24
  cancel_button_title = options.delete(:cancel_button_title)
@@ -31,17 +31,17 @@ module MotionPrime
31
31
  destructiveButtonTitle: destructive_button_title,
32
32
  otherButtonTitles: other_button_titles, nil
33
33
  },
34
- UIActivityIndicatorView => Proc.new{|klass, options|
34
+ 'UIActivityIndicatorView' => Proc.new{|klass, options|
35
35
  style = options.delete(:style) || :large.uiactivityindicatorstyle
36
36
  klass.alloc.initWithActivityIndicatorStyle style
37
37
  },
38
- UIButton => Proc.new{|klass, options|
38
+ 'UIButton' => Proc.new{|klass, options|
39
39
  is_custom_button = options[:background_image] || options[:title_color]
40
40
  default_button_type = is_custom_button ? :custom : :rounded
41
41
  button_type = (options.delete(:button_type) || default_button_type).uibuttontype
42
42
  klass.buttonWithType button_type
43
43
  },
44
- UIImageView => Proc.new{|klass, options|
44
+ 'UIImageView' => Proc.new{|klass, options|
45
45
  image = options.delete(:image)
46
46
  highlighted_image = options.delete(:highlighted_image)
47
47
 
@@ -53,29 +53,29 @@ module MotionPrime
53
53
  klass.alloc.initWithFrame CGRectZero
54
54
  end
55
55
  },
56
- UIProgressView => Proc.new{|klass, options|
56
+ 'UIProgressView' => Proc.new{|klass, options|
57
57
  style = options.delete(:style) || UIProgressViewStyleDefault
58
58
  klass.alloc.initWithProgressViewStyle style
59
59
  },
60
- UISegmentedControl => Proc.new{|klass, options|
60
+ 'UISegmentedControl' => Proc.new{|klass, options|
61
61
  items = options.delete(:items) || []
62
62
  klass.alloc.initWithItems items
63
63
  },
64
- UITableView => Proc.new{|klass, options|
64
+ 'UITableView' => Proc.new{|klass, options|
65
65
  style = options.delete(:style) || UITableViewStylePlain
66
66
  klass.alloc.initWithFrame CGRectZero, style: style
67
67
  },
68
- UITableViewCell => Proc.new{|klass, options|
68
+ 'UITableViewCell' => Proc.new{|klass, options|
69
69
  style = options.delete(:style) || UITableViewCellStyleDefault
70
70
  klass.alloc.initWithStyle style, reuseIdentifier: options.delete(:reuse_identifier)
71
71
  },
72
- UISearchBar => Proc.new{|klass, options|
72
+ 'UISearchBar' => Proc.new{|klass, options|
73
73
  klass = options[:search_field_background_image] ? UISearchBarCustom : UISearchBar
74
74
  search_bar = klass.alloc.init
75
75
  search_bar.autoresizingMask = UIViewAutoresizingFlexibleWidth
76
76
  search_bar
77
77
  },
78
- GMSMapView => Proc.new{|klass, options|
78
+ 'GMSMapView' => Proc.new{|klass, options|
79
79
  camera = GMSCameraPosition.cameraWithLatitude(35.689466, longitude: 139.700196, zoom: 15)
80
80
  map = GMSMapView.mapWithFrame(CGRectZero, camera: camera)
81
81
  map
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: motion-prime
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.3
4
+ version: 0.1.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Iskander Haziev
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2013-07-28 00:00:00.000000000 Z
11
+ date: 2013-08-25 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rake
@@ -165,6 +165,7 @@ files:
165
165
  - README.md
166
166
  - Rakefile
167
167
  - app/app_delegate.rb
168
+ - doc/FAQ.md
168
169
  - doc/SECTION.md
169
170
  - doc/STYLE.md
170
171
  - files/Gemfile