motion-launchpad 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/README.md +51 -0
- data/lib/motion-launchpad.rb +9 -0
- data/lib/motion/launchpad.rb +20 -0
- data/lib/motion/launchpad/event.rb +23 -0
- data/lib/motion/launchpad/schedule.rb +44 -0
- data/lib/motion/launchpad/version.rb +5 -0
- data/spec/configuration_spec.rb +22 -0
- data/spec/event_spec.rb +39 -0
- data/spec/schedule_spec.rb +65 -0
- metadata +71 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 9d8475a91ccb4f9f7145fbe256abe129be4875fb
|
4
|
+
data.tar.gz: c3e2299b74b69312bfc1b00545dfde659c032dca
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 4ac55aa3d16ce738f3aa5d2e92bdc3dde59fd3ad913b57049e874303427fdd3dde50d4e6caf7de30e3cbeff91824c73987d608b96a005aaa1ec867724dc2d8af
|
7
|
+
data.tar.gz: f732c2cf51d486640bcea82f1c9e3fa5ccf4ef75c82d10c7fff5320a6a5ee385a0e7948de8b2e88cd263985b7ffcd749dae86f5916136aaf15958ab2c86d18b5
|
data/README.md
ADDED
@@ -0,0 +1,51 @@
|
|
1
|
+
# motion-launchpad
|
2
|
+
Provides a simple DSL to easily schedule events, on the 1st, 3rd, 500th, or every launch. This gem requires [RubyMotion](http://www.rubymotion.com).
|
3
|
+
|
4
|
+
## Installation
|
5
|
+
|
6
|
+
Add the following to your project's Gemfile to work with bundler:
|
7
|
+
|
8
|
+
```ruby
|
9
|
+
gem 'motion-launchpad'
|
10
|
+
```
|
11
|
+
|
12
|
+
Install with bundler:
|
13
|
+
|
14
|
+
```shell
|
15
|
+
bundle install
|
16
|
+
```
|
17
|
+
|
18
|
+
## Using
|
19
|
+
|
20
|
+
After installation, you can use the gem in your project like so:
|
21
|
+
|
22
|
+
```ruby
|
23
|
+
class AppDelegate
|
24
|
+
def application(app, didFinishLaunchingWithOptions: options)
|
25
|
+
|
26
|
+
setup_schedule
|
27
|
+
Motion::Launchpad.run!
|
28
|
+
end
|
29
|
+
|
30
|
+
private
|
31
|
+
|
32
|
+
def setup_schedule
|
33
|
+
Motion::Launchpad.configure do |config|
|
34
|
+
config.on :every do
|
35
|
+
# maybe track app launch with analytics?
|
36
|
+
end
|
37
|
+
|
38
|
+
config.on 1 do
|
39
|
+
# first launch, maybe show user a tutorial?
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
# You can call `configure` multiple times
|
45
|
+
Motion::Launchpad.configure do |config|
|
46
|
+
config.on 5 do
|
47
|
+
# ask user to rate your app? Hate doing that, but best I could come up with
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
```
|
@@ -0,0 +1,9 @@
|
|
1
|
+
unless defined?(Motion::Project::Config)
|
2
|
+
raise "This file must be required within a RubyMotion project Rakefile."
|
3
|
+
end
|
4
|
+
|
5
|
+
lib_dir_path = File.dirname(File.expand_path(__FILE__))
|
6
|
+
Motion::Project::App.setup do |app|
|
7
|
+
gem_files = Dir.glob(File.join(lib_dir_path, "motion/**/*.rb"))
|
8
|
+
app.files.unshift(gem_files).flatten!
|
9
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
module Motion
|
2
|
+
module Launchpad
|
3
|
+
|
4
|
+
class << self
|
5
|
+
attr_accessor :instance
|
6
|
+
end
|
7
|
+
|
8
|
+
def configure(*args, &block)
|
9
|
+
self.instance = Schedule.new(*args) if instance.nil?
|
10
|
+
instance.configure(&block) if block_given?
|
11
|
+
instance
|
12
|
+
end
|
13
|
+
|
14
|
+
def run!
|
15
|
+
instance.run!
|
16
|
+
end
|
17
|
+
|
18
|
+
module_function :configure, :run!
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
module Motion
|
2
|
+
module Launchpad
|
3
|
+
class Event
|
4
|
+
attr_reader :count, :callback
|
5
|
+
|
6
|
+
def initialize(count, callback)
|
7
|
+
@count, @callback = count, callback
|
8
|
+
end
|
9
|
+
|
10
|
+
def call
|
11
|
+
callback.call
|
12
|
+
end
|
13
|
+
|
14
|
+
def applicable?(launch)
|
15
|
+
every? || launch == count
|
16
|
+
end
|
17
|
+
|
18
|
+
def every?
|
19
|
+
count == :every
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,44 @@
|
|
1
|
+
module Motion
|
2
|
+
module Launchpad
|
3
|
+
class Schedule
|
4
|
+
attr_accessor :preferences_key
|
5
|
+
|
6
|
+
def initialize(options={}, &block)
|
7
|
+
self.preferences_key = options.fetch(:preferences_key, :launch_count)
|
8
|
+
@events = []
|
9
|
+
|
10
|
+
handle_launch
|
11
|
+
end
|
12
|
+
|
13
|
+
def configure
|
14
|
+
yield(self) if block_given?
|
15
|
+
end
|
16
|
+
|
17
|
+
def on(count, &block)
|
18
|
+
@events << Event.new(count, block)
|
19
|
+
end
|
20
|
+
|
21
|
+
def run!
|
22
|
+
events.each { |e| e.call }
|
23
|
+
end
|
24
|
+
|
25
|
+
def events
|
26
|
+
@events.select { |e| e.applicable?(launch_count) }
|
27
|
+
end
|
28
|
+
|
29
|
+
private
|
30
|
+
|
31
|
+
def launch_count
|
32
|
+
NSUserDefaults.standardUserDefaults[preferences_key]
|
33
|
+
end
|
34
|
+
|
35
|
+
def handle_launch
|
36
|
+
if NSUserDefaults.standardUserDefaults[preferences_key].nil?
|
37
|
+
NSUserDefaults.standardUserDefaults[preferences_key] = 1
|
38
|
+
else
|
39
|
+
NSUserDefaults.standardUserDefaults[preferences_key] = NSUserDefaults.standardUserDefaults[preferences_key] + 1
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
describe Motion::Launchpad do
|
2
|
+
|
3
|
+
it "should return an instance" do
|
4
|
+
Motion::Launchpad.configure.should.be.instance_of Motion::Launchpad::Schedule
|
5
|
+
end
|
6
|
+
|
7
|
+
it "should return the same instance twice" do
|
8
|
+
instance = Motion::Launchpad.configure
|
9
|
+
instance.should.be.equal Motion::Launchpad.configure
|
10
|
+
end
|
11
|
+
|
12
|
+
it "delegates #run! to an instance" do
|
13
|
+
@runner = nil
|
14
|
+
|
15
|
+
Motion::Launchpad.configure do |config|
|
16
|
+
config.on(:every) { @runner = true }
|
17
|
+
end
|
18
|
+
|
19
|
+
Motion::Launchpad.run!
|
20
|
+
@runner.should.be.true
|
21
|
+
end
|
22
|
+
end
|
data/spec/event_spec.rb
ADDED
@@ -0,0 +1,39 @@
|
|
1
|
+
describe Motion::Launchpad::Event do
|
2
|
+
|
3
|
+
def event(count, callback=nil)
|
4
|
+
Motion::Launchpad::Event.new count, callback
|
5
|
+
end
|
6
|
+
|
7
|
+
describe '#every?' do
|
8
|
+
it "returns false if not a symbol matching :every" do
|
9
|
+
event(1).should.not.be.every
|
10
|
+
end
|
11
|
+
|
12
|
+
it "returns true if given :every" do
|
13
|
+
event(:every).should.be.every
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
describe '#applicable?' do
|
18
|
+
it "returns always returns true if #every? is true" do
|
19
|
+
event(:every).should.be.applicable(1)
|
20
|
+
event(:every).should.be.applicable(5)
|
21
|
+
end
|
22
|
+
|
23
|
+
it "returns false if count does not match" do
|
24
|
+
event(1).should.not.be.applicable(5)
|
25
|
+
end
|
26
|
+
|
27
|
+
it "returns true if count matches" do
|
28
|
+
event(1).should.be.applicable(1)
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
describe '#call' do
|
33
|
+
it "executes the given block" do
|
34
|
+
e = event :every, ->{ true }
|
35
|
+
e.call.should.be.true
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
end
|
@@ -0,0 +1,65 @@
|
|
1
|
+
describe Motion::Launchpad::Schedule do
|
2
|
+
|
3
|
+
before do
|
4
|
+
NSUserDefaults.standardUserDefaults[:launch_count] = nil
|
5
|
+
end
|
6
|
+
|
7
|
+
describe '#configure' do
|
8
|
+
it "runs the block" do
|
9
|
+
instance = Motion::Launchpad::Schedule.new
|
10
|
+
instance.configure { true }.should.be.true
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
it "defaults the preferences key to :launch_count" do
|
15
|
+
instance = Motion::Launchpad::Schedule.new
|
16
|
+
instance.preferences_key.should.be.equal :launch_count
|
17
|
+
end
|
18
|
+
|
19
|
+
it "allows you to customize the preferences key" do
|
20
|
+
instance = Motion::Launchpad::Schedule.new preferences_key: :my_counter
|
21
|
+
instance.preferences_key.should.be.equal :my_counter
|
22
|
+
end
|
23
|
+
|
24
|
+
it "initializes NSUserDefaults store on #new" do
|
25
|
+
instance = Motion::Launchpad::Schedule.new
|
26
|
+
NSUserDefaults.standardUserDefaults[:launch_count].should.be.equal 1
|
27
|
+
end
|
28
|
+
|
29
|
+
it "adds a new event when call #on inside the configure block" do
|
30
|
+
instance = Motion::Launchpad::Schedule.new
|
31
|
+
instance.configure do |config|
|
32
|
+
config.on(:every) { true }
|
33
|
+
end
|
34
|
+
|
35
|
+
instance.events.should.not.be.empty
|
36
|
+
e = instance.events.first
|
37
|
+
e.count.should.be.equal :every
|
38
|
+
end
|
39
|
+
|
40
|
+
it "calling #configure multiple times continues to add events" do
|
41
|
+
instance = Motion::Launchpad::Schedule.new
|
42
|
+
instance.configure do |config|
|
43
|
+
config.on(:every) { true }
|
44
|
+
end
|
45
|
+
|
46
|
+
instance.configure do |config|
|
47
|
+
config.on(1) { true }
|
48
|
+
end
|
49
|
+
|
50
|
+
instance.events.count.should.be.equal 2
|
51
|
+
end
|
52
|
+
|
53
|
+
it "executes the events when calling #run!" do
|
54
|
+
instance = Motion::Launchpad::Schedule.new
|
55
|
+
instance.configure do |config|
|
56
|
+
config.on(:every) { NSUserDefaults.standardUserDefaults[:my_testing_key] = "test" }
|
57
|
+
end
|
58
|
+
|
59
|
+
NSUserDefaults.standardUserDefaults[:my_testing_key].should.be.nil
|
60
|
+
|
61
|
+
instance.run!
|
62
|
+
|
63
|
+
NSUserDefaults.standardUserDefaults[:my_testing_key].should.be.equal "test"
|
64
|
+
end
|
65
|
+
end
|
metadata
ADDED
@@ -0,0 +1,71 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: motion-launchpad
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Matt Brewer
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2014-03-24 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: rake
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ">="
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '0'
|
20
|
+
type: :development
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ">="
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0'
|
27
|
+
description: DSL to schedule events on app launch and keeps track of app launch for
|
28
|
+
you.
|
29
|
+
email:
|
30
|
+
- matt.brewer@me.com
|
31
|
+
executables: []
|
32
|
+
extensions: []
|
33
|
+
extra_rdoc_files: []
|
34
|
+
files:
|
35
|
+
- README.md
|
36
|
+
- lib/motion-launchpad.rb
|
37
|
+
- lib/motion/launchpad.rb
|
38
|
+
- lib/motion/launchpad/event.rb
|
39
|
+
- lib/motion/launchpad/schedule.rb
|
40
|
+
- lib/motion/launchpad/version.rb
|
41
|
+
- spec/configuration_spec.rb
|
42
|
+
- spec/event_spec.rb
|
43
|
+
- spec/schedule_spec.rb
|
44
|
+
homepage: https://github.com/macfanatic/motion-launchpad
|
45
|
+
licenses:
|
46
|
+
- MIT
|
47
|
+
metadata: {}
|
48
|
+
post_install_message:
|
49
|
+
rdoc_options: []
|
50
|
+
require_paths:
|
51
|
+
- lib
|
52
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
53
|
+
requirements:
|
54
|
+
- - ">="
|
55
|
+
- !ruby/object:Gem::Version
|
56
|
+
version: '0'
|
57
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - ">="
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
requirements: []
|
63
|
+
rubyforge_project: "[none]"
|
64
|
+
rubygems_version: 2.2.2
|
65
|
+
signing_key:
|
66
|
+
specification_version: 4
|
67
|
+
summary: Provides an easy DSL for scheduling events on app launch
|
68
|
+
test_files:
|
69
|
+
- spec/configuration_spec.rb
|
70
|
+
- spec/event_spec.rb
|
71
|
+
- spec/schedule_spec.rb
|