configdsl 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.
data/.gitignore ADDED
@@ -0,0 +1,17 @@
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
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in configdsl.gemspec
4
+ gemspec
data/LICENSE ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2012 MOZGIII
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/README.md ADDED
@@ -0,0 +1,212 @@
1
+ # ConfigDSL
2
+
3
+ A tasty DSL for configuration files. Get rid of those ugly YAML and JSON configs.
4
+
5
+ ## Installation
6
+
7
+ Add this line to your application's Gemfile:
8
+
9
+ gem 'configdsl'
10
+
11
+ And then execute:
12
+
13
+ $ bundle
14
+
15
+ Or install it yourself as:
16
+
17
+ $ gem install configdsl
18
+
19
+ ## Usage
20
+
21
+ ### Standalone Usage
22
+
23
+ #### To read a config file
24
+
25
+ - in your app:
26
+
27
+ ```ruby
28
+ # Read external data
29
+ ConfigDSL.read("test.cdsl.rb")
30
+ ```
31
+
32
+ - test.cdsl.rb
33
+
34
+ ```ruby
35
+ hi "User"
36
+ # p hi # => "User"
37
+
38
+ list do
39
+ one "123"
40
+ two "345"
41
+ three do
42
+ one "1"
43
+ three_two one + " 2"
44
+ three_three "three"
45
+ end
46
+ see "will_be_ovewritten"
47
+ end
48
+
49
+ list 5 do |index|
50
+ append "anything"
51
+ second index + 1
52
+ square index ** 2
53
+
54
+ see "overwritten!"
55
+ end
56
+
57
+ starting_time Time.now
58
+ ```
59
+
60
+ will produce
61
+
62
+ ```ruby
63
+ pp ConfigDSL.data
64
+
65
+ {:hi=>"User",
66
+ :list=>
67
+ {:one=>"123",
68
+ :two=>"345",
69
+ :three=>{:one=>"1", :three_two=>"1 2", :three_three=>"three"},
70
+ :see=>"overwritten!",
71
+ :append=>"anything",
72
+ :second=>6,
73
+ :square=>25},
74
+ :starting_time=>2012-11-05 22:47:36 +0000}
75
+ ```
76
+
77
+ #### You can also load inline configs form your code
78
+
79
+ ```ruby
80
+ # Execute inline data
81
+ ConfigDSL.execute do
82
+ inline_loading_example "here goes"
83
+ value "awesome"
84
+ code "great"
85
+ block_test "config option" do |preset|
86
+ block_val preset
87
+ end
88
+ end
89
+
90
+ # Another inline data
91
+ ConfigDSL.execute do
92
+ value "awesome"
93
+ end
94
+ ```
95
+
96
+ gives
97
+
98
+ ```ruby
99
+ {:inline_loading_example=>"here goes",
100
+ :value=>"awesome",
101
+ :code=>"great",
102
+ :block_test=>{:block_val=>"config option"}}
103
+ ```
104
+
105
+
106
+ #### You can combine theese two
107
+
108
+ ```ruby
109
+ # Read external data
110
+ ConfigDSL.read("test.cdsl.rb")
111
+
112
+ # Execute inline data
113
+ ConfigDSL.execute do
114
+ inline_loading_example "here goes"
115
+ value "awesome"
116
+ code "great"
117
+ block_test "config option" do |preset|
118
+ block_val preset
119
+ end
120
+ end
121
+
122
+ # Another inline data
123
+ ConfigDSL.execute do
124
+ value "awesome"
125
+ end
126
+
127
+ require "pp" # for pretty print
128
+ pp ConfigDSL.data
129
+ ```
130
+
131
+ is
132
+
133
+ ```ruby
134
+ {:hi=>"User",
135
+ :list=>
136
+ {:one=>"123",
137
+ :two=>"345",
138
+ :three=>{:one=>"1", :three_two=>"1 2", :three_three=>"three"},
139
+ :see=>"overwritten!",
140
+ :append=>"anything",
141
+ :second=>6,
142
+ :square=>25},
143
+ :starting_time=>2012-11-05 22:48:40 +0000,
144
+ :inline_loading_example=>"here goes",
145
+ :value=>"awesome",
146
+ :code=>"great",
147
+ :block_test=>{:block_val=>"config option"}}
148
+ ```
149
+
150
+ #### You can coviniently access all the config values in your app
151
+
152
+ ```ruby
153
+ # Here is how you get all the config
154
+ p ConfigDSL.data
155
+
156
+ # To read data from your app you can do this:
157
+
158
+ puts ; puts "Value of :value is: "
159
+ p ConfigDSL.data[:value]
160
+
161
+ # or this
162
+
163
+ puts ; puts "Another way to get it is: "
164
+ p ConfigDSL[:value]
165
+
166
+ # Access block values
167
+
168
+ puts "Block values: "
169
+
170
+ puts ; puts "-- [:list][:one]"
171
+ p ConfigDSL[:list][:one]
172
+
173
+ puts ; puts "-- [:list][:two]"
174
+ p ConfigDSL[:list][:two]
175
+
176
+ puts ; puts "-- [:list][:three]"
177
+ p ConfigDSL[:list][:three]
178
+
179
+ puts ; puts "-- [:list][:three][:three_two]"
180
+ p ConfigDSL[:list][:three][:three_two]
181
+
182
+ # Get something complex
183
+ puts ; puts "Program was stared at: "
184
+ p ConfigDSL[:starting_time]
185
+ ```
186
+
187
+ #### Check out the example!
188
+
189
+ There is an `examples` dir. Check it out to see how it works for yourself!
190
+
191
+ ### Use Hashie::Mash
192
+
193
+ If you're using Hashie::Mash from https://github.com/intridea/hashie, it will be used to store the config.
194
+ Just make sure to require it before you read the first value.
195
+
196
+
197
+ ### Ruby on Rails
198
+
199
+ To be implemented. For now you can use it like standalone as initializer.
200
+
201
+ ### To-Do List
202
+
203
+ - Ruby on Rails integration
204
+ - Lazy config values
205
+
206
+ ## Contributing
207
+
208
+ 1. Fork it
209
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
210
+ 3. Commit your changes (`git commit -am 'Added some feature'`)
211
+ 4. Push to the branch (`git push origin my-new-feature`)
212
+ 5. Create new Pull Request
data/Rakefile ADDED
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env rake
2
+ require "bundler/gem_tasks"
data/configdsl.gemspec ADDED
@@ -0,0 +1,19 @@
1
+ # -*- encoding: utf-8 -*-
2
+ require File.expand_path('../lib/configdsl/version', __FILE__)
3
+
4
+ Gem::Specification.new do |gem|
5
+ gem.authors = ["MOZGIII"]
6
+ gem.email = ["mike-n@narod.ru"]
7
+ gem.description = %q{A convinient DSL for your app configuration!}
8
+ gem.summary = %q{A convinient DSL for your app configuration!}
9
+ gem.homepage = ""
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 = "configdsl"
15
+ gem.require_paths = ["lib"]
16
+ gem.version = Configdsl::VERSION
17
+
18
+ gem.add_runtime_dependency "activesupport"
19
+ end
@@ -0,0 +1,56 @@
1
+ $: << "../lib"
2
+ require 'configdsl'
3
+
4
+ # Read external data
5
+ ConfigDSL.read("test.cdsl.rb")
6
+
7
+ # Execute inline data
8
+ ConfigDSL.execute do
9
+ inline_loading_example "here goes"
10
+ value "awesome"
11
+ code "great"
12
+ block_test "config option" do |preset|
13
+ block_val preset
14
+ end
15
+ end
16
+
17
+ # Another inline data
18
+ ConfigDSL.execute do
19
+ value "awesome"
20
+ end
21
+
22
+ require "pp" # for pretty print
23
+
24
+ # Here is how you get all the config
25
+ pp ConfigDSL.data
26
+
27
+ # To read data from your app you can do this:
28
+
29
+ puts ; puts "Value of :value is: "
30
+ p ConfigDSL.data[:value]
31
+
32
+ # or this
33
+
34
+ puts ; puts "Another way to get it is: "
35
+ p ConfigDSL[:value]
36
+
37
+ # Access block values
38
+
39
+ puts "Block values: "
40
+
41
+ puts ; puts "-- [:list][:one]"
42
+ p ConfigDSL[:list][:one]
43
+
44
+ puts ; puts "-- [:list][:two]"
45
+ p ConfigDSL[:list][:two]
46
+
47
+ puts ; puts "-- [:list][:three]"
48
+ p ConfigDSL[:list][:three]
49
+
50
+ puts ; puts "-- [:list][:three][:three_two]"
51
+ p ConfigDSL[:list][:three][:three_two]
52
+
53
+ # Get something complex
54
+ puts ; puts "Program was stared at: "
55
+ p ConfigDSL[:starting_time]
56
+
@@ -0,0 +1,29 @@
1
+ # Simple example
2
+ hi "User"
3
+ # p hi # => "User"
4
+
5
+ # Local variables still work!
6
+ local_var = "it is me"
7
+ another_var = "not included in config but can be used as usual"
8
+
9
+ # Complex example
10
+ list do
11
+ one "123"
12
+ two "345"
13
+ three do
14
+ one "1"
15
+ three_two one + " 2"
16
+ three_three "three"
17
+ end
18
+ see "will_be_ovewritten"
19
+ end
20
+
21
+ list 5 do |index|
22
+ append "anything"
23
+ second index + 1
24
+ square index ** 2
25
+
26
+ see "overwritten!"
27
+ end
28
+
29
+ starting_time Time.now
data/lib/configdsl.rb ADDED
@@ -0,0 +1,165 @@
1
+ require "configdsl/version"
2
+ require "active_support/concern"
3
+ require "forwardable"
4
+
5
+ module ConfigDSL
6
+ module Memory
7
+ class << self
8
+ # Creates a new layer-level storage element
9
+ def layers_factory
10
+ # Try to use Hashie::Mash if defined (see hashie gem)
11
+ return Hashie::Mash.new if defined?(Hashie::Mash)
12
+
13
+ # Fallback to standart ruby Hash
14
+ Hash.new
15
+ end
16
+
17
+ # Main data container
18
+ def data
19
+ @data ||= layers_factory
20
+ end
21
+
22
+ # Stores a value in specified key for specified context
23
+ def store(key, value, context = [])
24
+ layer = expand_context(context)
25
+ layer[key] = value
26
+ end
27
+
28
+ # Fetches a specified key for a specified context
29
+ # Allows to provide a default value
30
+ def fetch(key, defaul_value = nil, context = [])
31
+ fetch!(key, context)
32
+ rescue KeyError => e
33
+ defaul_value
34
+ end
35
+
36
+ # Fetches a specified key for a specified context
37
+ # Raises exception if something goes wrong
38
+ def fetch!(key, context = [])
39
+ layer = expand_context(context)
40
+ raise KeyError, "In context #{context} key not found: #{key.inspect}" unless layer.has_key?(key)
41
+ layer[key]
42
+ end
43
+
44
+ # Return a layer described by context or rises an exception
45
+ # if any of parent layers is undefined
46
+ def expand_context(context)
47
+ context.inject(data) do |hash, level|
48
+ hash[level]
49
+ end
50
+ end
51
+
52
+ # Adds a new layer if it does not exist
53
+ def add_layer(new_layer, context)
54
+ current_layer = expand_context(context)
55
+ current_layer[new_layer] ||= layers_factory
56
+ end
57
+ end
58
+ end
59
+
60
+ module DSL
61
+ extend ActiveSupport::Concern
62
+
63
+ def self.debug?
64
+ false
65
+ end
66
+
67
+ def context
68
+ @@context ||= []
69
+ end
70
+
71
+ def debug(text)
72
+ puts text if DSL.debug?
73
+ end
74
+
75
+ def varibales_hook(meth, *args, &block)
76
+ debug "Hooked #{meth}"
77
+ debug "Context is #{context}"
78
+ if block_given?
79
+ # Add list
80
+ debug "Adding list #{meth}"
81
+ evaluate_within_layer(meth, block, args)
82
+ else
83
+ if args.empty?
84
+ # Read variable
85
+ debug "Reading variable #{meth}"
86
+ Memory.fetch!(meth, context)
87
+ else
88
+ # Add variable
89
+ debug "Adding variable #{meth}"
90
+ value = args.size == 1 ? args.first : args.dup
91
+ Memory.store(meth, value, context)
92
+ end
93
+ end
94
+ end
95
+
96
+ def evaluate_within_layer(new_layer, block, args = [])
97
+ Memory.add_layer(new_layer, context)
98
+ begin
99
+ context.push new_layer
100
+ block.call(*args)
101
+ ensure
102
+ context.pop
103
+ end
104
+ end
105
+
106
+ def method_missing(meth, *args, &block)
107
+ if respond_to?(meth)
108
+ super
109
+ else
110
+ varibales_hook(meth, *args, &block)
111
+ end
112
+ end
113
+
114
+ end
115
+
116
+ module Processor
117
+ class Sandbox
118
+ include DSL
119
+ end
120
+
121
+ def self.process(filename)
122
+ sandbox = Sandbox.new
123
+ sandbox.instance_eval(File.read(filename), filename)
124
+ sandbox
125
+ end
126
+
127
+ def self.execute(&block)
128
+ sandbox = Sandbox.new
129
+ sandbox.instance_eval(&block)
130
+ sandbox
131
+ end
132
+
133
+ def self.add_module(module_const)
134
+ Sandbox.extend module_const
135
+ end
136
+ end
137
+
138
+ class << self
139
+ def read(filename)
140
+ Processor.process(filename)
141
+ end
142
+
143
+ def execute(&block)
144
+ Processor.execute(&block)
145
+ end
146
+
147
+ def data
148
+ Memory.data
149
+ end
150
+
151
+ def method_missing(meth, *args, &block)
152
+ if data.respond_to?(meth)
153
+ data.send(meth, *args, &block)
154
+ else
155
+ super
156
+ end
157
+ end
158
+
159
+ def respond_to?(meth)
160
+ super_value = super
161
+ return super_value if super_value != false
162
+ data.respond_to?(meth)
163
+ end
164
+ end
165
+ end
@@ -0,0 +1,3 @@
1
+ module Configdsl
2
+ VERSION = "1.0.0"
3
+ end
metadata ADDED
@@ -0,0 +1,71 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: configdsl
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - MOZGIII
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2012-11-06 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: activesupport
16
+ requirement: !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: '0'
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ! '>='
28
+ - !ruby/object:Gem::Version
29
+ version: '0'
30
+ description: A convinient DSL for your app configuration!
31
+ email:
32
+ - mike-n@narod.ru
33
+ executables: []
34
+ extensions: []
35
+ extra_rdoc_files: []
36
+ files:
37
+ - .gitignore
38
+ - Gemfile
39
+ - LICENSE
40
+ - README.md
41
+ - Rakefile
42
+ - configdsl.gemspec
43
+ - examples/example.rb
44
+ - examples/test.cdsl.rb
45
+ - lib/configdsl.rb
46
+ - lib/configdsl/version.rb
47
+ homepage: ''
48
+ licenses: []
49
+ post_install_message:
50
+ rdoc_options: []
51
+ require_paths:
52
+ - lib
53
+ required_ruby_version: !ruby/object:Gem::Requirement
54
+ none: false
55
+ requirements:
56
+ - - ! '>='
57
+ - !ruby/object:Gem::Version
58
+ version: '0'
59
+ required_rubygems_version: !ruby/object:Gem::Requirement
60
+ none: false
61
+ requirements:
62
+ - - ! '>='
63
+ - !ruby/object:Gem::Version
64
+ version: '0'
65
+ requirements: []
66
+ rubyforge_project:
67
+ rubygems_version: 1.8.24
68
+ signing_key:
69
+ specification_version: 3
70
+ summary: A convinient DSL for your app configuration!
71
+ test_files: []