motion-momentum 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (36) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +19 -0
  3. data/.travis.yml +4 -0
  4. data/Gemfile +4 -0
  5. data/LICENSE.txt +22 -0
  6. data/README.md +17 -0
  7. data/Rakefile +37 -0
  8. data/app/ios/app_delegate.rb +5 -0
  9. data/app/osx/app_delegate.rb +15 -0
  10. data/app/osx/menu.rb +130 -0
  11. data/lib/motion-momentum-ios/controller/view_controller.rb +5 -0
  12. data/lib/motion-momentum-ios/controller/view_controller_module.rb +62 -0
  13. data/lib/motion-momentum-osx/.gitkeep +0 -0
  14. data/lib/motion-momentum.rb +4 -0
  15. data/lib/motion-momentum/delegate/delegate.rb +5 -0
  16. data/lib/motion-momentum/delegate/delegate_module.rb +18 -0
  17. data/lib/motion-momentum/version.rb +3 -0
  18. data/motion-momentum.gemspec +24 -0
  19. data/resources/ios/.gitkeep +0 -0
  20. data/resources/osx/.gitkeep +0 -0
  21. data/spec/motion-momentum-ios/controller/view_controller_spec.rb +92 -0
  22. data/spec/motion-momentum-ios/mocks/controllers/custom_mock_controller.rb +5 -0
  23. data/spec/motion-momentum-ios/mocks/controllers/mock_controller.rb +8 -0
  24. data/spec/motion-momentum-ios/mocks/controllers/no_setup_mock_controller.rb +2 -0
  25. data/spec/motion-momentum-ios/mocks/delegates/custom_data_source.rb +2 -0
  26. data/spec/motion-momentum-ios/mocks/delegates/mock_delegate.rb +2 -0
  27. data/spec/motion-momentum-ios/mocks/stylesheets/custom_styles.rb +2 -0
  28. data/spec/motion-momentum-ios/mocks/stylesheets/mock_stylesheet.rb +2 -0
  29. data/spec/motion-momentum-ios/mocks/views/custom_mock_scroll_view.rb +2 -0
  30. data/spec/motion-momentum-ios/mocks/views/mock_view.rb +11 -0
  31. data/spec/motion-momentum-ios/mocks/views/no_delegate_or_data_source_mock_view.rb +2 -0
  32. data/spec/motion-momentum-osx/fake_spec.rb +5 -0
  33. data/spec/motion-momentum/delegate/delegate_spec.rb +9 -0
  34. data/spec/motion-momentum/mocks/callback_helper.rb +11 -0
  35. data/spec/motion-momentum/mocks/general_mock_delegate.rb +2 -0
  36. metadata +139 -0
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: ddc2e4b530fce838ceab0386e65b3f0a9b7d8a96
4
+ data.tar.gz: 07d02f37340b839d82333534cfd24a5bc7b95594
5
+ SHA512:
6
+ metadata.gz: 4438273e9bb261496f03fa5b78242525b446241a2440bda22ca296433b756db5267f5c53aca4bec1ee80fd4c6c720482155cefebd68aea292c34b63778365ff3
7
+ data.tar.gz: 1a816fbfd0943af5fc2de2dafcdca02ab86dbad872aa345168b82dde66a210b1feb7b3c876de78efd5b6e482c2e0754dbd5fcfb7c8fa7922b05a13009dcc4ef0
@@ -0,0 +1,19 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ Gemfile.lock
7
+ InstalledFiles
8
+ _yardoc
9
+ coverage
10
+ doc/
11
+ lib/bundler/man
12
+ pkg
13
+ rdoc
14
+ spec/reports
15
+ test/tmp
16
+ test/version_tmp
17
+ tmp
18
+ build
19
+ .repl_history
@@ -0,0 +1,4 @@
1
+ language: objective-c
2
+ gemfile:
3
+ - Gemfile
4
+ script: bundle exec rake spec && osx=true bundle exec rake spec
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in motion-momentum.gemspec
4
+ gemspec
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2014 Jack Dean Watson-Hamblin
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,17 @@
1
+ # Momentum
2
+
3
+ [![Build Status](https://travis-ci.org/FluffyJack/motion-momentum.png)](https://travis-ci.org/FluffyJack/motion-momentum) [![Code Climate](https://codeclimate.com/github/FluffyJack/motion-momentum.png)](https://codeclimate.com/github/FluffyJack/motion-momentum) [![Dependency Status](https://gemnasium.com/FluffyJack/motion-momentum.png)](https://gemnasium.com/FluffyJack/motion-momentum)
4
+
5
+ Momentum is a RubyMotion framework for creating iOS and OS X applications the "Rails" way.
6
+
7
+ ## Usage
8
+
9
+ Proposed ideas can be found in this gist: [https://gist.github.com/FluffyJack/9409243](https://gist.github.com/FluffyJack/9409243)
10
+
11
+ ## Contributing
12
+
13
+ 1. Fork it ( http://github.com/FluffyJack/motion-momentum/fork )
14
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
15
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
16
+ 4. Push to the branch (`git push origin my-new-feature`)
17
+ 5. Create new Pull Request
@@ -0,0 +1,37 @@
1
+ $:.unshift("/Library/RubyMotion/lib")
2
+ if ENV['osx']
3
+ require 'motion/project/template/osx'
4
+ else
5
+ require 'motion/project/template/ios'
6
+ end
7
+
8
+ require 'bundler'
9
+ Bundler.require(:development)
10
+
11
+ require 'motion-momentum'
12
+
13
+ module Motion
14
+ module Project
15
+ class Config
16
+ def spec_files=(spec_files)
17
+ @spec_files = spec_files
18
+ end
19
+ end
20
+ end
21
+ end
22
+
23
+ Motion::Project::App.setup do |app|
24
+ app.name = 'MomentumTest'
25
+ app.identifier = 'tv.motioninmotion.MomentumTest'
26
+ app.version = Momentum::VERSION
27
+ app.redgreen_style = :full
28
+ app.detect_dependencies = true
29
+
30
+ # Get correct files for iOS or OS X
31
+ app.files -= Dir.glob('./app/**/*.rb')
32
+ app.files += Dir.glob("./app/#{app.template}/**/*.rb")
33
+ app.spec_files -= Dir.glob('./spec/**/*.rb')
34
+ app.spec_files += Dir.glob('./spec/motion-momentum/**/*.rb')
35
+ app.spec_files += Dir.glob("./spec/motion-momentum-#{app.template}/**/*.rb")
36
+ app.resources_dirs = ["resources/#{app.template}"]
37
+ end
@@ -0,0 +1,5 @@
1
+ class AppDelegate
2
+ def application(application, didFinishLaunchingWithOptions:launchOptions)
3
+ true
4
+ end
5
+ end
@@ -0,0 +1,15 @@
1
+ class AppDelegate
2
+ def applicationDidFinishLaunching(notification)
3
+ buildMenu
4
+ buildWindow
5
+ end
6
+
7
+ def buildWindow
8
+ @mainWindow = NSWindow.alloc.initWithContentRect([[240, 180], [480, 360]],
9
+ styleMask: NSTitledWindowMask|NSClosableWindowMask|NSMiniaturizableWindowMask|NSResizableWindowMask,
10
+ backing: NSBackingStoreBuffered,
11
+ defer: false)
12
+ @mainWindow.title = NSBundle.mainBundle.infoDictionary['CFBundleName']
13
+ @mainWindow.orderFrontRegardless
14
+ end
15
+ end
@@ -0,0 +1,130 @@
1
+ class AppDelegate
2
+ def buildMenu
3
+ @mainMenu = NSMenu.new
4
+
5
+ addAppNameMenu
6
+ addFileMenu
7
+ addEditMenu
8
+
9
+ fontMenu = createFontMenu
10
+ textMenu = createTextMenu
11
+ addMenu('Format') do
12
+ addItem fontMenu
13
+ addItem textMenu
14
+ end
15
+
16
+ addViewMenu
17
+
18
+ NSApp.windowsMenu = addMenu('Window') do
19
+ addItemWithTitle('Minimize', action: 'performMiniaturize:', keyEquivalent: 'm')
20
+ addItemWithTitle('Zoom', action: 'performZoom:', keyEquivalent: '')
21
+ addItem(NSMenuItem.separatorItem)
22
+ addItemWithTitle('Bring All To Front', action: 'arrangeInFront:', keyEquivalent: '')
23
+ end.menu
24
+
25
+ NSApp.helpMenu = addMenu('Help') do
26
+ addItemWithTitle("#{NSBundle.mainBundle.infoDictionary['CFBundleName']} Help", action: 'showHelp:', keyEquivalent: '?')
27
+ end.menu
28
+
29
+ NSApp.mainMenu = @mainMenu
30
+ end
31
+
32
+ private
33
+
34
+ def addAppNameMenu
35
+ appName = NSBundle.mainBundle.infoDictionary['CFBundleName']
36
+ addMenu(appName) do
37
+ addItemWithTitle("About #{appName}", action: 'orderFrontStandardAboutPanel:', keyEquivalent: '')
38
+ addItem(NSMenuItem.separatorItem)
39
+ addItemWithTitle('Preferences', action: 'openPreferences:', keyEquivalent: ',')
40
+ addItem(NSMenuItem.separatorItem)
41
+ servicesItem = addItemWithTitle('Services', action: nil, keyEquivalent: '')
42
+ NSApp.servicesMenu = servicesItem.submenu = NSMenu.new
43
+ addItem(NSMenuItem.separatorItem)
44
+ addItemWithTitle("Hide #{appName}", action: 'hide:', keyEquivalent: 'h')
45
+ item = addItemWithTitle('Hide Others', action: 'hideOtherApplications:', keyEquivalent: 'H')
46
+ item.keyEquivalentModifierMask = NSCommandKeyMask|NSAlternateKeyMask
47
+ addItemWithTitle('Show All', action: 'unhideAllApplications:', keyEquivalent: '')
48
+ addItem(NSMenuItem.separatorItem)
49
+ addItemWithTitle("Quit #{appName}", action: 'terminate:', keyEquivalent: 'q')
50
+ end
51
+ end
52
+
53
+ def addFileMenu
54
+ addMenu('File') do
55
+ addItemWithTitle('New', action: 'newDocument:', keyEquivalent: 'n')
56
+ addItemWithTitle('Open…', action: 'openDocument:', keyEquivalent: 'o')
57
+ addItem(NSMenuItem.separatorItem)
58
+ addItemWithTitle('Close', action: 'performClose:', keyEquivalent: 'w')
59
+ addItemWithTitle('Save…', action: 'saveDocument:', keyEquivalent: 's')
60
+ addItemWithTitle('Revert to Saved', action: 'revertDocumentToSaved:', keyEquivalent: '')
61
+ addItem(NSMenuItem.separatorItem)
62
+ addItemWithTitle('Page Setup…', action: 'runPageLayout:', keyEquivalent: 'P')
63
+ addItemWithTitle('Print…', action: 'printDocument:', keyEquivalent: 'p')
64
+ end
65
+ end
66
+
67
+ def addEditMenu
68
+ addMenu('Edit') do
69
+ addItemWithTitle('Undo', action: 'undo:', keyEquivalent: 'z')
70
+ addItemWithTitle('Redo', action: 'redo:', keyEquivalent: 'Z')
71
+ addItem(NSMenuItem.separatorItem)
72
+ addItemWithTitle('Cut', action: 'cut:', keyEquivalent: 'x')
73
+ addItemWithTitle('Copy', action: 'copy:', keyEquivalent: 'c')
74
+ addItemWithTitle('Paste', action: 'paste:', keyEquivalent: 'v')
75
+ item = addItemWithTitle('Paste and Match Style', action: 'pasteAsPlainText:', keyEquivalent: 'V')
76
+ item.keyEquivalentModifierMask = NSCommandKeyMask|NSAlternateKeyMask
77
+ addItemWithTitle('Delete', action: 'delete:', keyEquivalent: '')
78
+ addItemWithTitle('Select All', action: 'selectAll:', keyEquivalent: 'a')
79
+ end
80
+ end
81
+
82
+ def addViewMenu
83
+ addMenu('View') do
84
+ item = addItemWithTitle('Show Toolbar', action: 'toggleToolbarShown:', keyEquivalent: 't')
85
+ item.keyEquivalentModifierMask = NSCommandKeyMask|NSAlternateKeyMask
86
+ addItemWithTitle('Customize Toolbar…', action: 'runToolbarCustomizationPalette:', keyEquivalent: '')
87
+ end
88
+ end
89
+
90
+ def addMenu(title, &b)
91
+ item = createMenu(title, &b)
92
+ @mainMenu.addItem item
93
+ item
94
+ end
95
+
96
+ def createFontMenu
97
+ createMenu('Font') do
98
+ addItemWithTitle('Show Fonts', action: 'orderFrontFontPanel:', keyEquivalent: 't')
99
+ addItemWithTitle('Bold', action: 'addFontTrait:', keyEquivalent: 'b')
100
+ addItemWithTitle('Italic', action: 'addFontTrait:', keyEquivalent: 'i')
101
+ addItemWithTitle('Underline', action: 'underline:', keyEquivalent: 'u')
102
+ addItem(NSMenuItem.separatorItem)
103
+ addItemWithTitle('Bigger', action: 'modifyFont:', keyEquivalent: '+')
104
+ addItemWithTitle('Smaller', action: 'modifyFont:', keyEquivalent: '-')
105
+ end
106
+ end
107
+
108
+ def createTextMenu
109
+ createMenu('Text') do
110
+ addItemWithTitle('Align Left', action: 'alignLeft:', keyEquivalent: '{')
111
+ addItemWithTitle('Center', action: 'alignCenter:', keyEquivalent: '|')
112
+ addItemWithTitle('Justify', action: 'alignJustified:', keyEquivalent: '')
113
+ addItemWithTitle('Align Right', action: 'alignRight:', keyEquivalent: '}')
114
+ addItem(NSMenuItem.separatorItem)
115
+ addItemWithTitle('Show Ruler', action: 'toggleRuler:', keyEquivalent: '')
116
+ item = addItemWithTitle('Copy Ruler', action: 'copyRuler:', keyEquivalent: 'c')
117
+ item.keyEquivalentModifierMask = NSCommandKeyMask|NSControlKeyMask
118
+ item = addItemWithTitle('Paste Ruler', action: 'pasteRuler:', keyEquivalent: 'v')
119
+ item.keyEquivalentModifierMask = NSCommandKeyMask|NSControlKeyMask
120
+ end
121
+ end
122
+
123
+ def createMenu(title, &b)
124
+ menu = NSMenu.alloc.initWithTitle(title)
125
+ menu.instance_eval(&b) if b
126
+ item = NSMenuItem.alloc.initWithTitle(title, action: nil, keyEquivalent: '')
127
+ item.submenu = menu
128
+ item
129
+ end
130
+ end
@@ -0,0 +1,5 @@
1
+ module Momentum
2
+ class ViewController < UIViewController
3
+ include ViewControllerModule
4
+ end
5
+ end
@@ -0,0 +1,62 @@
1
+ module Momentum
2
+ module ViewControllerModule
3
+
4
+ def self.included(base)
5
+ base.extend(ClassMethods)
6
+ end
7
+
8
+ module ClassMethods
9
+ %w(view delegate stylesheet).each do |class_helper_method|
10
+ define_method class_helper_method.to_sym do |class_string|
11
+ send :define_method, "#{class_helper_method}_class".to_sym do
12
+ if Object.const_defined? class_string
13
+ Object.const_get class_string
14
+ else
15
+ puts "[Momentum Warning] ::: The #{class_helper_method} class #{class_string} does not exist, you attempted to use it in #{self.class}"
16
+ end
17
+ end
18
+ end
19
+ end
20
+
21
+ def title(title)
22
+ send :define_method, :class_title do
23
+ title
24
+ end
25
+ end
26
+ end
27
+
28
+ attr_accessor :delegate, :delegate_class, :view_class, :stylesheet_class, :class_title
29
+
30
+ def init
31
+ super
32
+ self.view_class = find_related_class('View')
33
+ self.delegate_class = find_related_class('Delegate')
34
+ self.stylesheet_class = find_related_class('Stylesheet')
35
+ self
36
+ end
37
+
38
+ def loadView
39
+ self.view = self.view_class.new
40
+ self.delegate = self.delegate_class.new
41
+ self.view.delegate = self.delegate if self.view.class.instance_methods.include?(:delegate)
42
+ self.view.dataSource = self.delegate if self.view.class.instance_methods.include?(:dataSource)
43
+ end
44
+
45
+ def viewDidAppear(animated)
46
+ self.setup if self.class.instance_methods.include?(:setup)
47
+ end
48
+
49
+ def title
50
+ super || class_title
51
+ end
52
+
53
+ private
54
+
55
+ def find_related_class(type)
56
+ class_string = self.class.to_s.gsub('Controller', type)
57
+ if Object.const_defined? class_string
58
+ Object.const_get class_string
59
+ end
60
+ end
61
+ end
62
+ end
File without changes
@@ -0,0 +1,4 @@
1
+ Motion::Project::App.setup do |app|
2
+ app.files += Dir.glob(File.join(File.dirname(__FILE__), 'motion-momentum/**/*.rb'))
3
+ app.files += Dir.glob(File.join(File.dirname(__FILE__), "motion-momentum-#{app.template}/**/*.rb"))
4
+ end
@@ -0,0 +1,5 @@
1
+ module Momentum
2
+ class Delegate
3
+ include DelegateModule
4
+ end
5
+ end
@@ -0,0 +1,18 @@
1
+ module Momentum
2
+ module DelegateModule
3
+
4
+ def self.included(base)
5
+ base.extend(ClassMethods)
6
+ end
7
+
8
+ module ClassMethods
9
+ end
10
+
11
+ attr_accessor :data
12
+
13
+ def initialize
14
+ self.data = {}
15
+ end
16
+
17
+ end
18
+ end
@@ -0,0 +1,3 @@
1
+ module Momentum
2
+ VERSION = '0.1.0'
3
+ end
@@ -0,0 +1,24 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'motion-momentum/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "motion-momentum"
8
+ spec.version = Momentum::VERSION
9
+ spec.authors = ["Jack Dean Watson-Hamblin"]
10
+ spec.email = ["info@fluffyjack.com"]
11
+ spec.summary = %q{Momentum is a RubyMotion framework for creating iOS and OS X applications the "Rails" way.}
12
+ spec.description = %q{Whether you're a Rails developer or not, RubyMotion is Ruby for iOS and OS X and so it should be treated that way. Momentum is a RubyMotion framework for creating iOS and OS X applications the "Rails" way, with helpful ways to clean up and organise your code, and some standardised convention-over-configuration stuff.}
13
+ spec.homepage = "https://github.com/FluffyJack/motion-momentum"
14
+ spec.license = "MIT"
15
+
16
+ spec.files = `git ls-files -z`.split("\x0")
17
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
18
+ spec.test_files = spec.files.grep(%r{^(spec)/})
19
+ spec.require_paths = ["lib"]
20
+
21
+ spec.add_development_dependency "bundler", ">= 1.3.5"
22
+ spec.add_development_dependency "rake"
23
+ spec.add_development_dependency "motion-redgreen"
24
+ end
File without changes
File without changes
@@ -0,0 +1,92 @@
1
+ describe Momentum::ViewController do
2
+
3
+ context "normal controller" do
4
+
5
+ before { @vc = MockController.new }
6
+
7
+ it "should default to using MockView as it's view class" do
8
+ @vc.view_class.should == MockView
9
+ end
10
+
11
+ it "should default to using MockDelegate as it's delegate class" do
12
+ @vc.delegate_class.should == MockDelegate
13
+ end
14
+
15
+ it "should default to using MockStylesheet as it's stylesheet class" do
16
+ @vc.stylesheet_class.should == MockStylesheet
17
+ end
18
+
19
+ it "should use the view class as it's view when the view is loaded" do
20
+ @vc.loadView
21
+ @vc.view.class.should == MockView
22
+ end
23
+
24
+ it "should use the delegate class as it's delegate when the view is loaded" do
25
+ @vc.loadView
26
+ @vc.delegate.class.should == MockDelegate
27
+ end
28
+
29
+ it "should use the delegate class as the view's delegate when the view is loaded" do
30
+ @vc.loadView
31
+ @vc.view.delegate.class.should == MockDelegate
32
+ end
33
+
34
+ it "should use the delegate class as the view's dataSource when the view is loaded" do
35
+ @vc.loadView
36
+ @vc.view.dataSource.class.should == MockDelegate
37
+ end
38
+
39
+ it "does not set the delegate or data source on the view if it does not need one" do
40
+ @vc.view_class = NoDelegateOrDataSourceMockView
41
+ lambda { @vc.loadView }.should.not.raise(NoMethodError)
42
+ end
43
+
44
+ it "calls setup if it's defined when the view appears" do
45
+ CallbackHelper.shared.data[:setup_called] = false
46
+ @vc.viewDidAppear(true)
47
+ CallbackHelper.shared.data[:setup_called].should == true
48
+ end
49
+
50
+ it "can set the title for the class" do
51
+ @vc.title.should == "Mock"
52
+ end
53
+
54
+ it "will still use the title instance variable though" do
55
+ @vc.viewDidAppear(true)
56
+ @vc.title.should == "Custom"
57
+ end
58
+
59
+ end
60
+
61
+ context "no setup controller" do
62
+
63
+ before { @vc = NoSetupMockController.new }
64
+
65
+ it "does not call setup if it's not defined when the view appears" do
66
+ lambda { @vc.viewDidAppear(true) }.should.not.raise(NoMethodError)
67
+ end
68
+
69
+ it "will return nil with no class title or title instance variable" do
70
+ @vc.title.should == nil
71
+ end
72
+
73
+ end
74
+
75
+ context "custom related classes controller" do
76
+
77
+ before { @vc = CustomMockController.new }
78
+
79
+ it "uses the defined view" do
80
+ @vc.view_class.should == CustomMockScrollView
81
+ end
82
+
83
+ it "uses the defined delegate" do
84
+ @vc.delegate_class.should == CustomDataSource
85
+ end
86
+
87
+ it "uses the defined stylesheet" do
88
+ @vc.stylesheet_class.should == CustomStyles
89
+ end
90
+
91
+ end
92
+ end
@@ -0,0 +1,5 @@
1
+ class CustomMockController < Momentum::ViewController
2
+ view "CustomMockScrollView"
3
+ delegate "CustomDataSource"
4
+ stylesheet "CustomStyles"
5
+ end
@@ -0,0 +1,8 @@
1
+ class MockController < Momentum::ViewController
2
+ title "Mock"
3
+
4
+ def setup
5
+ CallbackHelper.shared.data[:setup_called] = true
6
+ self.title = "Custom"
7
+ end
8
+ end
@@ -0,0 +1,2 @@
1
+ class NoSetupMockController < Momentum::ViewController
2
+ end
@@ -0,0 +1,2 @@
1
+ class CustomDataSource < Momentum::Delegate
2
+ end
@@ -0,0 +1,2 @@
1
+ class MockDelegate < Momentum::Delegate
2
+ end
@@ -0,0 +1,2 @@
1
+ class CustomStyles
2
+ end
@@ -0,0 +1,2 @@
1
+ class MockStylesheet
2
+ end
@@ -0,0 +1,2 @@
1
+ class CustomMockScrollView < UIScrollView
2
+ end
@@ -0,0 +1,11 @@
1
+ class MockView < UIView
2
+ attr_accessor :delegate, :dataSource
3
+
4
+ def delegate=(delegate)
5
+ @delegate = WeakRef.new(delegate)
6
+ end
7
+
8
+ def dataSource=(dataSource)
9
+ @dataSource = WeakRef.new(dataSource)
10
+ end
11
+ end
@@ -0,0 +1,2 @@
1
+ class NoDelegateOrDataSourceMockView < UIView
2
+ end
@@ -0,0 +1,5 @@
1
+ describe "Nothing" do
2
+ it "is true" do
3
+ true.should == true
4
+ end
5
+ end
@@ -0,0 +1,9 @@
1
+ describe Momentum::Delegate do
2
+
3
+ before { @delegate = GeneralMockDelegate.new }
4
+
5
+ it "starts with an empty data hash" do
6
+ @delegate.data.class.should == Hash
7
+ end
8
+
9
+ end
@@ -0,0 +1,11 @@
1
+ class CallbackHelper
2
+ attr_accessor :data
3
+
4
+ def self.shared
5
+ Dispatch.once do
6
+ @shared = self.new
7
+ @shared.data = {}
8
+ end
9
+ @shared
10
+ end
11
+ end
@@ -0,0 +1,2 @@
1
+ class GeneralMockDelegate < Momentum::Delegate
2
+ end
metadata ADDED
@@ -0,0 +1,139 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: motion-momentum
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Jack Dean Watson-Hamblin
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2014-03-10 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: bundler
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: 1.3.5
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: 1.3.5
27
+ - !ruby/object:Gem::Dependency
28
+ name: rake
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: motion-redgreen
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ description: Whether you're a Rails developer or not, RubyMotion is Ruby for iOS and
56
+ OS X and so it should be treated that way. Momentum is a RubyMotion framework for
57
+ creating iOS and OS X applications the "Rails" way, with helpful ways to clean up
58
+ and organise your code, and some standardised convention-over-configuration stuff.
59
+ email:
60
+ - info@fluffyjack.com
61
+ executables: []
62
+ extensions: []
63
+ extra_rdoc_files: []
64
+ files:
65
+ - ".gitignore"
66
+ - ".travis.yml"
67
+ - Gemfile
68
+ - LICENSE.txt
69
+ - README.md
70
+ - Rakefile
71
+ - app/ios/app_delegate.rb
72
+ - app/osx/app_delegate.rb
73
+ - app/osx/menu.rb
74
+ - lib/motion-momentum-ios/controller/view_controller.rb
75
+ - lib/motion-momentum-ios/controller/view_controller_module.rb
76
+ - lib/motion-momentum-osx/.gitkeep
77
+ - lib/motion-momentum.rb
78
+ - lib/motion-momentum/delegate/delegate.rb
79
+ - lib/motion-momentum/delegate/delegate_module.rb
80
+ - lib/motion-momentum/version.rb
81
+ - motion-momentum.gemspec
82
+ - resources/ios/.gitkeep
83
+ - resources/osx/.gitkeep
84
+ - spec/motion-momentum-ios/controller/view_controller_spec.rb
85
+ - spec/motion-momentum-ios/mocks/controllers/custom_mock_controller.rb
86
+ - spec/motion-momentum-ios/mocks/controllers/mock_controller.rb
87
+ - spec/motion-momentum-ios/mocks/controllers/no_setup_mock_controller.rb
88
+ - spec/motion-momentum-ios/mocks/delegates/custom_data_source.rb
89
+ - spec/motion-momentum-ios/mocks/delegates/mock_delegate.rb
90
+ - spec/motion-momentum-ios/mocks/stylesheets/custom_styles.rb
91
+ - spec/motion-momentum-ios/mocks/stylesheets/mock_stylesheet.rb
92
+ - spec/motion-momentum-ios/mocks/views/custom_mock_scroll_view.rb
93
+ - spec/motion-momentum-ios/mocks/views/mock_view.rb
94
+ - spec/motion-momentum-ios/mocks/views/no_delegate_or_data_source_mock_view.rb
95
+ - spec/motion-momentum-osx/fake_spec.rb
96
+ - spec/motion-momentum/delegate/delegate_spec.rb
97
+ - spec/motion-momentum/mocks/callback_helper.rb
98
+ - spec/motion-momentum/mocks/general_mock_delegate.rb
99
+ homepage: https://github.com/FluffyJack/motion-momentum
100
+ licenses:
101
+ - MIT
102
+ metadata: {}
103
+ post_install_message:
104
+ rdoc_options: []
105
+ require_paths:
106
+ - lib
107
+ required_ruby_version: !ruby/object:Gem::Requirement
108
+ requirements:
109
+ - - ">="
110
+ - !ruby/object:Gem::Version
111
+ version: '0'
112
+ required_rubygems_version: !ruby/object:Gem::Requirement
113
+ requirements:
114
+ - - ">="
115
+ - !ruby/object:Gem::Version
116
+ version: '0'
117
+ requirements: []
118
+ rubyforge_project:
119
+ rubygems_version: 2.1.11
120
+ signing_key:
121
+ specification_version: 4
122
+ summary: Momentum is a RubyMotion framework for creating iOS and OS X applications
123
+ the "Rails" way.
124
+ test_files:
125
+ - spec/motion-momentum-ios/controller/view_controller_spec.rb
126
+ - spec/motion-momentum-ios/mocks/controllers/custom_mock_controller.rb
127
+ - spec/motion-momentum-ios/mocks/controllers/mock_controller.rb
128
+ - spec/motion-momentum-ios/mocks/controllers/no_setup_mock_controller.rb
129
+ - spec/motion-momentum-ios/mocks/delegates/custom_data_source.rb
130
+ - spec/motion-momentum-ios/mocks/delegates/mock_delegate.rb
131
+ - spec/motion-momentum-ios/mocks/stylesheets/custom_styles.rb
132
+ - spec/motion-momentum-ios/mocks/stylesheets/mock_stylesheet.rb
133
+ - spec/motion-momentum-ios/mocks/views/custom_mock_scroll_view.rb
134
+ - spec/motion-momentum-ios/mocks/views/mock_view.rb
135
+ - spec/motion-momentum-ios/mocks/views/no_delegate_or_data_source_mock_view.rb
136
+ - spec/motion-momentum-osx/fake_spec.rb
137
+ - spec/motion-momentum/delegate/delegate_spec.rb
138
+ - spec/motion-momentum/mocks/callback_helper.rb
139
+ - spec/motion-momentum/mocks/general_mock_delegate.rb