motion-concierge 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 +78 -0
- data/lib/motion-concierge.rb +13 -0
- data/lib/project/motion-concierge.rb +108 -0
- data/lib/project/ns_data.rb +31 -0
- data/lib/project/ns_string.rb +35 -0
- metadata +119 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: b738d849121e554e915fc5e5d6adb4e3ee4b0fb9
|
4
|
+
data.tar.gz: 0a40da8bfc156eec878d0cf5457f04f68ccabf98
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 5a67521c2cdb83d0e5c3ab5376dde515ffb2ade39114a97886b7d25bfb7e469eaeabaf0947d629afaf487e37d866537e4472069ead22d984648d6ca37559753a
|
7
|
+
data.tar.gz: 572585c2295fac564b6c60f7290ae5913e04a7b9ee9a9b565c8dbf12d0dee23c15e9c4122f20ece825bf26de3e8facf8ef28a31ce87b6b97652f97773a8b292c
|
data/README.md
ADDED
@@ -0,0 +1,78 @@
|
|
1
|
+
# motion-concierge
|
2
|
+
|
3
|
+
[](https://travis-ci.org/OTGApps/motion-concierge)
|
4
|
+
|
5
|
+
motion-concierge is your personal data concierge! Just provide a file name, and network url, and set up some basic rules regarding when to download the data and the concierge will automatically fetch your data for you from the web!
|
6
|
+
|
7
|
+
## Installation
|
8
|
+
|
9
|
+
Add this line to your application's Gemfile:
|
10
|
+
|
11
|
+
gem 'motion-concierge'
|
12
|
+
|
13
|
+
And then execute:
|
14
|
+
|
15
|
+
$ bundle
|
16
|
+
|
17
|
+
Or install it yourself as:
|
18
|
+
|
19
|
+
$ gem install motion-concierge
|
20
|
+
|
21
|
+
After installing, you'll need to install the needed pods:
|
22
|
+
|
23
|
+
$ [bundle exec] rake pod:install
|
24
|
+
|
25
|
+
## Usage
|
26
|
+
|
27
|
+
```ruby
|
28
|
+
# You configure motion-concierge when the app first launches:
|
29
|
+
def application(application, didFinishLaunchingWithOptions:launchOptions)
|
30
|
+
# Something here
|
31
|
+
|
32
|
+
# Set up motion-concierge
|
33
|
+
MotionConcierge.local_file_name = 'my_data_file.json'
|
34
|
+
MotionConcierge.remote_file_url = 'http://whatever.com/my_data_file.json'
|
35
|
+
MotionConcierge.fetch_interval = 86400 # Once a day
|
36
|
+
# You can put it in debug mode too!
|
37
|
+
MotionConcierge.debug = true
|
38
|
+
MotionConcierge.debug_fetch_interval = 30 # Every 30 seconds
|
39
|
+
|
40
|
+
|
41
|
+
# Something else here
|
42
|
+
end
|
43
|
+
|
44
|
+
# Then make sure to check for the data each time the app is launched
|
45
|
+
def applicationDidBecomeActive(application)
|
46
|
+
# Check for new data is necessary
|
47
|
+
MotionConcierge.fetch
|
48
|
+
end
|
49
|
+
|
50
|
+
```
|
51
|
+
|
52
|
+
That's it! From now on, every day (86400 seconds) when the app is launched, or comes back into the foreground, motion-concierge will check to see if it should download new data and then fire off a notification once it's recieved the data and saved it to disk so that you can listen for the event and refresh your interface as necessary.
|
53
|
+
|
54
|
+
Here's how you'd listen for the event:
|
55
|
+
|
56
|
+
```ruby
|
57
|
+
def listen_for_new_data
|
58
|
+
NSNotificationCenter.defaultCenter.addObserver(self, selector:"reload_data", name:"MotionConciergeNewDataReceived", object:nil)
|
59
|
+
end
|
60
|
+
|
61
|
+
def reload_data(notification)
|
62
|
+
puts "Got new data!"
|
63
|
+
end
|
64
|
+
```
|
65
|
+
|
66
|
+
You can use the local file easily!
|
67
|
+
```ruby
|
68
|
+
puts 'The file is located here: ' + MotionConcierge.local_file_path
|
69
|
+
puts 'The file contents are: ' + MotionConcierge.local_file_string
|
70
|
+
```
|
71
|
+
|
72
|
+
## Contributing
|
73
|
+
|
74
|
+
1. Fork it
|
75
|
+
2. Create your feature branch (`git checkout -b my-new-feature`)
|
76
|
+
3. Commit your changes (`git commit -am 'Add some feature'`)
|
77
|
+
4. Push to the branch (`git push origin my-new-feature`)
|
78
|
+
5. Create new Pull Request
|
@@ -0,0 +1,13 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
unless defined?(Motion::Project::Config)
|
4
|
+
raise "This file must be required within a RubyMotion project Rakefile."
|
5
|
+
end
|
6
|
+
|
7
|
+
require 'motion-cocoapods'
|
8
|
+
require 'afmotion'
|
9
|
+
|
10
|
+
lib_dir_path = File.dirname(File.expand_path(__FILE__))
|
11
|
+
Motion::Project::App.setup do |app|
|
12
|
+
app.files.unshift(Dir.glob(File.join(lib_dir_path, "project/**/*.rb")))
|
13
|
+
end
|
@@ -0,0 +1,108 @@
|
|
1
|
+
class MotionConcierge
|
2
|
+
class << self
|
3
|
+
|
4
|
+
def local_file_name=(file_name)
|
5
|
+
@_local_file_name = file_name
|
6
|
+
end
|
7
|
+
|
8
|
+
def local_file_name
|
9
|
+
@_local_file_name || @_remote_file_url.split("/").last
|
10
|
+
end
|
11
|
+
|
12
|
+
def remote_file_url=(url)
|
13
|
+
@_remote_file_url = url
|
14
|
+
end
|
15
|
+
|
16
|
+
def remote_file_url
|
17
|
+
@_remote_file_url
|
18
|
+
end
|
19
|
+
|
20
|
+
def fetch_interval=(interval)
|
21
|
+
@_fetch_interval = interval
|
22
|
+
end
|
23
|
+
|
24
|
+
def fetch_interval
|
25
|
+
@_fetch_interval || 86400
|
26
|
+
end
|
27
|
+
|
28
|
+
def debug_fetch_interval=(interval)
|
29
|
+
@_debug_fetch_interval = interval
|
30
|
+
end
|
31
|
+
|
32
|
+
def debug_fetch_interval
|
33
|
+
@_debug_fetch_interval || 30
|
34
|
+
end
|
35
|
+
|
36
|
+
def local_file_path
|
37
|
+
local_file_name.document_path
|
38
|
+
end
|
39
|
+
|
40
|
+
def local_file_string
|
41
|
+
NSString.stringWithContentsOfFile(local_file_path)
|
42
|
+
end
|
43
|
+
|
44
|
+
def downloaded_file_exists?
|
45
|
+
local_file_path.file_exists?
|
46
|
+
end
|
47
|
+
|
48
|
+
def check_interval
|
49
|
+
debug? ? debug_fetch_interval : fetch_interval
|
50
|
+
end
|
51
|
+
|
52
|
+
def time_offset
|
53
|
+
Time.now.to_i - check_interval
|
54
|
+
end
|
55
|
+
|
56
|
+
def should_fetch?
|
57
|
+
last_fetch < time_offset
|
58
|
+
end
|
59
|
+
|
60
|
+
def fetch
|
61
|
+
if debug?
|
62
|
+
puts "Fetching data from: #{@_remote_file_url}"
|
63
|
+
puts " Saving it to: #{local_file_name}"
|
64
|
+
puts " Every #{check_interval} seconds"
|
65
|
+
end
|
66
|
+
|
67
|
+
if should_fetch?
|
68
|
+
puts "Data is #{time_offset} seconds old.\nDownloading new data file." if debug?
|
69
|
+
AFMotion::HTTP.get(@_remote_file_url) do |result|
|
70
|
+
if result.success?
|
71
|
+
puts 'Got successful result from server.' if debug?
|
72
|
+
result.object.write_to(local_file_path)
|
73
|
+
last_fetch = Time.now.to_i
|
74
|
+
NSNotificationCenter.defaultCenter.postNotificationName("MotionConciergeNewDataReceived", object:self)
|
75
|
+
else
|
76
|
+
if debug?
|
77
|
+
puts "There was an error downloading the data from the server:"
|
78
|
+
puts result.error.localizedDescription
|
79
|
+
end
|
80
|
+
end
|
81
|
+
end
|
82
|
+
else
|
83
|
+
puts "Data is not stale. Not fetching." if debug?
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
87
|
+
def last_fetch=(last)
|
88
|
+
NSUserDefaults.standardUserDefaults.tap do |defaults|
|
89
|
+
defaults.setInteger(last, forKey:"motion_concierge_last_data_check")
|
90
|
+
defaults.synchronize
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
94
|
+
def last_fetch
|
95
|
+
NSUserDefaults.standardUserDefaults.integerForKey("motion_concierge_last_data_check") || 0
|
96
|
+
end
|
97
|
+
|
98
|
+
# Debugging
|
99
|
+
|
100
|
+
def debug=(debug)
|
101
|
+
@_debug = !!debug
|
102
|
+
end
|
103
|
+
|
104
|
+
def debug?
|
105
|
+
@_debug || false
|
106
|
+
end
|
107
|
+
end
|
108
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
# Shamelessly extracted from sugarcube
|
2
|
+
# https://github.com/rubymotion/sugarcube/blob/master/lib/cocoa/sugarcube-files/nsdata.rb
|
3
|
+
class NSData
|
4
|
+
|
5
|
+
class << self
|
6
|
+
|
7
|
+
def read_from(path_or_url)
|
8
|
+
case path_or_url
|
9
|
+
when NSURL
|
10
|
+
self.dataWithContentsOfURL(path_or_url)
|
11
|
+
when NSString
|
12
|
+
self.dataWithContentsOfFile(path_or_url)
|
13
|
+
else
|
14
|
+
false
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
end
|
19
|
+
|
20
|
+
def write_to(path_or_url, atomically=true)
|
21
|
+
case path_or_url
|
22
|
+
when NSURL
|
23
|
+
self.writeToURL(path_or_url, atomically: atomically)
|
24
|
+
when NSString
|
25
|
+
self.writeToFile(path_or_url, atomically: atomically)
|
26
|
+
else
|
27
|
+
false
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
# Shamelessly extracted from sugarcube
|
2
|
+
# https://github.com/rubymotion/sugarcube/blob/master/lib/cocoa/sugarcube-files/nsstring.rb
|
3
|
+
class NSString
|
4
|
+
|
5
|
+
def document_path
|
6
|
+
@@motionconcierge_docs ||= NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, true)[0]
|
7
|
+
return self if self.hasPrefix(@@motionconcierge_docs)
|
8
|
+
|
9
|
+
@@motionconcierge_docs.stringByAppendingPathComponent(self)
|
10
|
+
end
|
11
|
+
|
12
|
+
def resource_path
|
13
|
+
@@motionconcierge_resources ||= NSBundle.mainBundle.resourcePath
|
14
|
+
return self if self.hasPrefix(@@motionconcierge_resources)
|
15
|
+
|
16
|
+
@@motionconcierge_resources.stringByAppendingPathComponent(self)
|
17
|
+
end
|
18
|
+
|
19
|
+
def file_exists?
|
20
|
+
path = self.hasPrefix('/') ? self : self.document_path
|
21
|
+
NSFileManager.defaultManager.fileExistsAtPath(path)
|
22
|
+
end
|
23
|
+
|
24
|
+
def remove_file!
|
25
|
+
ptr = Pointer.new(:id)
|
26
|
+
path = self.hasPrefix('/') ? self : self.document_path
|
27
|
+
NSFileManager.defaultManager.removeItemAtPath(path, error:ptr)
|
28
|
+
ptr[0]
|
29
|
+
end
|
30
|
+
|
31
|
+
def resource_exists?
|
32
|
+
self.resource_path.file_exists?
|
33
|
+
end
|
34
|
+
|
35
|
+
end
|
metadata
ADDED
@@ -0,0 +1,119 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: motion-concierge
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Mark Rickert
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2015-03-16 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: motion-cocoapods
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '1.7'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '1.7'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: afmotion
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '2.5'
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '2.5'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: rake
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - "~>"
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '10.0'
|
48
|
+
- - ">"
|
49
|
+
- !ruby/object:Gem::Version
|
50
|
+
version: '10.0'
|
51
|
+
type: :development
|
52
|
+
prerelease: false
|
53
|
+
version_requirements: !ruby/object:Gem::Requirement
|
54
|
+
requirements:
|
55
|
+
- - "~>"
|
56
|
+
- !ruby/object:Gem::Version
|
57
|
+
version: '10.0'
|
58
|
+
- - ">"
|
59
|
+
- !ruby/object:Gem::Version
|
60
|
+
version: '10.0'
|
61
|
+
- !ruby/object:Gem::Dependency
|
62
|
+
name: motion_print
|
63
|
+
requirement: !ruby/object:Gem::Requirement
|
64
|
+
requirements:
|
65
|
+
- - "~>"
|
66
|
+
- !ruby/object:Gem::Version
|
67
|
+
version: '0'
|
68
|
+
- - ">"
|
69
|
+
- !ruby/object:Gem::Version
|
70
|
+
version: '0'
|
71
|
+
type: :development
|
72
|
+
prerelease: false
|
73
|
+
version_requirements: !ruby/object:Gem::Requirement
|
74
|
+
requirements:
|
75
|
+
- - "~>"
|
76
|
+
- !ruby/object:Gem::Version
|
77
|
+
version: '0'
|
78
|
+
- - ">"
|
79
|
+
- !ruby/object:Gem::Version
|
80
|
+
version: '0'
|
81
|
+
description: motion-concierge is your personal data concierge!. Just provide a file
|
82
|
+
name, and network url, and set up some basic rules regarding when to download the
|
83
|
+
data and the concierge will automatically fetch your data for you from the web!
|
84
|
+
email:
|
85
|
+
- mjar81@gmail.com
|
86
|
+
executables: []
|
87
|
+
extensions: []
|
88
|
+
extra_rdoc_files: []
|
89
|
+
files:
|
90
|
+
- README.md
|
91
|
+
- lib/motion-concierge.rb
|
92
|
+
- lib/project/motion-concierge.rb
|
93
|
+
- lib/project/ns_data.rb
|
94
|
+
- lib/project/ns_string.rb
|
95
|
+
homepage: https://github.com/OTGApps/motion-concierge
|
96
|
+
licenses:
|
97
|
+
- MIT
|
98
|
+
metadata: {}
|
99
|
+
post_install_message:
|
100
|
+
rdoc_options: []
|
101
|
+
require_paths:
|
102
|
+
- lib
|
103
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
104
|
+
requirements:
|
105
|
+
- - ">="
|
106
|
+
- !ruby/object:Gem::Version
|
107
|
+
version: '0'
|
108
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
109
|
+
requirements:
|
110
|
+
- - ">="
|
111
|
+
- !ruby/object:Gem::Version
|
112
|
+
version: '0'
|
113
|
+
requirements: []
|
114
|
+
rubyforge_project:
|
115
|
+
rubygems_version: 2.2.0
|
116
|
+
signing_key:
|
117
|
+
specification_version: 4
|
118
|
+
summary: motion-concierge is your personal data concierge!
|
119
|
+
test_files: []
|