motify 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +16 -0
- data/README.md +39 -0
- data/Rakefile +9 -0
- data/app/app_delegate.rb +5 -0
- data/example/.gitignore +16 -0
- data/example/Rakefile +10 -0
- data/example/app/app_delegate.rb +12 -0
- data/example/app/commander.rb +7 -0
- data/example/app/soldier.rb +11 -0
- data/example/resources/Default-568h@2x.png +0 -0
- data/example/spec/main_spec.rb +9 -0
- data/lib/motify.rb +24 -0
- data/lib/motify/motify.rb +44 -0
- data/lib/motify/version.rb +5 -0
- data/motify.gemspec +17 -0
- data/spec/motify_spec.rb +56 -0
- metadata +78 -0
data/.gitignore
ADDED
data/README.md
ADDED
@@ -0,0 +1,39 @@
|
|
1
|
+
Motify
|
2
|
+
|
3
|
+
A minimal DSL for doing notifications in RubyMotion (using NSNotificationCenter)
|
4
|
+
Just mix in the module to send or receive notifications
|
5
|
+
|
6
|
+
```ruby
|
7
|
+
#handle notifications
|
8
|
+
class Soldier
|
9
|
+
include Motify
|
10
|
+
|
11
|
+
def initialize
|
12
|
+
on :new_mission_started do |location|
|
13
|
+
puts "ready to go to #{location}!"
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
def become_disillusioned
|
18
|
+
forget :new_mission_started
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
#fire notifications
|
23
|
+
class Commander
|
24
|
+
include Motify
|
25
|
+
|
26
|
+
def order_mission
|
27
|
+
fire :new_mission_started, 'russia'
|
28
|
+
end
|
29
|
+
end
|
30
|
+
```
|
31
|
+
|
32
|
+
## Installation
|
33
|
+
Add it to your Gemfile:
|
34
|
+
|
35
|
+
`gem 'motify'`
|
36
|
+
|
37
|
+
Or install it manually:
|
38
|
+
|
39
|
+
`gem install motify`
|
data/Rakefile
ADDED
data/app/app_delegate.rb
ADDED
data/example/.gitignore
ADDED
data/example/Rakefile
ADDED
@@ -0,0 +1,10 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
$:.unshift("/Library/RubyMotion/lib")
|
3
|
+
require 'motion/project'
|
4
|
+
$:.unshift("../lib")
|
5
|
+
require '../lib/motify'
|
6
|
+
|
7
|
+
Motion::Project::App.setup do |app|
|
8
|
+
# Use `rake config' to see complete project settings.
|
9
|
+
app.name = 'example'
|
10
|
+
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
class AppDelegate
|
2
|
+
def application(application, didFinishLaunchingWithOptions:launchOptions)
|
3
|
+
soldier = Soldier.new
|
4
|
+
commander = Commander.new
|
5
|
+
p "Commander starting mission"
|
6
|
+
commander.order_mission #should prompt soldier to state readiness
|
7
|
+
|
8
|
+
soldier.become_disillusioned
|
9
|
+
commander.order_mission #soldier will be silent
|
10
|
+
true
|
11
|
+
end
|
12
|
+
end
|
Binary file
|
data/lib/motify.rb
ADDED
@@ -0,0 +1,24 @@
|
|
1
|
+
#blatently stole this code from sugarcube
|
2
|
+
unless defined?(Motion::Project::Config)
|
3
|
+
raise "The motify gem must be required within a RubyMotion project Rakefile."
|
4
|
+
end
|
5
|
+
|
6
|
+
|
7
|
+
Motion::Project::App.setup do |app|
|
8
|
+
# scans app.files until it finds app/ (the default)
|
9
|
+
# if found, it inserts just before those files, otherwise it will insert to
|
10
|
+
# the end of the list
|
11
|
+
insert_point = 0
|
12
|
+
app.files.each_index do |index|
|
13
|
+
file = app.files[index]
|
14
|
+
if file =~ /^(?:\.\/)?app\//
|
15
|
+
# found app/, so stop looking
|
16
|
+
break
|
17
|
+
end
|
18
|
+
insert_point = index + 1
|
19
|
+
end
|
20
|
+
|
21
|
+
Dir.glob(File.join(File.dirname(__FILE__), '/motify/**/*.rb')).reverse.each do |file|
|
22
|
+
app.files.insert(insert_point, file)
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,44 @@
|
|
1
|
+
module Motify
|
2
|
+
def observers
|
3
|
+
@observers ||= {}
|
4
|
+
end
|
5
|
+
|
6
|
+
def on(state,&block)
|
7
|
+
observers[state] = add_observer(state,nil) do |notification|
|
8
|
+
if block.arity == 0
|
9
|
+
block.call
|
10
|
+
else
|
11
|
+
block.call notification.object
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
def fire(state, obj=nil)
|
17
|
+
default_center.postNotificationName(state, object: obj, userInfo: obj)
|
18
|
+
end
|
19
|
+
|
20
|
+
def observes?(state)
|
21
|
+
observers.keys.include? state
|
22
|
+
end
|
23
|
+
|
24
|
+
def forget(state)
|
25
|
+
default_center.removeObserver(observers.delete(state))
|
26
|
+
end
|
27
|
+
|
28
|
+
def forget_all
|
29
|
+
observers.each_key{|state| forget(state)}
|
30
|
+
end
|
31
|
+
|
32
|
+
private
|
33
|
+
def add_observer(state, object, &block)
|
34
|
+
default_center.addObserverForName(state, object:nil, queue:main_queue, usingBlock:block)
|
35
|
+
end
|
36
|
+
|
37
|
+
def default_center
|
38
|
+
NSNotificationCenter.defaultCenter
|
39
|
+
end
|
40
|
+
|
41
|
+
def main_queue
|
42
|
+
NSOperationQueue.mainQueue
|
43
|
+
end
|
44
|
+
end
|
data/motify.gemspec
ADDED
@@ -0,0 +1,17 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
require File.expand_path('../lib/motify/version', __FILE__)
|
3
|
+
|
4
|
+
Gem::Specification.new do |s|
|
5
|
+
s.name = "motify"
|
6
|
+
s.version = Motify::VERSION
|
7
|
+
s.authors = ["Michael Erasmus"]
|
8
|
+
s.email = ["hi@michaelerasm.us"]
|
9
|
+
s.homepage = "https://github.com/michael-erasmus/motify"
|
10
|
+
s.summary = "A minimal DSL for doing notifications in RubyMotion (using NSNotificationCenter)"
|
11
|
+
s.description = "A minimal DSL for doing notifications in RubyMotion (using NSNotificationCenter)"
|
12
|
+
s.files = `git ls-files`.split($\)
|
13
|
+
s.test_files = s.files.grep(%r{^(test|spec|features)/})
|
14
|
+
s.require_paths = ["lib"]
|
15
|
+
|
16
|
+
s.add_development_dependency 'rake'
|
17
|
+
end
|
data/spec/motify_spec.rb
ADDED
@@ -0,0 +1,56 @@
|
|
1
|
+
describe "motify" do
|
2
|
+
before do
|
3
|
+
@hn = HasNotifications.new
|
4
|
+
@hn.extend Motify
|
5
|
+
end
|
6
|
+
|
7
|
+
describe 'on' do
|
8
|
+
it 'observes notifications' do
|
9
|
+
@hn.on :bla {|object| observed = true}
|
10
|
+
@hn.should.observes :bla
|
11
|
+
end
|
12
|
+
|
13
|
+
it 'doesnt need to care about callback args' do
|
14
|
+
@hn.on :yolo { puts :yolo }
|
15
|
+
@hn.fire :yolo
|
16
|
+
true.should == true #shouldnt raise error
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
it 'fires notifications' do
|
21
|
+
fired = false
|
22
|
+
@hn.on :foo {|object| fired = true}
|
23
|
+
@hn.fire :foo
|
24
|
+
fired.should == true
|
25
|
+
end
|
26
|
+
|
27
|
+
it 'fires notifications, passing in data' do
|
28
|
+
passed = nil
|
29
|
+
@hn.on :baz {|object| passed = object}
|
30
|
+
@hn.fire :baz, "baz"
|
31
|
+
passed.should == "baz"
|
32
|
+
end
|
33
|
+
|
34
|
+
it 'forgets notifications' do
|
35
|
+
fired = false
|
36
|
+
@hn.on :bar {|o| fired = true}
|
37
|
+
@hn.forget :bar
|
38
|
+
@hn.fire :bar
|
39
|
+
@hn.should.not.observes :bar
|
40
|
+
fired.should == false
|
41
|
+
end
|
42
|
+
|
43
|
+
it 'forgets all notifications' do
|
44
|
+
@hn.on :foo {|o| }
|
45
|
+
@hn.on :bar {|o| }
|
46
|
+
|
47
|
+
@hn.forget_all
|
48
|
+
|
49
|
+
@hn.should.not.observes :foo
|
50
|
+
@hn.should.not.observes :bar
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
|
55
|
+
class HasNotifications
|
56
|
+
end
|
metadata
ADDED
@@ -0,0 +1,78 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: motify
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Michael Erasmus
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2013-03-08 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: rake
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
18
|
+
requirements:
|
19
|
+
- - ! '>='
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: '0'
|
22
|
+
type: :development
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ! '>='
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: '0'
|
30
|
+
description: A minimal DSL for doing notifications in RubyMotion (using NSNotificationCenter)
|
31
|
+
email:
|
32
|
+
- hi@michaelerasm.us
|
33
|
+
executables: []
|
34
|
+
extensions: []
|
35
|
+
extra_rdoc_files: []
|
36
|
+
files:
|
37
|
+
- .gitignore
|
38
|
+
- README.md
|
39
|
+
- Rakefile
|
40
|
+
- app/app_delegate.rb
|
41
|
+
- example/.gitignore
|
42
|
+
- example/Rakefile
|
43
|
+
- example/app/app_delegate.rb
|
44
|
+
- example/app/commander.rb
|
45
|
+
- example/app/soldier.rb
|
46
|
+
- example/resources/Default-568h@2x.png
|
47
|
+
- example/spec/main_spec.rb
|
48
|
+
- lib/motify.rb
|
49
|
+
- lib/motify/motify.rb
|
50
|
+
- lib/motify/version.rb
|
51
|
+
- motify.gemspec
|
52
|
+
- spec/motify_spec.rb
|
53
|
+
homepage: https://github.com/michael-erasmus/motify
|
54
|
+
licenses: []
|
55
|
+
post_install_message:
|
56
|
+
rdoc_options: []
|
57
|
+
require_paths:
|
58
|
+
- lib
|
59
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
60
|
+
none: false
|
61
|
+
requirements:
|
62
|
+
- - ! '>='
|
63
|
+
- !ruby/object:Gem::Version
|
64
|
+
version: '0'
|
65
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
66
|
+
none: false
|
67
|
+
requirements:
|
68
|
+
- - ! '>='
|
69
|
+
- !ruby/object:Gem::Version
|
70
|
+
version: '0'
|
71
|
+
requirements: []
|
72
|
+
rubyforge_project:
|
73
|
+
rubygems_version: 1.8.24
|
74
|
+
signing_key:
|
75
|
+
specification_version: 3
|
76
|
+
summary: A minimal DSL for doing notifications in RubyMotion (using NSNotificationCenter)
|
77
|
+
test_files:
|
78
|
+
- spec/motify_spec.rb
|