clean_settings 0.1.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 +7 -0
- data/.gitignore +12 -0
- data/.rspec +2 -0
- data/.travis.yml +4 -0
- data/Gemfile +14 -0
- data/README.md +131 -0
- data/Rakefile +1 -0
- data/bin/console +14 -0
- data/bin/setup +7 -0
- data/clean_settings.gemspec +27 -0
- data/lib/clean_settings/has_settings.rb +18 -0
- data/lib/clean_settings/ownerable.rb +12 -0
- data/lib/clean_settings/setting.rb +110 -0
- data/lib/clean_settings/version.rb +3 -0
- data/lib/clean_settings.rb +9 -0
- data/lib/generators/clean_settings/install_generator.rb +14 -0
- data/lib/generators/clean_settings/templates/migration.rb +18 -0
- metadata +131 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: f2df11a01e16f179b2581f8e147f803030fb87f6
|
4
|
+
data.tar.gz: cf07a4ff3d5a28486fb7a93abffe4758e1c1333f
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 348579bc2a5f4ec60ffef36c7d605ca4e55e0d967ef60eafce792115f67dc2c03030f6b8416e83b4379325faa5ff3803a843bee6273a1d68b1bab010a99935d4
|
7
|
+
data.tar.gz: b9ce4977ee7dc642c695ef4e77eb703359c52e8212979d44a622944c0c00ca4de1a244bbc46884ca551d5e9a95e1de7b5d2b8146d97498e09645e6268b58ea85
|
data/.gitignore
ADDED
data/.rspec
ADDED
data/.travis.yml
ADDED
data/Gemfile
ADDED
data/README.md
ADDED
@@ -0,0 +1,131 @@
|
|
1
|
+
# CleanSettings
|
2
|
+
|
3
|
+
CleanSettings - it's simple and clean settings for your Rails project.
|
4
|
+
|
5
|
+
|
6
|
+
## Installation
|
7
|
+
|
8
|
+
Add this line to your application's Gemfile:
|
9
|
+
|
10
|
+
```ruby
|
11
|
+
gem 'clean_settings'
|
12
|
+
```
|
13
|
+
|
14
|
+
And then execute:
|
15
|
+
|
16
|
+
```bash
|
17
|
+
$ bundle
|
18
|
+
```
|
19
|
+
|
20
|
+
Or install it yourself as:
|
21
|
+
|
22
|
+
```bash
|
23
|
+
$ gem install clean_settings
|
24
|
+
```
|
25
|
+
|
26
|
+
Run a generator:
|
27
|
+
|
28
|
+
```bash
|
29
|
+
rails g clean_settings:install
|
30
|
+
```
|
31
|
+
|
32
|
+
## Usage
|
33
|
+
|
34
|
+
After installattion you will have a CleanSettings::Setting active_record model. If you want to extend this model you can use inheritance:
|
35
|
+
|
36
|
+
```ruby
|
37
|
+
class CleanSettings < CleanSettings::Setting
|
38
|
+
```
|
39
|
+
|
40
|
+
#### Default settings
|
41
|
+
|
42
|
+
If you need default settings for your Rails project you can add ruby file to config/initializers folder. Personally I prefer to name it as **default_settings.rb**. And fill this file with settings that you need:
|
43
|
+
```ruby
|
44
|
+
CleanSettings.defaults.project_name = "name"
|
45
|
+
CleanSettings.defaults.project_key = 123456789
|
46
|
+
CleanSettings.defaults.configs = { time: "UTC", currency_code: 980 }
|
47
|
+
```
|
48
|
+
After restart your project you will be able to get you defaults settings:
|
49
|
+
```ruby
|
50
|
+
CleanSettings.defaults.project_name # => "name"
|
51
|
+
CleanSettings.project_name # => "name"
|
52
|
+
```
|
53
|
+
Get all defaults settings in hash with indifferent access :
|
54
|
+
|
55
|
+
```ruby
|
56
|
+
CleanSettings.all_defaults
|
57
|
+
```
|
58
|
+
|
59
|
+
Clearing default settings.
|
60
|
+
|
61
|
+
```ruby
|
62
|
+
CleanSettings.clear_defaults
|
63
|
+
```
|
64
|
+
|
65
|
+
Default settings are not saved to DB. Because they are 'defaults'. That's why when you clear default settings it will clear them only for current session. When your app is restarted, your default settings will be returned according your **default_settings.rb** file.
|
66
|
+
|
67
|
+
#### Global settings
|
68
|
+
|
69
|
+
For adding and getting settings that will be available anywhere in your project you can write like this:
|
70
|
+
```ruby
|
71
|
+
# set
|
72
|
+
CleanSettings.project_name = "name"
|
73
|
+
|
74
|
+
# get
|
75
|
+
CleanSettings.project_name # => "name"
|
76
|
+
```
|
77
|
+
If you prefer an array notation:
|
78
|
+
```ruby
|
79
|
+
# set
|
80
|
+
CleanSettings[:project_name] = "name"
|
81
|
+
|
82
|
+
# get
|
83
|
+
CleanSettings[:project_name] # => "name"
|
84
|
+
```
|
85
|
+
When you adding a setting with the name that was used for default setting you override default setting:
|
86
|
+
|
87
|
+
```ruby
|
88
|
+
CleanSettings.defaults[:name] = "default name"
|
89
|
+
CleanSettings.name # => "default name"
|
90
|
+
|
91
|
+
CleanSettings.name = "another name"
|
92
|
+
CleanSettings.name # => "another name"
|
93
|
+
```
|
94
|
+
|
95
|
+
Get all global settings in hash with indifferent access
|
96
|
+
|
97
|
+
```ruby
|
98
|
+
CleanSettings.all_globals
|
99
|
+
```
|
100
|
+
|
101
|
+
##### Get all settings
|
102
|
+
All settings (default and global) you can get through any of these methods:
|
103
|
+
|
104
|
+
```ruby
|
105
|
+
CleanSettings.all_settings
|
106
|
+
# or
|
107
|
+
CleanSettings.fetch
|
108
|
+
```
|
109
|
+
Global settings will be merged with default settings.
|
110
|
+
|
111
|
+
#### Ownerable settings
|
112
|
+
|
113
|
+
Often you need specific settings for an object. With **CleanSettings** simple add a :has_settings method to you model:
|
114
|
+
|
115
|
+
```ruby
|
116
|
+
class User < ActiveRecord::Base
|
117
|
+
has_settings
|
118
|
+
end
|
119
|
+
```
|
120
|
+
And use it:
|
121
|
+
|
122
|
+
```ruby
|
123
|
+
@user = User.new
|
124
|
+
@user.settings.subscribe_to_notifications = true
|
125
|
+
@user.settings.subscribe_to_notifications # => true
|
126
|
+
```
|
127
|
+
|
128
|
+
## Contributing
|
129
|
+
|
130
|
+
Bug reports and pull requests are welcome on GitHub at https://github.com/ashlinchak/clean_settings.
|
131
|
+
|
data/Rakefile
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
require "bundler/gem_tasks"
|
data/bin/console
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require "bundler/setup"
|
4
|
+
require "clean_settings"
|
5
|
+
|
6
|
+
# You can add fixtures and/or initialization code here to make experimenting
|
7
|
+
# with your gem easier. You can also use a different console, if you like.
|
8
|
+
|
9
|
+
# (If you use this, don't forget to add pry to your Gemfile!)
|
10
|
+
require "pry"
|
11
|
+
Pry.start
|
12
|
+
|
13
|
+
# require "irb"
|
14
|
+
# IRB.start
|
data/bin/setup
ADDED
@@ -0,0 +1,27 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
require 'clean_settings/version'
|
5
|
+
|
6
|
+
Gem::Specification.new do |spec|
|
7
|
+
spec.name = "clean_settings"
|
8
|
+
spec.version = CleanSettings::VERSION
|
9
|
+
spec.authors = ["Alexander Shlinchak"]
|
10
|
+
spec.email = ["ashlinchak@gmail.com"]
|
11
|
+
|
12
|
+
spec.summary = %q{Simple and clean settings for your Rails project.}
|
13
|
+
spec.description = %q{Storing global and object's settings in DB. Simple for using in Rails applicatons.}
|
14
|
+
spec.homepage = "https://github.com/ashlinchak/clean_settings"
|
15
|
+
|
16
|
+
spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
|
17
|
+
spec.bindir = "exe"
|
18
|
+
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
19
|
+
spec.require_paths = ["lib"]
|
20
|
+
|
21
|
+
spec.add_dependency("rails", [">= 4.0.0"])
|
22
|
+
|
23
|
+
spec.add_development_dependency "bundler", "~> 1.10"
|
24
|
+
spec.add_development_dependency "rake", "~> 10.0"
|
25
|
+
spec.add_development_dependency "rspec", "~> 3.3.0"
|
26
|
+
spec.add_development_dependency "sqlite3", "~> 1.3.10"
|
27
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
module CleanSettings
|
2
|
+
module HasSettings
|
3
|
+
def has_settings
|
4
|
+
send :include, HasSettings::InstanceMethods
|
5
|
+
|
6
|
+
scope :with_setting, -> (var) {
|
7
|
+
joins("JOIN clean_settings ON (clean_settings.owner_id = #{self.table_name}.#{self.primary_key} AND
|
8
|
+
clean_settings.owner_type = '#{self.base_class.name}') AND clean_settings.var = '#{var}'")
|
9
|
+
}
|
10
|
+
end
|
11
|
+
|
12
|
+
module InstanceMethods
|
13
|
+
def settings
|
14
|
+
CleanSettings::Ownerable.for_thing(self)
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,110 @@
|
|
1
|
+
module CleanSettings
|
2
|
+
class Setting < ActiveRecord::Base
|
3
|
+
self.table_name = "clean_settings"
|
4
|
+
|
5
|
+
class SettingNotFound < RuntimeError; end
|
6
|
+
|
7
|
+
@@defaults = OpenStruct.new
|
8
|
+
|
9
|
+
def value
|
10
|
+
YAML::load(self[:value])
|
11
|
+
end
|
12
|
+
|
13
|
+
def value=(new_value)
|
14
|
+
self[:value] = new_value.to_yaml
|
15
|
+
end
|
16
|
+
|
17
|
+
class << self
|
18
|
+
def defaults
|
19
|
+
@@defaults ||= OpenStruct.new
|
20
|
+
end
|
21
|
+
|
22
|
+
def fetch_defaults
|
23
|
+
@@defaults.to_h.with_indifferent_access
|
24
|
+
end
|
25
|
+
alias_method :all_defaults, :fetch_defaults
|
26
|
+
|
27
|
+
def defaults=(key, value)
|
28
|
+
@@defaults[:key] = value
|
29
|
+
end
|
30
|
+
|
31
|
+
def clear_defaults
|
32
|
+
@@defaults = OpenStruct.new
|
33
|
+
end
|
34
|
+
|
35
|
+
def [](var_name)
|
36
|
+
if var = object(var_name)
|
37
|
+
var.value
|
38
|
+
elsif @@defaults[var_name.to_s]
|
39
|
+
@@defaults[var_name.to_s]
|
40
|
+
else
|
41
|
+
nil
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
def []=(var_name, value)
|
46
|
+
var_name = var_name.to_s
|
47
|
+
|
48
|
+
record = object(var_name) || with_owner.new(var: var_name)
|
49
|
+
record.value = value
|
50
|
+
record.save!
|
51
|
+
|
52
|
+
value
|
53
|
+
end
|
54
|
+
|
55
|
+
def destroy(var_name)
|
56
|
+
var_name = var_name.to_s
|
57
|
+
|
58
|
+
if obj = object(var_name)
|
59
|
+
obj.destroy
|
60
|
+
true
|
61
|
+
else
|
62
|
+
raise SettingNotFound, "Setting variable \"#{var_name}\" not found"
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
def fetch_globals
|
67
|
+
vars = with_owner.select(:var, :value)
|
68
|
+
|
69
|
+
result = {}
|
70
|
+
vars.each { |record| result[record.var] = record.value }
|
71
|
+
result.with_indifferent_access
|
72
|
+
end
|
73
|
+
alias_method :all_globals, :fetch_globals
|
74
|
+
|
75
|
+
def fetch
|
76
|
+
fetch_defaults.merge(fetch_globals)
|
77
|
+
end
|
78
|
+
alias_method :all_settings, :fetch
|
79
|
+
|
80
|
+
|
81
|
+
def for_thing(owner)
|
82
|
+
@owner = owner
|
83
|
+
self
|
84
|
+
end
|
85
|
+
|
86
|
+
def with_owner
|
87
|
+
unscoped.where("owner_type is NULL and owner_id is NULL")
|
88
|
+
end
|
89
|
+
|
90
|
+
def object(var_name)
|
91
|
+
with_owner.find_by(var: var_name)
|
92
|
+
end
|
93
|
+
|
94
|
+
def method_missing(method, *args, &block)
|
95
|
+
method_name = method.to_s
|
96
|
+
super(method, *args, &block)
|
97
|
+
|
98
|
+
rescue NoMethodError
|
99
|
+
|
100
|
+
if method_name[-1] == "="
|
101
|
+
var_name = method_name.chop
|
102
|
+
value = args[0]
|
103
|
+
self[var_name] = value
|
104
|
+
else
|
105
|
+
self[method_name]
|
106
|
+
end
|
107
|
+
end
|
108
|
+
end
|
109
|
+
end
|
110
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
require 'rails/generators/migration'
|
2
|
+
|
3
|
+
class CleanSettings::InstallGenerator < Rails::Generators::Base
|
4
|
+
include Rails::Generators::Migration
|
5
|
+
source_root File.expand_path('../templates', __FILE__)
|
6
|
+
|
7
|
+
def self.next_migration_number(path)
|
8
|
+
Time.now.utc.strftime("%Y%m%d%H%M%S")
|
9
|
+
end
|
10
|
+
|
11
|
+
def generate_files
|
12
|
+
migration_template 'migration.rb', 'db/migrate/create_clean_settings_table.rb'
|
13
|
+
end
|
14
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
class CreateConfirmedAttributesTables < ActiveRecord::Migration
|
2
|
+
def self.up
|
3
|
+
create_table :clean_settings do |t|
|
4
|
+
t.string :var, null: false
|
5
|
+
t.text :value, null: false
|
6
|
+
t.integer :owner_id, null: true
|
7
|
+
t.string :owner_type, null: true, limit: 30
|
8
|
+
|
9
|
+
t.timestamps
|
10
|
+
end
|
11
|
+
|
12
|
+
add_index :clean_settings, [:owner_type, :owner_id, :var], unique: true
|
13
|
+
end
|
14
|
+
|
15
|
+
def self.down
|
16
|
+
drop_table :clean_settings
|
17
|
+
end
|
18
|
+
end
|
metadata
ADDED
@@ -0,0 +1,131 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: clean_settings
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Alexander Shlinchak
|
8
|
+
autorequire:
|
9
|
+
bindir: exe
|
10
|
+
cert_chain: []
|
11
|
+
date: 2015-08-22 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: rails
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ">="
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: 4.0.0
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ">="
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: 4.0.0
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: bundler
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '1.10'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '1.10'
|
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
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - "~>"
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '10.0'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: rspec
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - "~>"
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: 3.3.0
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - "~>"
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: 3.3.0
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: sqlite3
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - "~>"
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: 1.3.10
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - "~>"
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: 1.3.10
|
83
|
+
description: Storing global and object's settings in DB. Simple for using in Rails
|
84
|
+
applicatons.
|
85
|
+
email:
|
86
|
+
- ashlinchak@gmail.com
|
87
|
+
executables: []
|
88
|
+
extensions: []
|
89
|
+
extra_rdoc_files: []
|
90
|
+
files:
|
91
|
+
- ".gitignore"
|
92
|
+
- ".rspec"
|
93
|
+
- ".travis.yml"
|
94
|
+
- Gemfile
|
95
|
+
- README.md
|
96
|
+
- Rakefile
|
97
|
+
- bin/console
|
98
|
+
- bin/setup
|
99
|
+
- clean_settings.gemspec
|
100
|
+
- lib/clean_settings.rb
|
101
|
+
- lib/clean_settings/has_settings.rb
|
102
|
+
- lib/clean_settings/ownerable.rb
|
103
|
+
- lib/clean_settings/setting.rb
|
104
|
+
- lib/clean_settings/version.rb
|
105
|
+
- lib/generators/clean_settings/install_generator.rb
|
106
|
+
- lib/generators/clean_settings/templates/migration.rb
|
107
|
+
homepage: https://github.com/ashlinchak/clean_settings
|
108
|
+
licenses: []
|
109
|
+
metadata: {}
|
110
|
+
post_install_message:
|
111
|
+
rdoc_options: []
|
112
|
+
require_paths:
|
113
|
+
- lib
|
114
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
115
|
+
requirements:
|
116
|
+
- - ">="
|
117
|
+
- !ruby/object:Gem::Version
|
118
|
+
version: '0'
|
119
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
120
|
+
requirements:
|
121
|
+
- - ">="
|
122
|
+
- !ruby/object:Gem::Version
|
123
|
+
version: '0'
|
124
|
+
requirements: []
|
125
|
+
rubyforge_project:
|
126
|
+
rubygems_version: 2.4.8
|
127
|
+
signing_key:
|
128
|
+
specification_version: 4
|
129
|
+
summary: Simple and clean settings for your Rails project.
|
130
|
+
test_files: []
|
131
|
+
has_rdoc:
|