motion-prime 0.1.3 → 0.1.4

Sign up to get free protection for your applications and to get access to all the features.
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