motion-prime 0.2.1 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (81) hide show
  1. checksums.yaml +8 -8
  2. data/CHANGELOG.md +5 -0
  3. data/Gemfile.lock +14 -11
  4. data/README.md +8 -11
  5. data/Rakefile +2 -1
  6. data/bin/prime.rb +47 -0
  7. data/doc/FAQ.md +1 -1
  8. data/files/app/app_delegate.rb +1 -1
  9. data/files/app/config/base.rb +8 -4
  10. data/files/app/screens/application_screen.rb +1 -1
  11. data/files/app/screens/sidebar_screen.rb +1 -1
  12. data/files/app/sections/sidebar/action.rb +1 -1
  13. data/files/app/sections/sidebar/table.rb +1 -1
  14. data/files/app/styles/sidebar.rb +5 -5
  15. data/motion-prime.gemspec +1 -0
  16. data/motion-prime/api_client.rb +81 -0
  17. data/motion-prime/app_delegate.rb +22 -5
  18. data/motion-prime/config/base.rb +5 -0
  19. data/motion-prime/core_ext/kernel.rb +5 -0
  20. data/motion-prime/elements/_field_dimensions_mixin.rb +43 -0
  21. data/motion-prime/elements/_text_dimensions_mixin.rb +39 -0
  22. data/motion-prime/elements/base.rb +40 -17
  23. data/motion-prime/elements/button.rb +20 -0
  24. data/motion-prime/elements/draw.rb +2 -2
  25. data/motion-prime/elements/draw/image.rb +4 -2
  26. data/motion-prime/elements/draw/label.rb +1 -1
  27. data/motion-prime/elements/error_message.rb +3 -16
  28. data/motion-prime/elements/label.rb +13 -2
  29. data/motion-prime/elements/text_field.rb +1 -0
  30. data/motion-prime/helpers/cell_section.rb +9 -0
  31. data/motion-prime/helpers/has_authorization.rb +4 -3
  32. data/motion-prime/helpers/has_normalizer.rb +20 -6
  33. data/motion-prime/helpers/has_search_bar.rb +19 -7
  34. data/motion-prime/helpers/has_style_chain_builder.rb +7 -0
  35. data/motion-prime/models/association.rb +22 -9
  36. data/motion-prime/models/association_collection.rb +54 -23
  37. data/motion-prime/models/bag.rb +13 -12
  38. data/motion-prime/models/base.rb +2 -0
  39. data/motion-prime/models/errors.rb +23 -14
  40. data/motion-prime/models/finder.rb +4 -1
  41. data/motion-prime/models/model.rb +25 -5
  42. data/motion-prime/models/store_extension.rb +1 -7
  43. data/motion-prime/models/sync.rb +75 -43
  44. data/motion-prime/mp.rb +4 -0
  45. data/motion-prime/screens/_base_mixin.rb +18 -12
  46. data/motion-prime/screens/_navigation_bar_mixin.rb +15 -6
  47. data/motion-prime/screens/_navigation_mixin.rb +15 -16
  48. data/motion-prime/screens/base_screen.rb +5 -1
  49. data/motion-prime/screens/sidebar_container_screen.rb +37 -22
  50. data/motion-prime/sections/base.rb +82 -16
  51. data/motion-prime/sections/form.rb +144 -26
  52. data/motion-prime/sections/form/base_field_section.rb +62 -29
  53. data/motion-prime/sections/form/base_header_section.rb +27 -0
  54. data/motion-prime/sections/form/date_field_section.rb +2 -17
  55. data/motion-prime/sections/form/password_field_section.rb +3 -17
  56. data/motion-prime/sections/form/select_field_section.rb +4 -35
  57. data/motion-prime/sections/form/string_field_section.rb +3 -29
  58. data/motion-prime/sections/form/submit_field_section.rb +1 -7
  59. data/motion-prime/sections/form/switch_field_section.rb +3 -23
  60. data/motion-prime/sections/form/text_field_section.rb +3 -33
  61. data/motion-prime/sections/form/text_with_button_field_section.rb +4 -40
  62. data/motion-prime/sections/tabbed.rb +25 -5
  63. data/motion-prime/sections/table.rb +86 -22
  64. data/motion-prime/sections/table/refresh_mixin.rb +3 -1
  65. data/motion-prime/styles/base.rb +7 -89
  66. data/motion-prime/styles/form.rb +116 -0
  67. data/motion-prime/support/dm_button.rb +32 -5
  68. data/motion-prime/support/dm_text_field.rb +31 -7
  69. data/motion-prime/support/dm_text_view.rb +6 -3
  70. data/motion-prime/support/dm_view_controller.rb +3 -3
  71. data/motion-prime/support/ui_search_bar_custom.rb +1 -1
  72. data/motion-prime/version.rb +1 -1
  73. data/motion-prime/views/layout.rb +18 -10
  74. data/motion-prime/views/styles.rb +19 -9
  75. data/motion-prime/views/view_builder.rb +18 -2
  76. data/motion-prime/views/view_styler.rb +59 -5
  77. data/spec/models/errors_spec.rb +3 -3
  78. data/travis.sh +3 -2
  79. metadata +28 -5
  80. data/motion-prime/elements/_text_height_mixin.rb +0 -17
  81. data/motion-prime/sections/form/table_field_section.rb +0 -51
checksums.yaml CHANGED
@@ -1,15 +1,15 @@
1
1
  ---
2
2
  !binary "U0hBMQ==":
3
3
  metadata.gz: !binary |-
4
- NTVhZjliNTBlNWFkYWY5ODA2NGEzYmFiYmQ2OTZlMTUwODZjNzNkNw==
4
+ NGYzMDBjMjExMDIwYjViMzBkYjJjNGRjMGY2ZWY3YjFhZjljNGE3Nw==
5
5
  data.tar.gz: !binary |-
6
- YmRkODY4MTE5ZmUzNDZiMzE1YmU0MGVhN2YxOTQyOTgzM2YxOGY2Yg==
6
+ OWI5ZjA0OThkNzg3NDc5OWFmODBhNWJiNmM2NWFjOTk4YWE3Nzc4Nw==
7
7
  !binary "U0hBNTEy":
8
8
  metadata.gz: !binary |-
9
- MmJiMTg3YmM4ZjIxNGNhZWM5Njc5NzEwNmIyNTI4MTMyYzk0ODRiYzQzZTRm
10
- MWIwNzdkNTBmMmM3NWZiYTNjNmY4NTRiZWUzZDVmODY5NTI4ZWRiNzY0MWVj
11
- NzNlYTZkMTQ3YTMyOTFhOGZiYmM5ZDk0OWZhNzkyMzczMzJlMTk=
9
+ ZWJhZDkzYjNmOGEzYjJjN2E2ODQ3M2I2MTc3ZjcwYWExMjM2MDA5MGI5ZjNh
10
+ NGRhNzM1YmQ1YTcwMTFkM2Y3NmM5YTFiZDI1NDEzZmFiZDI2NWYzOTYyNjAw
11
+ Y2U2MzljNDNiNmNkMTYwOTE0MGFiYjk0ZmExYmQzZWIwODgzMDI=
12
12
  data.tar.gz: !binary |-
13
- YTY0NjliMWM1Y2Q4NGMyMjc3OTcwOThjNTUxNGYxM2JiNjc0NzVkZTdlZmI4
14
- NjliNjlmZjJjNTVjN2Q1ZjU5MjBlYzdlNmNkMjEzM2FkNjgwZDU0YjI5Mzcw
15
- YTM1ZjE3ZjJjOWE5NTI1ODAwN2M2OTMwNjBkN2VlMGEyOGExYjE=
13
+ MzliOWY4M2M4ZmNkYTJmNGQ0OTU5Yzc4ZDQ4YzA3MzU5ZWUwMWM3ZjViOTFl
14
+ MjU5NzFlNGM2NzA5MmNmZWVkZTM4OGUwMTU4NzBmNWMwYzAxMGZjMGE5MWUy
15
+ N2M0YjQ4ODcxNWJhZWNkZjU3MGJiMTAzOGJjYmZmMWM1MzQ4YjY=
data/CHANGELOG.md CHANGED
@@ -1,3 +1,8 @@
1
+ === 0.3.0
2
+ * Added iOS 7 support
3
+ * Added command line tools
4
+ * Many bug fixes
5
+
1
6
  === 0.2.1
2
7
  * Bug fixes
3
8
 
data/Gemfile.lock CHANGED
@@ -1,9 +1,10 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- motion-prime (0.2.1)
4
+ motion-prime (0.3.0)
5
5
  bubble-wrap
6
6
  cocoapods
7
+ methadone
7
8
  motion-cocoapods
8
9
  motion-require
9
10
  motion-support
@@ -13,8 +14,8 @@ PATH
13
14
  GEM
14
15
  remote: http://rubygems.org/
15
16
  specs:
16
- activesupport (3.2.13)
17
- i18n (= 0.6.1)
17
+ activesupport (3.2.15)
18
+ i18n (~> 0.6, >= 0.6.4)
18
19
  multi_json (~> 1.0)
19
20
  addressable (2.3.5)
20
21
  bubble-wrap (1.3.0)
@@ -35,24 +36,26 @@ GEM
35
36
  cocoapods-core (0.19.1)
36
37
  activesupport (~> 3.2.13)
37
38
  rake (~> 10.0.0)
38
- cocoapods-downloader (0.1.1)
39
+ cocoapods-downloader (0.1.2)
39
40
  colored (1.2)
40
41
  escape (0.0.4)
41
- faraday (0.8.7)
42
- multipart-post (~> 1.1)
42
+ faraday (0.8.8)
43
+ multipart-post (~> 1.2.0)
43
44
  faraday_middleware (0.9.0)
44
45
  faraday (>= 0.7.4, < 0.9)
45
46
  hashie (2.0.5)
46
- i18n (0.6.1)
47
+ i18n (0.6.5)
47
48
  json (1.7.7)
48
- motion-cocoapods (1.3.2)
49
+ methadone (1.3.1)
50
+ bundler
51
+ motion-cocoapods (1.3.7)
49
52
  cocoapods (>= 0.17.0)
50
53
  motion-redgreen (0.1.0)
51
54
  motion-require (0.0.7)
52
55
  motion-stump (0.3.0)
53
- motion-support (0.2.4)
56
+ motion-support (0.2.5)
54
57
  motion-require (>= 0.0.6)
55
- multi_json (1.7.7)
58
+ multi_json (1.8.2)
56
59
  multipart-post (1.2.0)
57
60
  nano-store (0.6.3)
58
61
  motion-cocoapods (>= 1.2.1)
@@ -66,7 +69,7 @@ GEM
66
69
  netrc (~> 0.7.7)
67
70
  open4 (1.3.0)
68
71
  rake (10.0.4)
69
- sugarcube (0.20.23)
72
+ sugarcube (0.20.25)
70
73
  xcodeproj (0.5.5)
71
74
  activesupport (~> 3.2.13)
72
75
  colored (~> 1.2)
data/README.md CHANGED
@@ -11,31 +11,28 @@ The main feature of MotionPrime is one more layer on UI elements: Section.
11
11
 
12
12
  ### 1. Create MotionPrime project:
13
13
 
14
- $ motion create --template=git@github.com:droidlabs/motion-prime.git myapp
14
+ $ prime new myapp
15
15
 
16
- ### 2. Install gems
17
-
18
- $ bundle
19
-
20
- ### 3. Setup application
16
+ ### 2. Setup application
21
17
 
22
18
  # edit Rakefile
23
19
 
24
- ### 4. Run application
20
+ ### 3. Run application
25
21
 
26
22
  $ rake
27
23
 
28
24
  ## Hello World (Sample)
25
+
29
26
  ```ruby
30
27
  # app/app_delegate.rb
31
- class AppDelegate < MotionPrime::BaseAppDelegate
28
+ class AppDelegate < Prime::BaseAppDelegate
32
29
  def on_load(app, options)
33
30
  open_root_screen MainScreen.new
34
31
  end
35
32
  end
36
33
 
37
34
  # app/screens/main_screen.rb
38
- class MainScreen < ApplicationScreen
35
+ class MainScreen < Prime::BaseScreen
39
36
  title 'Main screen'
40
37
 
41
38
  def render
@@ -45,13 +42,13 @@ The main feature of MotionPrime is one more layer on UI elements: Section.
45
42
  end
46
43
 
47
44
  # app/sections/my_profile.rb
48
- class MyProfileSection < MotionPrime::BaseSection
45
+ class MyProfileSection < Prime::BaseSection
49
46
  element :title, text: "Hello World"
50
47
  element :avatar, image: "images/avatar.png", type: :image
51
48
  end
52
49
 
53
50
  # app/styles/my_profile.rb
54
- MotionPrime::Styles.define :my_profile do
51
+ Prime::Styles.define :my_profile do
55
52
  style :title,
56
53
  width: 300, height: 20, color: :black,
57
54
  top: 10, left: 5, background_color: :white
data/Rakefile CHANGED
@@ -18,14 +18,15 @@ require 'motion-support'
18
18
  require 'motion-prime'
19
19
  require 'motion-stump'
20
20
  require 'motion-redgreen'
21
+ require 'bubble-wrap/reactor'
21
22
 
22
23
  Motion::Project::App.setup do |app|
23
24
  app.name = 'MotionPrime'
24
25
  app.pods do
25
- pod 'PKRevealController'
26
26
  pod 'NanoStore', '~> 2.7.7'
27
27
  pod 'SDWebImage'
28
28
  pod 'SVPullToRefresh'
29
29
  pod 'MBAlertView'
30
+ pod 'RESideMenu', git: 'https://github.com/feklistov/RESideMenu.git'
30
31
  end
31
32
  end
data/bin/prime.rb ADDED
@@ -0,0 +1,47 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'optparse'
4
+ require 'methadone'
5
+ require_relative '../motion-prime/version'
6
+
7
+ class App
8
+ include Methadone::Main
9
+ include Methadone::CLILogging
10
+ include Methadone::SH
11
+
12
+ main do |command, opt|
13
+ case command.to_sym
14
+ when :new then create(opt)
15
+ else help
16
+ end
17
+ 0
18
+ end
19
+
20
+ def self.help
21
+ info "Command line tools for MotionPrime"
22
+ info "Commands:"
23
+ info " new <appname>"
24
+ info " Creates a new MotionPrime app from a template."
25
+ end
26
+
27
+ def self.create(name)
28
+ return puts "Usage: prime new <appname>" unless name.to_s.length > 0
29
+ info "Creating new MotionPrime iOS app: #{name}"
30
+ sh "motion create --template=git@github.com:droidlabs/motion-prime.git #{name}"
31
+ sh "cd ./#{name}"
32
+ info "Command: bundle instal"
33
+ sh "bundle install"
34
+ info "Command: pod setup"
35
+ sh "pod setup"
36
+ sh "cd .."
37
+ end
38
+
39
+ description "Command line tools for MotionPrime"
40
+
41
+ arg :command
42
+ arg :opt, :optional
43
+
44
+ version MotionPrime::VERSION
45
+
46
+ go!
47
+ end
data/doc/FAQ.md CHANGED
@@ -1,2 +1,2 @@
1
1
  Q: Error: `Unable to find a specification for `Something``
2
- A: Try running `pod install`
2
+ A: Try running `pod setup`
@@ -1,4 +1,4 @@
1
- class AppDelegate < MotionPrime::BaseAppDelegate
1
+ class AppDelegate < Prime::BaseAppDelegate
2
2
  def on_load(app, options)
3
3
  setup_navigation_styles
4
4
  open_with_sidebar HomeScreen.new(navigation: true), SidebarScreen.new
@@ -1,9 +1,13 @@
1
- MP = MotionPrime unless defined?(MP)
2
-
3
- MP::Config.color do |color|
1
+ Prime::Config.color do |color|
4
2
  color.base = 0x3aa9b6
5
3
  color.dark = 0x41929c
6
4
  end
7
5
 
6
+ Prime::Config.api do |api|
7
+ api.base = "http://example.com"
8
+ api.client_id = ""
9
+ api.client_secret = ""
10
+ end
11
+
8
12
  # setup model's store
9
- MP::Store.connect
13
+ Prime::Store.connect
@@ -1,4 +1,4 @@
1
- class ApplicationScreen < MotionPrime::BaseScreen
1
+ class ApplicationScreen < Prime::BaseScreen
2
2
  before_load :setup_navigation
3
3
 
4
4
  def setup_navigation
@@ -1,4 +1,4 @@
1
- class SidebarScreen < MotionPrime::BaseScreen
1
+ class SidebarScreen < Prime::BaseScreen
2
2
  def render
3
3
  @main_section = SidebarTableSection.new()
4
4
  @main_section.render(to: self)
@@ -1,4 +1,4 @@
1
- class SidebarActionSection < MotionPrime::BaseSection
1
+ class SidebarActionSection < Prime::BaseSection
2
2
  container height: 43
3
3
  element :title, text: proc { model[:title] }
4
4
  element :arrow, type: :image
@@ -1,4 +1,4 @@
1
- class SidebarTableSection < MotionPrime::TableSection
1
+ class SidebarTableSection < Prime::TableSection
2
2
  def sidebar_items
3
3
  [
4
4
  {title: 'Home Screen', action: :open_home},
@@ -1,8 +1,8 @@
1
- MotionPrime::Styles.define :sidebar do
1
+ Prime::Styles.define :sidebar do
2
2
  # navigation layout
3
3
  # ----------
4
4
  style :screen,
5
- background_color: MP::Config.color.base,
5
+ background_color: Prime::Config.color.base,
6
6
  opaque: true
7
7
 
8
8
  style :table,
@@ -10,8 +10,8 @@ MotionPrime::Styles.define :sidebar do
10
10
  left: 0,
11
11
  width: 320,
12
12
  bottom: 0,
13
- background_color: MP::Config.color.base,
14
- separator_color: MP::Config.color.dark,
13
+ background_color: Prime::Config.color.base,
14
+ separator_color: Prime::Config.color.dark,
15
15
  opaque: true
16
16
 
17
17
  style :table_cell,
@@ -19,7 +19,7 @@ MotionPrime::Styles.define :sidebar do
19
19
  opaque: true
20
20
 
21
21
  style :action_title,
22
- background_color: MP::Config.color.base,
22
+ background_color: Prime::Config.color.base,
23
23
  text_color: :white,
24
24
  top: 10,
25
25
  width: 320,
data/motion-prime.gemspec CHANGED
@@ -27,4 +27,5 @@ Gem::Specification.new do |spec|
27
27
  spec.add_dependency 'bubble-wrap'
28
28
  spec.add_dependency 'sugarcube'
29
29
  spec.add_dependency 'nano-store'
30
+ spec.add_dependency("methadone")
30
31
  end
@@ -0,0 +1,81 @@
1
+ class ApiClient
2
+ attr_accessor :access_token
3
+
4
+ def initialize(options = {})
5
+ self.access_token = options[:access_token]
6
+ end
7
+
8
+ def parse_json(text)
9
+ BW::JSON.parse(text)
10
+ rescue
11
+ puts "Can't parse json: #{text}"
12
+ false
13
+ end
14
+
15
+ def request_params(data)
16
+ files = data.delete(:files)
17
+ params = {payload: data, no_redirect: true, format: :form_data}
18
+ if files.present?
19
+ params.merge!(files: files)
20
+ end
21
+ if MotionPrime::Config.api.http_auth.present?
22
+ params.merge!(credentials: MotionPrime::Config.api.http_auth.to_hash)
23
+ end
24
+ params
25
+ end
26
+
27
+ def authenticate(username, password, &block)
28
+ data = {
29
+ grant_type: "password",
30
+ username: username,
31
+ password: password,
32
+ client_id: MotionPrime::Config.api.client_id,
33
+ client_secret: MotionPrime::Config.api.client_secret
34
+ }
35
+ use_callback = block_given?
36
+ BW::HTTP.post("#{MotionPrime::Config.api.base}/oauth/token", request_params(data)) do |response|
37
+ access_token = if response.ok?
38
+ json = parse_json(response.body)
39
+ json[:access_token]
40
+ else
41
+ false
42
+ end
43
+ self.access_token = access_token
44
+ block.call(access_token) if use_callback
45
+ end
46
+ true
47
+ end
48
+
49
+ def api_url(path)
50
+ return path if path =~ /^http(s)?:\/\//
51
+ "#{MotionPrime::Config.api.base}/api/v1#{path}"
52
+ end
53
+
54
+ def resource_url(path)
55
+ "#{MotionPrime::Config.api.base}#{path}"
56
+ end
57
+
58
+ def request(method, path, params = {}, &block)
59
+ params.merge!(access_token: access_token)
60
+ BW::HTTP.send method, api_url(path), request_params(params) do |response|
61
+ json = parse_json(response.body.to_s)
62
+ block.call(json, response.status_code)
63
+ end
64
+ end
65
+
66
+ def get(path, params = {}, &block)
67
+ request(:get, path, params, &block)
68
+ end
69
+
70
+ def put(path, params = {}, &block)
71
+ request(:put, path, params, &block)
72
+ end
73
+
74
+ def post(path, params = {}, &block)
75
+ request(:post, path, params, &block)
76
+ end
77
+
78
+ def delete(path, params = {}, &block)
79
+ request(:delete, path, params, &block)
80
+ end
81
+ end
@@ -1,3 +1,4 @@
1
+ include EM::Eventable
1
2
  motion_require './helpers/has_authorization'
2
3
  module MotionPrime
3
4
  class BaseAppDelegate
@@ -5,21 +6,24 @@ module MotionPrime
5
6
 
6
7
  attr_accessor :window, :sidebar_container
7
8
 
9
+ def application(application, willFinishLaunchingWithOptions:opts)
10
+ application.setStatusBarStyle UIStatusBarStyleLightContent
11
+ application.setStatusBarHidden false
12
+ end
13
+
8
14
  def application(application, didFinishLaunchingWithOptions:launch_options)
9
15
  on_load(application, launch_options)
10
16
  true
11
17
  end
12
18
 
13
- def app_delegate
14
- UIApplication.sharedApplication.delegate
15
- end
16
-
17
19
  def app_window
18
20
  self.app_delegate.window
19
21
  end
20
22
 
21
23
  def open_root_screen(screen)
22
24
  screen.send(:on_screen_load) if screen.respond_to?(:on_screen_load)
25
+ screen.ensure_wrapper_controller_in_place if screen.respond_to?(:ensure_wrapper_controller_in_place)
26
+
23
27
  screen = screen.main_controller if screen.respond_to?(:main_controller)
24
28
 
25
29
  self.window ||= UIWindow.alloc.initWithFrame(UIScreen.mainScreen.bounds)
@@ -37,11 +41,12 @@ module MotionPrime
37
41
  end
38
42
 
39
43
  def sidebar?
40
- !sidebar_container.nil?
44
+ self.window.rootViewController.is_a?(SidebarContainerScreen)
41
45
  end
42
46
 
43
47
  def open_with_sidebar(content, menu, options={})
44
48
  self.sidebar_container = SidebarContainerScreen.new(menu, content, options)
49
+ self.sidebar_container.delegate = self
45
50
  open_root_screen(sidebar_container)
46
51
  end
47
52
 
@@ -52,5 +57,17 @@ module MotionPrime
52
57
  def hide_sidebar
53
58
  sidebar_container.hide_sidebar
54
59
  end
60
+
61
+ def current_user
62
+ @current_user ||= if defined?(User) && User.respond_to?(:current)
63
+ User.current
64
+ end
65
+ end
66
+
67
+ def update_current_user
68
+ user_was = @current_user
69
+ @current_user = nil
70
+ NSNotificationCenter.defaultCenter.postNotificationName(:current_user_updated, object: user_was)
71
+ end
55
72
  end
56
73
  end