motion-prime 0.9.6 → 0.9.7

Sign up to get free protection for your applications and to get access to all the features.
Files changed (90) hide show
  1. checksums.yaml +8 -8
  2. data/CHANGELOG.md +6 -0
  3. data/Gemfile.lock +6 -6
  4. data/README.md +1 -10
  5. data/Rakefile +0 -1
  6. data/app/app_delegate.rb +1 -1
  7. data/bin/prime +1 -1
  8. data/files/Gemfile +1 -1
  9. data/motion-prime/api_client.rb +87 -31
  10. data/motion-prime/config/base.rb +20 -11
  11. data/motion-prime/config/config.rb +9 -3
  12. data/motion-prime/core_ext/kernel.rb +2 -1
  13. data/motion-prime/core_ext/nil_class.rb +5 -0
  14. data/motion-prime/delegate/app_delegate.rb +5 -0
  15. data/motion-prime/elements/base_element.rb +21 -2
  16. data/motion-prime/elements/draw.rb +6 -16
  17. data/motion-prime/helpers/has_authorization.rb +1 -1
  18. data/motion-prime/models/_base_mixin.rb +1 -1
  19. data/motion-prime/prime.rb +4 -0
  20. data/motion-prime/screens/extensions/_indicators_mixin.rb +16 -10
  21. data/motion-prime/screens/screen.rb +1 -1
  22. data/motion-prime/sections/_async_table_mixin.rb +1 -2
  23. data/motion-prime/sections/_draw_section_mixin.rb +3 -1
  24. data/motion-prime/sections/base_section.rb +37 -26
  25. data/motion-prime/sections/form.rb +23 -8
  26. data/motion-prime/sections/form/base_field_section.rb +1 -15
  27. data/motion-prime/sections/form/date_field_section.rb +1 -1
  28. data/motion-prime/sections/form/password_field_section.rb +1 -1
  29. data/motion-prime/sections/form/select_field_section.rb +1 -1
  30. data/motion-prime/sections/form/string_field_section.rb +1 -1
  31. data/motion-prime/sections/form/submit_field_section.rb +1 -1
  32. data/motion-prime/sections/form/text_field_section.rb +1 -1
  33. data/motion-prime/sections/table.rb +58 -27
  34. data/motion-prime/sections/table/refresh_mixin.rb +1 -1
  35. data/motion-prime/services/logger.rb +60 -21
  36. data/motion-prime/support/consts.rb +11 -0
  37. data/motion-prime/version.rb +1 -1
  38. data/motion-prime/views/layout.rb +5 -4
  39. data/motion-prime/views/view_styler.rb +3 -0
  40. data/spec/{helpers → factories}/delegates.rb +0 -3
  41. data/spec/{helpers → factories}/init.rb +0 -0
  42. data/spec/{helpers → factories}/models.rb +0 -0
  43. data/spec/factories/scaffold/models/task.rb +4 -0
  44. data/spec/factories/scaffold/screens/tasks.rb +45 -0
  45. data/spec/factories/scaffold/sections/tasks/form.rb +31 -0
  46. data/spec/factories/scaffold/sections/tasks/index_cell.rb +4 -0
  47. data/spec/factories/scaffold/sections/tasks/index_table.rb +12 -0
  48. data/spec/factories/scaffold/sections/tasks/show.rb +3 -0
  49. data/spec/factories/scaffold/styles/tasks.rb +18 -0
  50. data/spec/{helpers → factories}/screens.rb +0 -0
  51. data/spec/factories/sections.rb +9 -0
  52. data/spec/features/scaffold/index.rb +14 -0
  53. data/spec/features/screens/open_screen.rb +14 -2
  54. data/spec/helpers/has_content.rb +25 -0
  55. data/spec/unit/models/dirty_spec.rb +0 -1
  56. data/spec/unit/models/model_spec.rb +2 -0
  57. data/spec/unit/prime/logger.rb +49 -0
  58. data/spec/unit/sections/section_spec.rb +59 -0
  59. data/travis.sh +1 -1
  60. metadata +36 -41
  61. data/doc/FAQ.md +0 -2
  62. data/doc/SECTION.md +0 -7
  63. data/doc/STYLE.md +0 -39
  64. data/doc/code/getting_started.rb +0 -106
  65. data/doc/code/models.rb +0 -36
  66. data/doc/code/screens.rb +0 -93
  67. data/doc/code/sections.rb +0 -65
  68. data/doc/code/tables.rb +0 -54
  69. data/doc/docs/docco.css +0 -337
  70. data/doc/docs/getting_started.html +0 -195
  71. data/doc/docs/index.html +0 -205
  72. data/doc/docs/models.html +0 -115
  73. data/doc/docs/public/fonts/aller-bold.eot +0 -0
  74. data/doc/docs/public/fonts/aller-bold.ttf +0 -0
  75. data/doc/docs/public/fonts/aller-bold.woff +0 -0
  76. data/doc/docs/public/fonts/aller-light.eot +0 -0
  77. data/doc/docs/public/fonts/aller-light.ttf +0 -0
  78. data/doc/docs/public/fonts/aller-light.woff +0 -0
  79. data/doc/docs/public/fonts/fleurons.eot +0 -0
  80. data/doc/docs/public/fonts/fleurons.ttf +0 -0
  81. data/doc/docs/public/fonts/fleurons.woff +0 -0
  82. data/doc/docs/public/fonts/novecento-bold.eot +0 -0
  83. data/doc/docs/public/fonts/novecento-bold.ttf +0 -0
  84. data/doc/docs/public/fonts/novecento-bold.woff +0 -0
  85. data/doc/docs/public/images/gray.png +0 -0
  86. data/doc/docs/public/stylesheets/normalize.css +0 -375
  87. data/doc/docs/screens.html +0 -187
  88. data/doc/docs/sections.html +0 -138
  89. data/doc/docs/tables.html +0 -128
  90. data/spec/helpers/sections.rb +0 -3
checksums.yaml CHANGED
@@ -1,15 +1,15 @@
1
1
  ---
2
2
  !binary "U0hBMQ==":
3
3
  metadata.gz: !binary |-
4
- MDhjOWNjZjBiYWMwMGM0YTE5YzRkZTBmZWQyNDZmMzdiM2VjOTE5OQ==
4
+ ZmEyMGMyMWQ4OTEwOGI2N2Y5YzZjYmI3MWRmY2Y4MzYzMGNiYjU2MQ==
5
5
  data.tar.gz: !binary |-
6
- ZTllMmM5YWMyZjg4MDNhYzVhOWY5YzEzM2ExNzZiNWY1NTcwN2E5OA==
6
+ YzI4NzhiNWJiYjJmY2EyMmFiM2M0MjE4MzVmMWM5OWMxNzNjYTdlMQ==
7
7
  !binary "U0hBNTEy":
8
8
  metadata.gz: !binary |-
9
- YWQ4YTdhYjhkOWFjMDhmZjc0ZjZkMWY3MmMxYjA4ZWQwMzE1MWMxYjhkZjFl
10
- OTQ3NjNjMWRjODI1NGQ4Y2RlOGU2N2ZhOGU5OGM1Nzc4MzZjMTU2NGRmMWM1
11
- N2YxYmEwM2Q1MjFmZGIwOTNhZjcwZmQyZGQwNmIzYzNmMzQyYjA=
9
+ OTlkZGM4MTg1YTI1NjVjOWU0M2U4MzYzNzQ5NzlhZWY5OWVkNjFjMTNkODY2
10
+ NDAwZjNiMTRlZmJlZDFjMzExODZlOTVhM2YxZmFiMzgwNWVmY2JhOWI1MTI4
11
+ ZGQ3MTYxOGI4NTAzNmVlMzQ0NDIyNTIxNDdiNmI0NWE4ZDMyMzM=
12
12
  data.tar.gz: !binary |-
13
- M2M2MjUzNjk0OWI0ZWRkY2I3MzA4YTIxNzcxMTRjNDhiNTg5NjM3ZDNiOWIz
14
- ZTJjNzg5NTAyODgzODU2MjM2M2Y4MTFiYjc3ZDk4YjE4NzI4ZGRjY2MwYzQ0
15
- ZjA0YjY0N2IwZDY4OTMwNTU0YTFkMTlmMDBhMjYzMzVkNmM0NzA=
13
+ MTNlNWRkMDhkNTJiZWU1NTQ2NDA2ODAzMzRhYmQzMzEwODEyYzQ1NjFmOGM5
14
+ YWZjNWM0ZmY5ZTAyNTQyOGFjYTAzNjY0YzU2YjE1NjgzMWY2ZDhmZjdjMDY2
15
+ YWYyNDViYTQ2NzJjNzFmMDI3ZGM3ZTBkMDA4MjczYmE4N2YzYjE=
data/CHANGELOG.md CHANGED
@@ -1,3 +1,9 @@
1
+ === 0.9.7
2
+ * BREAKING CHANGE: screen#set_options renamed to screen#set_options_for.
3
+ * BREAKING CHANGE: section#reload_section renamed to section#hard_reload_section. in common cases use section#reload.
4
+ * BREAKING CHANGE: form#reload_cell_section renamed to form#hard_reload_cell_section. in common cases use form#reload_cell_sections.
5
+ * BREAKING CHANGE: table#reset_data renamed to table#reset_table_data
6
+
1
7
  === 0.9.6
2
8
  * BREAKING CHANGE: proc for form field option will be executed in context of form, not field.
3
9
  * BREAKING CHANGE: screen#setup renamed to screen#set_options.
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- motion-prime (0.9.6)
4
+ motion-prime (0.9.7)
5
5
  activesupport
6
6
  afmotion (~> 2.1.0)
7
7
  bubble-wrap (~> 1.5.0)
@@ -20,9 +20,9 @@ GEM
20
20
  activesupport (3.2.17)
21
21
  i18n (~> 0.6, >= 0.6.4)
22
22
  multi_json (~> 1.0)
23
- afmotion (2.1.0)
23
+ afmotion (2.1.2)
24
24
  motion-cocoapods (~> 1.4.0)
25
- motion-require (~> 0.0.7)
25
+ motion-require (>= 0.1)
26
26
  bubble-wrap (1.5.0)
27
27
  claide (0.4.0)
28
28
  cocoapods (0.29.0)
@@ -54,7 +54,7 @@ GEM
54
54
  motion-cocoapods (1.4.0)
55
55
  cocoapods (>= 0.26.2)
56
56
  motion-redgreen (0.1.0)
57
- motion-require (0.0.7)
57
+ motion-require (0.2.0)
58
58
  motion-stump (0.3.1)
59
59
  motion-support (0.2.6)
60
60
  motion-require (>= 0.0.6)
@@ -63,8 +63,8 @@ GEM
63
63
  open4 (1.3.3)
64
64
  rake (10.1.1)
65
65
  rm-digest (0.0.2)
66
- sugarcube (1.5.4)
67
- thor (0.18.1)
66
+ sugarcube (1.5.5)
67
+ thor (0.19.1)
68
68
  xcodeproj (0.14.1)
69
69
  activesupport (~> 3.0)
70
70
  colored (~> 1.2)
data/README.md CHANGED
@@ -70,6 +70,7 @@ MotionPrime is yet another framework written on RubyMotion for creating really f
70
70
  ## Samples
71
71
 
72
72
  * [Simple to-do app](https://github.com/motionprime/prime_sample_todo)
73
+ * [Send mail with attached file](https://github.com/cactis/email_attachment_example)
73
74
 
74
75
  ## Documentation
75
76
 
@@ -84,16 +85,6 @@ MotionPrime is yet another framework written on RubyMotion for creating really f
84
85
  4. Push to the branch (`git push origin my-new-feature`)
85
86
  5. Create new Pull Request
86
87
 
87
- ## Help us with documentation
88
-
89
- We are using [Docco](http://jashkenas.github.io/docco/) to generate documentation.
90
-
91
- Please install the tool and run this to update documentation:
92
-
93
- ```
94
- $ cd doc && docco code/*.rb --layout linear
95
- ```
96
-
97
88
  ## Thanks for using MotionPrime!
98
89
 
99
90
  Hope, you'll enjoy MotionPrime!
data/Rakefile CHANGED
@@ -17,7 +17,6 @@ Bundler.require
17
17
  require 'motion-support'
18
18
  require 'motion-prime'
19
19
  require 'motion-stump'
20
- require 'motion-redgreen'
21
20
 
22
21
  Motion::Project::App.setup do |app|
23
22
  app.name = 'Prime'
data/app/app_delegate.rb CHANGED
@@ -1,4 +1,4 @@
1
- class AppDelegate
1
+ class AppDelegate < MotionPrime::BaseAppDelegate
2
2
  def application(application, didFinishLaunchingWithOptions:launchOptions)
3
3
  true
4
4
  end
data/bin/prime CHANGED
@@ -47,7 +47,7 @@ class App
47
47
  clone_template(template_name, repo)
48
48
  sh "motion create #{name} --template=#{template_name}"
49
49
  end
50
- info "Command: bundle instal"
50
+ info "Command: bundle install"
51
51
  sh "cd ./#{name}; bundle install"
52
52
  info "Command: pod setup"
53
53
  sh "cd ./#{name}; pod setup"
data/files/Gemfile CHANGED
@@ -1,7 +1,7 @@
1
1
  source 'http://rubygems.org'
2
2
 
3
3
  gem 'motion-cocoapods', '~> 1.4.0'
4
- gem 'motion-prime', '0.9.6'
4
+ gem 'motion-prime', '0.9.7'
5
5
 
6
6
  # add reside menu for sidebar support
7
7
  # gem 'prime_reside_menu', '~> 0.1.4'
@@ -17,7 +17,7 @@ class ApiClient
17
17
  end
18
18
  if config.sign_request?
19
19
  signature = RmDigest::MD5.hexdigest(
20
- config.signature_secret + filter_sign_params(params).keys.map(&:to_s).sort.join
20
+ config.signature_secret + params.keys.map(&:to_s).sort.join
21
21
  )
22
22
  params.merge!(sign: signature)
23
23
  end
@@ -53,45 +53,60 @@ class ApiClient
53
53
  end
54
54
 
55
55
  def request(method, path, params = {}, options = {}, &block)
56
- params.merge!(access_token: access_token)
57
- data = request_params(params)
58
- files = data.delete(:_files)
59
- use_callback = block_given?
56
+ files = params.delete(:_files)
57
+ data = request_params(params.merge(access_token: access_token))
60
58
 
61
- client_method = files.present? ? :"multipart_#{method}" : method
59
+ if !options.has_key?(:allow_queue) && config.default_methods_queue.include?(method.to_sym)
60
+ options[:allow_queue] = true
61
+ end
62
+
63
+ if !options.has_key?(:allow_cache) && config.default_methods_cache.include?(method.to_sym)
64
+ options[:allow_cache] = true
65
+ end
66
+
67
+ if allow_cache?(method, path, options)
68
+ cached_request!(method, path, data, files, options, &block)
69
+ else
70
+ request!(method, path, data, files, options, &block)
71
+ end
72
+ end
73
+
74
+ def request!(method, path, data, files = nil, options = {}, &block)
75
+ use_callback = block_given?
62
76
  path = "#{config.api_namespace}#{path}" unless path.starts_with?('http')
77
+ client_method = files.present? ? :"multipart_#{method}" : method
63
78
  AFMotion::Client.shared.send client_method, path, data do |response, form_data, progress|
64
79
  if form_data && files.present?
65
- files.each do |file_data|
66
- form_data.appendPartWithFileData(file_data[:data], name: file_data[:name], fileName:"avatar.png", mimeType: "image/jpeg")
67
- end
80
+ append_files_to_data(files, form_data)
68
81
  elsif progress
69
82
  # handle progress
70
- elsif !response.success? && options[:allow_queue] && config.allow_queue?
71
- add_to_queue(method: method, path: path, params: params)
83
+ elsif !response.success? && allow_queue?(method, path, options)
84
+ queue(method: method, path: path, params: params)
72
85
  elsif response.operation.response.nil?
73
86
  block.call if use_callback
74
87
  else
75
- block.call(prepared_object(response.object), response.operation.response.statusCode) if use_callback
76
- process_queue
88
+ prepared_response = prepare_response_object(response.object)
89
+ block.call(prepared_response, response.operation.response.statusCode) if use_callback
90
+ process_queue if config.allow_queue?
77
91
  end
78
92
  end
79
93
  end
80
94
 
81
- def process_queue
82
- queue = user_defaults['api_client_queue']
83
- user_defaults['api_client_queue'] = []
84
- Array.wrap(queue).each do |item|
85
- request(item[:method], item[:path], item[:params].clone.symbolize_keys)
95
+ def cached_request!(method, path, data, files = nil, options = {}, &block)
96
+ use_callback = block_given?
97
+ params = data.map { |key, value| "#{key}=#{value}" }.join('&')
98
+ cache_key = [method, path, params].join(' ')
99
+ response = read_cache(cache_key)
100
+ if response && use_callback
101
+ block.call(prepare_response_object(response), 200)
102
+ else
103
+ request!(method, path, data, files, options) do |response, status|
104
+ write_cache(cache_key, response)
105
+ block.call(response, status) if use_callback
106
+ end
86
107
  end
87
108
  end
88
109
 
89
- def add_to_queue(item)
90
- queue = user_defaults['api_client_queue'].clone || []
91
- queue.push(item)
92
- user_defaults['api_client_queue'] = queue
93
- end
94
-
95
110
  def get(path, params = {}, options = {}, &block)
96
111
  request(:get, path, params, options, &block)
97
112
  end
@@ -101,18 +116,47 @@ class ApiClient
101
116
  end
102
117
 
103
118
  def post(path, params = {}, options = {}, &block)
104
- options[:allow_queue] = true unless options.has_key?(:allow_queue)
105
119
  request(:post, path, params, options, &block)
106
120
  end
107
121
 
108
122
  def delete(path, params = {}, options = {}, &block)
109
- options[:allow_queue] = true unless options.has_key?(:allow_queue)
110
123
  request(:delete, path, params, options, &block)
111
124
  end
112
125
 
113
- private
114
- def filter_sign_params(params)
115
- params.except(:_files)
126
+ def queue(item)
127
+ queue_list = user_defaults['api_client_queue'].clone || []
128
+ queue_list.push(item)
129
+ user_defaults['api_client_queue'] = queue_list
130
+ end
131
+
132
+ # TODO: temporary solution, add real caching system here
133
+ def read_cache(key)
134
+ puts "read cache #{key}"
135
+ @cache ||= {}
136
+ @cache[key]
137
+ end
138
+
139
+ # TODO: temporary solution, add real caching system here
140
+ def write_cache(key, data)
141
+ @cache ||= {}
142
+ @cache[key] = data
143
+ end
144
+
145
+ protected
146
+ def allow_queue?(method, path, options)
147
+ options[:allow_queue] && config.allow_queue?
148
+ end
149
+
150
+ def allow_cache?(method, path, options)
151
+ options[:allow_cache] && config.allow_cache?
152
+ end
153
+
154
+ def process_queue
155
+ queue_list = user_defaults['api_client_queue']
156
+ user_defaults['api_client_queue'] = []
157
+ Array.wrap(queue_list).each do |item|
158
+ request(item[:method], item[:path], item[:params].clone.symbolize_keys)
159
+ end
116
160
  end
117
161
 
118
162
  def config
@@ -123,11 +167,23 @@ class ApiClient
123
167
  @user_defaults ||= NSUserDefaults.standardUserDefaults
124
168
  end
125
169
 
126
- def prepared_object(object)
170
+ def append_files_to_data(files, data)
171
+ files.each do |file|
172
+ name = file[:name]
173
+ file_name = file[:file_name] || "avatar.png"
174
+ mime_type = file[:mime_type] || "image/jpeg"
175
+ data.appendPartWithFileData(
176
+ file[:data], name: name, fileName: file_name, mimeType: mime_type
177
+ )
178
+ end
179
+ data
180
+ end
181
+
182
+ def prepare_response_object(object)
127
183
  if object.is_a?(Hash)
128
184
  object.with_indifferent_access
129
185
  elsif object.is_a?(Array)
130
- object.map(&:with_indifferent_access)
186
+ object.map{ |obj| prepare_response_object(obj) }
131
187
  else
132
188
  object
133
189
  end
@@ -1,5 +1,6 @@
1
1
  motion_require './config.rb'
2
2
  MotionPrime::Config.configure do |config|
3
+ # MODELS
3
4
  if MotionPrime.env.test?
4
5
  config.model.store_type = :memory
5
6
  else
@@ -7,16 +8,6 @@ MotionPrime::Config.configure do |config|
7
8
  end
8
9
  config.model.auto_generate_id = true
9
10
 
10
- config.fonts do |fonts|
11
- fonts.base = :system
12
- end
13
-
14
- config.colors do |colors|
15
- colors.navigation_base = 0x1b75bc
16
- colors.base = 0x1b75bc
17
- colors.dark = 0x333333
18
- colors.error = 0xef471f
19
- end
20
11
  config.api_client do |api|
21
12
  api.base = "http://example.com"
22
13
  api.client_id = ""
@@ -26,8 +17,26 @@ MotionPrime::Config.configure do |config|
26
17
  api.auth_path = '/oauth/token'
27
18
  api.api_namespace = '/api'
28
19
  api.allow_queue = false
20
+ api.allow_cache = false
21
+ api.default_methods_queue = [:post, :delete]
22
+ api.default_methods_cache = [:get]
29
23
  end
24
+
25
+ # APPEARANCE
26
+ config.fonts do |fonts|
27
+ fonts.base = :system
28
+ end
29
+ config.colors do |colors|
30
+ colors.navigation_base = 0x1b75bc
31
+ colors.base = 0x1b75bc
32
+ colors.dark = 0x333333
33
+ colors.error = 0xef471f
34
+ end
35
+
36
+ # SECTIONS
30
37
  config.prime.cell_section.mixins = [Prime::CellSectionMixin]
31
- config.logger.level = :info
38
+
39
+ # LOGGER
32
40
  config.logger.dealloc_items = ['screen']
41
+ config.logger.level = :info
33
42
  end
@@ -1,5 +1,7 @@
1
1
  module MotionPrime
2
2
  class Config
3
+ attr_accessor :attributes
4
+
3
5
  def initialize(attributes = {})
4
6
  @attributes = attributes || {}
5
7
  end
@@ -13,8 +15,8 @@ module MotionPrime
13
15
  end
14
16
  alias :[]= :store
15
17
 
16
- def fetch(key)
17
- @attributes[key.to_sym]
18
+ def fetch(key, default = nil)
19
+ @attributes[key.to_sym] || default
18
20
  end
19
21
 
20
22
  def nil?
@@ -31,7 +33,11 @@ module MotionPrime
31
33
  end
32
34
 
33
35
  def to_hash
34
- @attributes
36
+ hash = {}
37
+ @attributes.each do |key, value|
38
+ hash[key] = value.is_a?(MotionPrime::Config) ? value.to_hash : value
39
+ end
40
+ hash
35
41
  end
36
42
 
37
43
  class << self
@@ -1,6 +1,7 @@
1
1
  class Kernel
2
2
  def pp(*attrs)
3
3
  NSLog([*attrs].map(&:inspect).join(' '))
4
+ attrs
4
5
  end
5
6
 
6
7
  def class_name_without_kvo
@@ -39,7 +40,7 @@ class Kernel
39
40
  return false
40
41
  end
41
42
  key ||= @_strong_references.keys.last
42
- @_strong_references.delete(key)
43
+ @_strong_references.try(:delete, key)
43
44
  key
44
45
  end
45
46
 
@@ -0,0 +1,5 @@
1
+ class NilClass
2
+ def weakref_alive?
3
+ false
4
+ end
5
+ end
@@ -23,6 +23,11 @@ module MotionPrime
23
23
  user_was = @current_user
24
24
  @current_user = nil
25
25
  NSNotificationCenter.defaultCenter.postNotificationName(:on_current_user_reset, object: user_was)
26
+ api_client.access_token = current_user.try(:access_token)
27
+ end
28
+
29
+ def api_client
30
+ @api_client ||= ApiClient.new(access_token: current_user.try(:access_token))
26
31
  end
27
32
  end
28
33
  end
@@ -92,14 +92,29 @@ module MotionPrime
92
92
  end
93
93
 
94
94
  def reload!
95
+ reset_computed_values
95
96
  compute_options!
96
97
  end
97
98
 
99
+ def rerender!
100
+ render_target = view.try(:superview)
101
+ view.try(:removeFromSuperview)
102
+ render(render_target: render_target)
103
+ section.try(:on_element_render, self)
104
+ end
105
+
98
106
  def update_with_options(new_options = {})
99
107
  options.merge!(new_options)
100
108
  reload!
101
- view.try(:removeFromSuperview)
102
- render
109
+ rerender!
110
+ end
111
+
112
+ def update_options(options)
113
+ ViewStyler.new(view, view.superview.try(:bounds), options).apply
114
+ end
115
+
116
+ def update
117
+ update_with_options({})
103
118
  end
104
119
 
105
120
  def hide
@@ -118,6 +133,10 @@ module MotionPrime
118
133
  end
119
134
 
120
135
  protected
136
+ def reset_computed_values
137
+ @content_height = nil
138
+ @content_width = nil
139
+ end
121
140
 
122
141
  # Compute options sent inside block, e.g.
123
142
  # element :button do