asetus 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: aabab562229de22b1301e26910b4a000a2086a15
4
+ data.tar.gz: b7fd09d5490ff4a84a3659cc653c02c4a70910ad
5
+ SHA512:
6
+ metadata.gz: cbc9b3ab70bd09b13c4d99ef328bebe75c2515b01f41c1074e5180f16878fc221db0e2bcb70f7aafa7d41fbfcbd1398383184954acf357e4932c4a38bb4684aa
7
+ data.tar.gz: 79c8ece12fa2d9a32bb58a1e67ff7cbc7c838aff04355d661cb2220d6f29b7afe8c416ccc76dcf8bad8628e3c19f3cff5863df72ba870b4a62a54a02f9b55644
data/.gitignore ADDED
@@ -0,0 +1,2 @@
1
+ Gemfile.lock
2
+ gems
data/Gemfile ADDED
@@ -0,0 +1,3 @@
1
+ source 'https://rubygems.org'
2
+
3
+ gemspec
data/README.md ADDED
@@ -0,0 +1,50 @@
1
+ # Asetus
2
+ Configuration library for ruby with YAML/JSON backends with unified object
3
+ access
4
+
5
+ ## Install
6
+ ```
7
+ % gem install asetus
8
+ ```
9
+
10
+ ## Use
11
+ ### Simple
12
+ ```
13
+ require 'asetus'
14
+ cfg = Asetus.cfg
15
+ port = cfg.server.port
16
+ user = cfg.auth.user
17
+ pw = cfg.auth.password
18
+ ```
19
+ It tried to detect your software name via caller_locations if no ':name'
20
+ argument was given.
21
+ It automatically loads /etc/name/config and ~/.config/name/config and merges
22
+ them together.
23
+
24
+ ### Advanced
25
+ ```
26
+ require 'asetus'
27
+ asetus = Asetus.new name: 'mykewlapp',
28
+ default: {'poop'=>'xyzzy'},
29
+ adapter: 'yaml',
30
+ usrdir: '/home/app/config/',
31
+ sysdir: '/System/config/',
32
+ load: false
33
+ asetus.default.poop2 = [1, 2, 3, 4]
34
+ asetus.default.starship.poopoers = 42
35
+ asetus.load :user
36
+ if asetus.user.empty?
37
+ asetus.user = asetus.default
38
+ asetus.save :user
39
+ end
40
+ asetus.load # load+merges cfg, takes argument :default, :system, :user
41
+ asetus.cfg # merged default + system + user (merged on load)
42
+ asetus.default # default only
43
+ asetus.system # system only
44
+ asetus.user # user only
45
+ ```
46
+
47
+ ## TODO
48
+
49
+ * should I add feature to raise on unconfigured/unset?
50
+ * should I always merge to 'cfg' when default/system/config is set?
data/Rakefile ADDED
@@ -0,0 +1,47 @@
1
+ begin
2
+ require 'rake/testtask'
3
+ require 'bundler'
4
+ Bundler.setup
5
+ rescue LoadError
6
+ warn 'bunler missing'
7
+ exit 42
8
+ end
9
+
10
+ gemspec = eval(File.read(Dir['*.gemspec'].first))
11
+ file = [gemspec.name, gemspec.version].join('-') + '.gem'
12
+
13
+ desc 'Validate gemspec'
14
+ task :gemspec do
15
+ gemspec.validate
16
+ end
17
+
18
+ desc 'Run minitest'
19
+ task :test do
20
+ Rake::TestTask.new do |t|
21
+ t.libs.push "lib"
22
+ t.test_files = FileList['spec/*_spec.rb']
23
+ t.verbose = true
24
+ end
25
+ end
26
+
27
+ desc 'Build gem'
28
+ task :build do
29
+ system "gem build #{gemspec.name}.gemspec"
30
+ FileUtils.mkdir_p 'gems'
31
+ FileUtils.mv file, 'gems'
32
+ end
33
+
34
+ desc 'Install gem'
35
+ task :install => :build do
36
+ system "sudo -E sh -c \'umask 022; gem install gems/#{file}\'"
37
+ end
38
+
39
+ desc 'Remove gems'
40
+ task :clean do
41
+ FileUtils.rm_rf 'gems'
42
+ end
43
+
44
+ desc 'Push to rubygems'
45
+ task :push do
46
+ system "gem push gems/#{file}"
47
+ end
data/asetus.gemspec ADDED
@@ -0,0 +1,16 @@
1
+ Gem::Specification.new do |s|
2
+ s.name = 'asetus'
3
+ s.version = '0.0.1'
4
+ s.platform = Gem::Platform::RUBY
5
+ s.authors = [ 'Saku Ytti' ]
6
+ s.email = %w( saku@ytti.fi )
7
+ s.homepage = 'http://github.com/ytti/asetus'
8
+ s.summary = 'configuration library'
9
+ s.description = 'configuration library with object access to YAML/JSON/CSON backends'
10
+ s.rubyforge_project = s.name
11
+ s.files = `git ls-files`.split("\n")
12
+ s.executables = %w( )
13
+ s.require_path = 'lib'
14
+
15
+ s.add_dependency 'slop'
16
+ end
@@ -0,0 +1,27 @@
1
+ class Asetus
2
+
3
+ def to_json config
4
+ Adapter::JSON.to config._asetus_to_hash
5
+ end
6
+
7
+ def from_json json
8
+ Adapter::JSON.from json
9
+ end
10
+
11
+ class Adapter
12
+ class JSON
13
+ class << self
14
+ def to hash
15
+ require 'json'
16
+ ::JSON.pretty_generate hash
17
+ end
18
+
19
+ def from json
20
+ require 'json'
21
+ ::JSON.load json
22
+ end
23
+ end
24
+ end
25
+ end
26
+
27
+ end
@@ -0,0 +1,27 @@
1
+ class Asetus
2
+
3
+ def to_yaml config
4
+ Adapter::YAML.to config._asetus_to_hash
5
+ end
6
+
7
+ def from_yaml yaml
8
+ Adapter::YAML.from yaml
9
+ end
10
+
11
+ class Adapter
12
+ class YAML
13
+ class << self
14
+ def to hash
15
+ require 'yaml'
16
+ ::YAML.dump hash
17
+ end
18
+
19
+ def from yaml
20
+ require 'yaml'
21
+ ::YAML.load yaml
22
+ end
23
+ end
24
+ end
25
+ end
26
+
27
+ end
@@ -0,0 +1,58 @@
1
+ class Asetus
2
+ class ConfigStruct
3
+
4
+ def _asetus_to_hash
5
+ hash = {}
6
+ @cfg.each do |key, value|
7
+ if value.class == ConfigStruct
8
+ value = value._asetus_to_hash
9
+ end
10
+ hash[key] = value
11
+ end
12
+ hash
13
+ end
14
+
15
+ def empty?
16
+ @cfg.empty?
17
+ end
18
+
19
+ private
20
+
21
+ def initialize hash=nil
22
+ @cfg = hash ? _asetus_from_hash(hash) : {}
23
+ end
24
+
25
+ def method_missing name, *args, &block
26
+ name = name.to_s
27
+ arg = args.first
28
+ if name[-1..-1] == '='
29
+ _asetus_set name[0..-2], arg
30
+ else
31
+ _asetus_get name, arg
32
+ end
33
+ end
34
+
35
+ def _asetus_set key, value
36
+ @cfg[key] = value
37
+ end
38
+
39
+ def _asetus_get key, value
40
+ if @cfg.has_key? key
41
+ @cfg[key]
42
+ else
43
+ @cfg[key] = ConfigStruct.new
44
+ end
45
+ end
46
+
47
+ def _asetus_from_hash hash
48
+ cfg = {}
49
+ hash.each do |key, value|
50
+ if value.class == Hash
51
+ value = _asetus_from_hash value
52
+ end
53
+ cfg[key] = value
54
+ end
55
+ end
56
+
57
+ end
58
+ end
data/lib/asetus.rb ADDED
@@ -0,0 +1,97 @@
1
+ require_relative 'asetus/configstruct'
2
+ require_relative 'asetus/adapter/yaml'
3
+ require_relative 'asetus/adapter/json'
4
+ require 'fileutils'
5
+
6
+ class AsetusError < StandardError; end
7
+ class NoName < AsetusError; end
8
+
9
+ class Asetus
10
+ CONFIG_FILE = 'config'
11
+ attr_reader :cfg, :default
12
+ attr_accessor :system, :user
13
+
14
+ class << self
15
+ def cfg *args
16
+ new(*args).cfg
17
+ end
18
+ end
19
+
20
+ def load level=:all
21
+ if level == :default or level == :all
22
+ @cfg = merge @cfg, @default
23
+ end
24
+ if level == :system or level == :all
25
+ @system = load_cfg @sysdir
26
+ @cfg = merge @cfg, @system
27
+ end
28
+ if level == :user or level == :all
29
+ @user = load_cfg @usrdir
30
+ @cfg = merge @cfg, @user
31
+ end
32
+ end
33
+
34
+ def save level=:user
35
+ if level == :user
36
+ save_cfg @usrdir, @user
37
+ elsif level == :system
38
+ save_cfg @sysdir, @system
39
+ end
40
+ end
41
+
42
+ private
43
+
44
+ def initialize opts={}
45
+ @name = (opts.delete(:name) or metaname)
46
+ @adapter = (opts.delete(:adapter) or 'yaml')
47
+ @usrdir = (opts.delete(:usrdir) or File.join(Dir.home, '.config', @name))
48
+ @sysdir = (opts.delete(:sysdir) or File.join('/etc', @name))
49
+ @default = ConfigStruct.new opts.delete(:default)
50
+ @system = ConfigStruct.new
51
+ @user = ConfigStruct.new
52
+ @cfg = ConfigStruct.new
53
+ @load = true
54
+ @load = opts.delete(:load) if opts.has_key?(:load)
55
+ load :all if @load
56
+ end
57
+
58
+ def load_cfg dir
59
+ file = File.join dir, CONFIG_FILE
60
+ file = File.read file
61
+ ConfigStruct.new from(@adapter, file)
62
+ rescue Errno::ENOENT
63
+ ConfigStruct.new
64
+ end
65
+
66
+ def save_cfg dir, config
67
+ config = to(@adapter, config)
68
+ file = File.join dir, CONFIG_FILE
69
+ FileUtils.mkdir_p dir
70
+ File.write file, config
71
+ end
72
+
73
+ def merge *configs
74
+ hash = {}
75
+ configs.each do |config|
76
+ hash = hash.merge config._asetus_to_hash
77
+ end
78
+ ConfigStruct.new hash
79
+ end
80
+
81
+ def from adapter, string
82
+ name = 'from_' + adapter
83
+ send name, string
84
+ end
85
+
86
+ def to adapter, config
87
+ name = 'to_' + adapter
88
+ send name, config
89
+ end
90
+
91
+ def metaname
92
+ path = caller_locations[-1].path
93
+ File.basename path, File.extname(path)
94
+ rescue
95
+ raise NoName, "can't figure out name, specify explicitly"
96
+ end
97
+ end
metadata ADDED
@@ -0,0 +1,66 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: asetus
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Saku Ytti
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2014-03-29 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: slop
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - '>='
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - '>='
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ description: configuration library with object access to YAML/JSON/CSON backends
28
+ email:
29
+ - saku@ytti.fi
30
+ executables: []
31
+ extensions: []
32
+ extra_rdoc_files: []
33
+ files:
34
+ - .gitignore
35
+ - Gemfile
36
+ - README.md
37
+ - Rakefile
38
+ - asetus.gemspec
39
+ - lib/asetus.rb
40
+ - lib/asetus/adapter/json.rb
41
+ - lib/asetus/adapter/yaml.rb
42
+ - lib/asetus/configstruct.rb
43
+ homepage: http://github.com/ytti/asetus
44
+ licenses: []
45
+ metadata: {}
46
+ post_install_message:
47
+ rdoc_options: []
48
+ require_paths:
49
+ - lib
50
+ required_ruby_version: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - '>='
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ required_rubygems_version: !ruby/object:Gem::Requirement
56
+ requirements:
57
+ - - '>='
58
+ - !ruby/object:Gem::Version
59
+ version: '0'
60
+ requirements: []
61
+ rubyforge_project: asetus
62
+ rubygems_version: 2.0.7
63
+ signing_key:
64
+ specification_version: 4
65
+ summary: configuration library
66
+ test_files: []