motion-settings 0.0.2 → 1.0.0

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 ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 26cc2c5fbdbca6bfd6df4c77cd26260329d75f95
4
+ data.tar.gz: d5d8aba7003e01eef38b9c65afe66b9a88cf5edd
5
+ SHA512:
6
+ metadata.gz: c3c62be2446ebff5b8981abfc1f538b738716c991647d7f2527b78d1b7d76a6d956cf001b2c48f32a68865a32e659c12edfc57f0b5aeac0994218a5bdb198985
7
+ data.tar.gz: f8642f1bfa1b2348a57da1176852c1982b8374e11638407abb965b1d62e23deff49acab535e283a9df1100fbd45c59f21e8488f5b53865eae821b7bdd55b8789
data/README.md CHANGED
@@ -1,126 +1,52 @@
1
- RubyMotion-UserSettings
2
- ===================
1
+ # motion-settings
2
+ [![Gem Version](https://badge.fury.io/rb/motion-settings.svg)](http://badge.fury.io/rb/motion-settings)
3
+ [![Build Status](https://travis-ci.org/andrewhavens/motion-settings.svg?branch=master)](https://travis-ci.org/andrewhavens/motion-settings)
3
4
 
4
- An extension to allow RubyMotion apps easy access to reading, writing, and persisting user settings and other objects on iOS via NSUserDefaults.
5
+ Easily store and retrieve your user's preferences and settings using `NSUserDefaults`.
5
6
 
6
- Installation
7
- ------------
7
+ Note that `NSUserDefaults` is not designed for secure data storage (passwords, tokens, etc). If you need to store data securely, use [`motion-keychain`](https://github.com/IconoclastLabs/motion-keychain).
8
8
 
9
- Put this in your Gemfile:
9
+ ## Installation
10
10
 
11
- gem 'motion-settings'
11
+ Add this line to your application's `Gemfile`:
12
12
 
13
- Done!
13
+ gem 'motion-settings', github: 'andrewhavens/motion-settings'
14
14
 
15
- Usage
16
- -----
15
+ And then execute:
17
16
 
18
- ### Initializing
17
+ $ bundle
19
18
 
20
- To begin, include `RMSettable` inside the `AppDelegate` class of `/app/app_delegate.rb` and call the `rm_settable` function with your other `didFinishLaunchingWithOptions` code.
19
+ ## Usage
21
20
 
22
- ```ruby
23
- class AppDelegate
24
- include RMSettable
25
-
26
- def application(application, didFinishLaunchingWithOptions:launchOptions)
27
- rm_settable :name, :background_color
28
-
29
- ...
30
- ```
31
-
32
- In its simplest form, the `rm_settable` function is called with a list of symbols for the settings your app will save to the NSUserDefaults.
21
+ Store data:
33
22
 
34
23
  ```ruby
35
- rm_settable :name, :background_color
24
+ Settings.set :favorite_color, 'green'
36
25
  ```
37
26
 
38
- By default, the settings are stored as objects. If you wish to cast as a specific type, you may declare that as a hash on the key.
27
+ Retrieve data:
39
28
 
40
29
  ```ruby
41
- rm_settable :name, age: {type: :integer}, completed_tutorial: {type: :boolean}
30
+ favorite_color = Settings.get :favorite_color
42
31
  ```
43
32
 
44
- The types available derive from the NSUserDefault class. They can be :array, :boolean, :data, :dictionary, :double, :float, :integer, :object, :string_array, :string, or :url.
45
-
46
- ### Options
47
-
48
- Additionally, you can include a hash of options to affect the way RMSettings works.
33
+ Remove an individual value:
49
34
 
50
35
  ```ruby
51
- rm_settable age:, name: {type: :string}, options: {autosave: false, default_type: :integer}
36
+ Settings.destroy :favorite_color
52
37
  ```
38
+ Remove ALL data:
53
39
 
54
40
  ```ruby
55
- rm_settable options: {lenient_keys: true}
56
- ```
57
-
58
- #### Available Options
59
- * `autosave` _(true)_
60
-
61
- By default, settings are synchronized to the device as soon as
62
- it is updated. However, if you are updating a lot of items at once
63
- or would prefer to manually call save on the settings object, set
64
- this to false. Be aware that iOS will still save the settings
65
- periodically without being explicitly called.
66
-
67
- Regardless of this setting, settings will also be saved when
68
- `applicationDidEnterBackground` or `applicationWillTerminate` is called
69
- on the app. To prevent this behaviour, you must override these methods
70
- in your `app_delegate.rb`.
71
-
72
- * `default_type` _(:object)_
73
-
74
- Items are saved as objects. You many also specify a particular
75
- type when you declare the setting names. With this setting you
76
- may override the default type for all settings.
77
-
78
- * `lenient_keys` _(false)_
79
-
80
- If you don't want to declare any or all of the settings you will
81
- be storing, set this to true. Any setting not explicitly declared
82
- will still be stored and retrieved as the default setting type.
83
-
84
- ### Reading and Writing User Settings
85
-
86
- A method named `settings` is added to the application's delegate and supplies a simple interface to the user settings.
87
-
88
- ```ruby
89
- # write a setting
90
- UIApplication.sharedApplication.delegate.settings.name = 'Karl Pilkington'
91
- UIApplication.sharedApplication.delegate.settings[:head_shape] = 'Orange'
92
-
93
- # read a setting
94
- @name = UIApplication.sharedApplication.delegate.settings.name
95
- @head_shape = UIApplication.sharedApplication.delegate.settings[:head_shape]
96
-
97
- # check a setting's boolean value or blankness
98
- UIApplication.sharedApplication.delegate.settings.name?
99
-
100
- # reset a setting to its default (also aliased as 'reset' or 'remove')
101
- UIApplication.sharedApplication.delegate.settings.delete :name
41
+ Settings.clear
102
42
  ```
103
43
 
104
- Extras
105
- ------
106
-
107
- Convenience subclasses are provided for `UIViewController` and `UIView` called `RMViewController` and `RMView`. If you derive your views and controllers form these classes you will have even easier access to the application's settings.
108
-
109
- ```ruby
110
- class MyCoolView < RMView
111
-
112
- def headClassifier
113
- if !settings.head_shape? and settings.username =~ /karl\spilkington/i
114
- settings.head_shape = 'Orange'
115
- end
116
- end
117
- ...
118
- ```
44
+ Review [the spec](https://github.com/andrewhavens/motion-settings/blob/master/spec/main_spec.rb) for more usage examples.
119
45
 
120
- To Do
121
- -----
122
- * Add tests
123
- * Add error reporting
124
- * Check that passed data types are valid
125
- * Add support for setting default value at declaration
46
+ ## Contributing
126
47
 
48
+ 1. Fork it
49
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
50
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
51
+ 4. Push to the branch (`git push origin my-new-feature`)
52
+ 5. Create new Pull Request
@@ -1,8 +1,10 @@
1
- require "motion-settings/version"
1
+ # encoding: utf-8
2
2
 
3
+ unless defined?(Motion::Project::Config)
4
+ raise "This file must be required within a RubyMotion project Rakefile."
5
+ end
6
+
7
+ lib_dir_path = File.dirname(File.expand_path(__FILE__))
3
8
  Motion::Project::App.setup do |app|
4
- app.development do
5
- app.files << File.expand_path(File.dirname(__FILE__) + '/motion-settings/rmsettable.rb')
6
- app.files << File.expand_path(File.dirname(__FILE__) + '/motion-settings/rmsettings.rb')
7
- end
8
- end
9
+ app.files.unshift(Dir.glob(File.join(lib_dir_path, "project/**/*.rb")))
10
+ end
@@ -0,0 +1,40 @@
1
+ class Settings < NSUserDefaults
2
+ attr_reader :name
3
+ attr_accessor :value
4
+
5
+ def self.get(name)
6
+ new(name).fetch.value
7
+ end
8
+
9
+ def self.set(name, value)
10
+ new(name).tap{|s| s.value = value; s.save }.value
11
+ end
12
+
13
+ def self.destroy(name)
14
+ new(name).destroy
15
+ end
16
+
17
+ def self.clear
18
+ NSUserDefaults.standardUserDefaults.setPersistentDomain(NSDictionary.dictionary, forName: NSBundle.mainBundle.bundleIdentifier)
19
+ end
20
+
21
+ def initialize(name)
22
+ @name = name.to_s
23
+ end
24
+
25
+ def save
26
+ NSUserDefaults.standardUserDefaults[name] = self.value
27
+ NSUserDefaults.standardUserDefaults.synchronize
28
+ end
29
+
30
+ def fetch
31
+ self.value = NSUserDefaults.standardUserDefaults[name]
32
+ self
33
+ end
34
+
35
+ def destroy
36
+ self.value = nil
37
+ NSUserDefaults.standardUserDefaults.removeObjectForKey name
38
+ save
39
+ end
40
+ end
metadata CHANGED
@@ -1,58 +1,64 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: motion-settings
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.2
5
- prerelease:
4
+ version: 1.0.0
6
5
  platform: ruby
7
6
  authors:
8
- - Jonathan Silverman
9
- - Aaron Hurley
7
+ - Andrew Havens
8
+ - Jamon Holmgren
10
9
  autorequire:
11
10
  bindir: bin
12
11
  cert_chain: []
13
- date: 2012-07-08 00:00:00.000000000 Z
14
- dependencies: []
15
- description: A convenience wrapper to allow RubyMotion apps easy access to reading,
16
- writing, and persisting values via NSUserDefaults.
12
+ date: 2016-02-10 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: rake
16
+ requirement: !ruby/object:Gem::Requirement
17
+ requirements:
18
+ - - ">="
19
+ - !ruby/object:Gem::Version
20
+ version: '0'
21
+ type: :development
22
+ prerelease: false
23
+ version_requirements: !ruby/object:Gem::Requirement
24
+ requirements:
25
+ - - ">="
26
+ - !ruby/object:Gem::Version
27
+ version: '0'
28
+ description: A RubyMotion gem to help you easily store and retrieve your user's preferences
29
+ and settings using NSUserDefaults.
17
30
  email:
18
- - jsilver@mdx.la
19
- - aaron@showtimefu.com
31
+ - email@andrewhavens.com
20
32
  executables: []
21
33
  extensions: []
22
34
  extra_rdoc_files: []
23
35
  files:
24
- - .gitignore
25
- - Gemfile
26
- - LICENSE
27
36
  - README.md
28
- - Rakefile
29
37
  - lib/motion-settings.rb
30
- - lib/motion-settings/rmsettable.rb
31
- - lib/motion-settings/rmsettings.rb
32
- - lib/motion-settings/version.rb
33
- - motion-settings.gemspec
34
- homepage: https://github.com/jsilverMDX/RubyMotion-UserSettings
35
- licenses: []
38
+ - lib/project/settings.rb
39
+ homepage: https://github.com/andrewhavens/motion-settings
40
+ licenses:
41
+ - MIT
42
+ metadata: {}
36
43
  post_install_message:
37
44
  rdoc_options: []
38
45
  require_paths:
39
46
  - lib
40
47
  required_ruby_version: !ruby/object:Gem::Requirement
41
- none: false
42
48
  requirements:
43
- - - ! '>='
49
+ - - ">="
44
50
  - !ruby/object:Gem::Version
45
51
  version: '0'
46
52
  required_rubygems_version: !ruby/object:Gem::Requirement
47
- none: false
48
53
  requirements:
49
- - - ! '>='
54
+ - - ">="
50
55
  - !ruby/object:Gem::Version
51
56
  version: '0'
52
57
  requirements: []
53
58
  rubyforge_project:
54
- rubygems_version: 1.8.24
59
+ rubygems_version: 2.4.5.1
55
60
  signing_key:
56
- specification_version: 3
57
- summary: RubyMotion Settings Library
61
+ specification_version: 4
62
+ summary: A RubyMotion gem to help you easily store and retrieve your user's preferences
63
+ and settings using NSUserDefaults.
58
64
  test_files: []
data/.gitignore DELETED
@@ -1,18 +0,0 @@
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
- .DS_STORE
data/Gemfile DELETED
@@ -1,3 +0,0 @@
1
- source 'https://rubygems.org'
2
-
3
- # Specify your gem's dependencies in motion-settings.gemspec
data/LICENSE DELETED
@@ -1,22 +0,0 @@
1
- Copyright (c) 2012 Jonathan Silverman, Aaron Hurley
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.
data/Rakefile DELETED
@@ -1,2 +0,0 @@
1
- #!/usr/bin/env rake
2
- require "bundler/gem_tasks"
@@ -1,97 +0,0 @@
1
- # rmsettable.rb
2
- # https://github.com/AaronH/RubyMotion-UserSettings
3
-
4
- module RMSettable
5
-
6
- def rm_settable(*args)
7
- # Call this in your app_delegate.rb as part of the didFinishLaunchingWithOptions setup.
8
- #
9
- # The arguments can consist of symbols for various settings you wish to store.
10
- #
11
- # rm_settable :name, :background_color
12
- #
13
- #
14
- # By default, the keys store and retrieve generic objects. If you wish to specify a
15
- # particular type, you may declare that as a hash on the key.
16
- #
17
- # rm_settable :name, age: {type: :integer}, superstar: {type: :boolean}
18
- #
19
- # AVAILABLE TYPES :array, :boolean, :data, :dictionary, :double, :float,
20
- # :integer, :object, :string_array, :string, :url
21
- #
22
- #
23
- # You can also include a hash of options.
24
- #
25
- # rm_settable name: {type: :string}, age: options: {autosave: false, default_type: :integer}
26
- #
27
- # rm_settable options: {:lenient_keys}
28
- #
29
- # AVAILBLE OPTIONS
30
- # :autosave true (default)
31
- # By default, settings are synchronized to the device as soon as
32
- # it is updated. However, if you are updating a lot of items at once
33
- # or would prefer to manually call save on the settings object, set
34
- # this to false. Be aware that iOS will still save the settings
35
- # periodically without being explicitly called.
36
- #
37
- # :default_type :object (default)
38
- # Items are saved as objects. You many specify the type
39
- # when you declare the setting names or override the default
40
- # expected for all item.
41
- #
42
- # :lenient_keys false (default)
43
- # If you don't want to declare any or all of the settings you will
44
- # be storing, set this to true. Any setting not explicitly declared
45
- # will be stored and retrieved as the default setting type.
46
- #
47
- @rm_settings = RMSettings.new args
48
- end
49
-
50
-
51
- def applicationDidEnterBackground(application)
52
- # make sure we save any unsaved settings when going to the background
53
- # if you override this method in the app_delegate
54
- # be sure to call super to save any unsaved settings
55
- rm_settings.save
56
- end
57
-
58
- def applicationWillTerminate(application)
59
- # make sure we save any unsaved settings when being terminated
60
- # if you override this method in the app_delegate
61
- # be sure to call super to save any unsaved settings
62
- rm_settings.save
63
- end
64
-
65
- def settings
66
- # provide access to the RMSettings object to the app_delegate
67
- rm_settings
68
- end
69
-
70
- def self.included(base)
71
- base.class_eval do
72
- attr_accessor :rm_settings
73
- end
74
- end
75
- end
76
-
77
- # These subclasses provide easy access to the app_delegate and settings object.
78
- # If you wish to call settings directly from your controller or view, be sure
79
- # to inherit from these classes
80
- class RMView < UIView
81
- def settings
82
- application.settings
83
- end
84
-
85
- def application
86
- UIApplication.sharedApplication.delegate
87
- end
88
- end
89
-
90
- class RMViewController < UIViewController
91
- def settings
92
- application.settings
93
- end
94
- def application
95
- UIApplication.sharedApplication.delegate
96
- end
97
- end
@@ -1,182 +0,0 @@
1
- # rmsettings.rb
2
- # https://github.com/AaronH/RubyMotion-UserSettings
3
-
4
- class RMSettings
5
- attr_accessor :settings, :available, :keys, :options
6
-
7
- def initialize(*args)
8
- # Initializes the available settings and options
9
- # See rmsettable.rb for details on the various options
10
- args = args.flatten.compact.uniq
11
- @available = {}
12
- @settings ||= NSUserDefaults.standardUserDefaults
13
-
14
- user_options = (args.select{|a| a.is_a? Hash}.first || {}).delete(:options) || {}
15
- @options = { autosave: true,
16
- lenient_keys: false,
17
- default_type: :object}.merge(user_options)
18
-
19
- args.flatten.each do |item|
20
- if item.is_a?(Symbol)
21
- @available[item] = {type: @options[:default_type]}
22
- elsif item.is_a?(Hash)
23
- item.each do |key, value|
24
- @available[key] = value
25
- end
26
- end
27
- end
28
- @keys = @available.keys
29
- end
30
-
31
- def save
32
- # Save all current settings to the device.
33
- # Can be called manually but is generally called automatically
34
- # after updating a key unless the :autosave option is false.
35
- settings.synchronize
36
- end
37
-
38
- def autosave
39
- # Automatically saves the data unless autosave is false.
40
- save if autosave?
41
- end
42
-
43
- def autosave?
44
- # Check to see if the autosave option is selected
45
- options[:autosave]
46
- end
47
-
48
- def default_type_for(key)
49
- # Determine the appropriate type for reading and writing item
50
- ((@available[key] || {})[:type] || @options[:default_type])
51
- end
52
-
53
- def setting_for?(key)
54
- # Call to check boolean status of a particular key.
55
- # Generally called dynamically from the method_missing function.
56
- #
57
- # settings.setting_for? :tutorial_completed
58
- #
59
- # settings.tutorial_completed?
60
- #
61
- value = setting_for(key)
62
- case default_type_for(key)
63
- when :string, :array
64
- value.empty?
65
- else
66
- !!value
67
- end
68
- end
69
-
70
- def save_setting(key, value)
71
- # Save the contents of value to the key.
72
- # Returns the value of the key after setting.
73
- #
74
- # Generally called dynamically from the method_missing function.
75
- #
76
- # settings.save_setting :name, 'Karl Pilkington'
77
- #
78
- # settings.head_shape = 'Orange'
79
- #
80
- case default_type_for(key)
81
- when :boolean
82
- settings.setBool value, forKey: key
83
- when :double
84
- settings.setDouble value, forKey: key
85
- when :float
86
- settings.setFloat value, forKey: key
87
- when :integer
88
- settings.setInteger value, forKey: key
89
- when :object
90
- settings.setObject value, forKey: key
91
- when :url
92
- settings.setURL value, forKey: key
93
- else
94
- settings.setObject value, forKey: key
95
- end
96
-
97
- autosave
98
-
99
- # return the current value
100
- setting_for key
101
- end
102
- alias :[]= :save_setting
103
-
104
- def setting_for(key)
105
- # Read the contents of a given key.
106
- #
107
- # Generally called dynamically from the method_missing function.
108
- #
109
- # settings.setting_for :nickname
110
- #
111
- # settings.nickname
112
- #
113
- case default_type_for(key)
114
- when :array
115
- settings.arrayForKey key
116
- when :boolean
117
- settings.boolForKey key
118
- when :data
119
- settings.dataForKey key
120
- when :dictionary
121
- settings.dictionaryForKey key
122
- when :double
123
- settings.doubleForKey key
124
- when :float
125
- settings.floatForKey key
126
- when :integer
127
- settings.integerForKey key
128
- when :object
129
- settings.objectForKey key
130
- when :string_array
131
- settings.stringArrayForKey key
132
- when :string
133
- settings.stringForKey key
134
- when :url
135
- settings.URLForKey key
136
- end
137
- end
138
- alias :[] :setting_for
139
-
140
- def remove(key)
141
- # Resets the key to it's default value and returns that value
142
- # Aliased as delete and reset
143
- settings.removeObjectForKey key
144
- autosave
145
- setting_for key
146
- end
147
- alias :delete :remove
148
- alias :reset :remove
149
-
150
- def valid_key?(key)
151
- # Checks to see if the method_missing key has been declared
152
- # unless that functionality has been turned off in the settings
153
- @options[:lenient_keys] or keys.include?(key)
154
- end
155
-
156
- def method_missing(method, *args)
157
- # Split the method to componenet parts to do our magic.
158
- if m = method.to_s.match(/^([^\?\=]+)([\?\=])?$/)
159
- base_key = m[1].to_sym
160
- method_modifier = m[2]
161
- # Check if we want to do something here.
162
- if valid_key?(base_key)
163
- return case method_modifier
164
- when nil
165
- # Call the reader
166
- setting_for(base_key)
167
- when '='
168
- # Call the writer
169
- save_setting(base_key, [*args].flatten.first)
170
- when '?'
171
- # Call the boolean check
172
- setting_for?(base_key)
173
- else
174
- # Nothing to do, so let's fail
175
- super
176
- end
177
- end
178
- end
179
- super
180
- end
181
-
182
- end
@@ -1,5 +0,0 @@
1
- module Motion
2
- module Settings
3
- VERSION = "0.0.2"
4
- end
5
- end
@@ -1,17 +0,0 @@
1
- # -*- encoding: utf-8 -*-
2
- require File.expand_path('../lib/motion-settings/version', __FILE__)
3
-
4
- Gem::Specification.new do |gem|
5
- gem.authors = ["Jonathan Silverman", "Aaron Hurley"]
6
- gem.email = ["jsilver@mdx.la", "aaron@showtimefu.com"]
7
- gem.description = %q{A convenience wrapper to allow RubyMotion apps easy access to reading, writing, and persisting values via NSUserDefaults.}
8
- gem.summary = %q{RubyMotion Settings Library}
9
- gem.homepage = "https://github.com/jsilverMDX/RubyMotion-UserSettings"
10
-
11
- gem.files = `git ls-files`.split($\)
12
- gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
13
- gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
14
- gem.name = "motion-settings"
15
- gem.require_paths = ["lib"]
16
- gem.version = Motion::Settings::VERSION
17
- end