easy_app_helper 1.0.3 → 1.0.4
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 +4 -4
- data/.gitignore +48 -47
- data/Gemfile +4 -4
- data/LICENSE.txt +22 -22
- data/README.md +498 -498
- data/Rakefile +8 -1
- data/easy_app_helper.gemspec +27 -26
- data/lib/easy_app_helper.rb +20 -20
- data/lib/easy_app_helper/core/base.rb +168 -141
- data/lib/easy_app_helper/core/config.rb +213 -203
- data/lib/easy_app_helper/core/logger.rb +111 -111
- data/lib/easy_app_helper/core/merge_policies.rb +37 -37
- data/lib/easy_app_helper/core/places.rb +51 -51
- data/lib/easy_app_helper/module_manager.rb +67 -67
- data/lib/easy_app_helper/version.rb +10 -10
- data/spec/config_spec.rb +128 -0
- data/spec/logger_spec.rb +33 -0
- data/test/test.yml +7 -7
- data/test/test2_app.rb +33 -33
- data/test/test3_app.rb +90 -90
- data/test/test4_app.rb +35 -35
- data/test/test_app.rb +55 -55
- metadata +20 -3
@@ -1,10 +1,10 @@
|
|
1
|
-
################################################################################
|
2
|
-
# EasyAppHelper
|
3
|
-
#
|
4
|
-
# Copyright (c) 2013 L.Briais under MIT license
|
5
|
-
# http://opensource.org/licenses/MIT
|
6
|
-
################################################################################
|
7
|
-
|
8
|
-
module EasyAppHelper
|
9
|
-
EASY_APP_HELPER_VERSION = "1.0.
|
10
|
-
end
|
1
|
+
################################################################################
|
2
|
+
# EasyAppHelper
|
3
|
+
#
|
4
|
+
# Copyright (c) 2013 L.Briais under MIT license
|
5
|
+
# http://opensource.org/licenses/MIT
|
6
|
+
################################################################################
|
7
|
+
|
8
|
+
module EasyAppHelper
|
9
|
+
EASY_APP_HELPER_VERSION = "1.0.4"
|
10
|
+
end
|
data/spec/config_spec.rb
ADDED
@@ -0,0 +1,128 @@
|
|
1
|
+
#-------------------------------------------------------------------------------
|
2
|
+
#
|
3
|
+
#
|
4
|
+
# Copyright (c) 2013 L.Briais under MIT license
|
5
|
+
# http://opensource.org/licenses/MIT
|
6
|
+
#-------------------------------------------------------------------------------
|
7
|
+
|
8
|
+
require 'rspec'
|
9
|
+
require 'easy_app_helper'
|
10
|
+
|
11
|
+
|
12
|
+
#describe EasyAppHelper::Core::Config do
|
13
|
+
describe EasyAppHelper.config do
|
14
|
+
SAMPLE_STRING = 'Sample String'
|
15
|
+
|
16
|
+
|
17
|
+
it 'should be fully initialized when first accessed' do
|
18
|
+
subject.should_not be nil
|
19
|
+
subject.logger.should_not be nil
|
20
|
+
end
|
21
|
+
|
22
|
+
it 'should be consistent regarding the way it is accessed' do
|
23
|
+
subject[:basic_test] = SAMPLE_STRING
|
24
|
+
expect(subject[]).to eq subject.to_hash
|
25
|
+
expect(subject[:basic_test]).to eq SAMPLE_STRING
|
26
|
+
end
|
27
|
+
|
28
|
+
|
29
|
+
it 'should be the same object accross different instances' do
|
30
|
+
expect(subject[:basic_test]).to eq SAMPLE_STRING
|
31
|
+
end
|
32
|
+
|
33
|
+
it 'should store the data in the :modified layer' do
|
34
|
+
expect(subject.find_layer :basic_test).to eq :modified
|
35
|
+
expect(subject.internal_configs[:modified][:content][:basic_test]).to eq subject[:basic_test]
|
36
|
+
|
37
|
+
end
|
38
|
+
|
39
|
+
it 'should provide a direct r/w access to layers' do
|
40
|
+
subject.internal_configs[:system][:content][:stupid_conf] = SAMPLE_STRING
|
41
|
+
expect(subject[:stupid_conf]).to eq SAMPLE_STRING
|
42
|
+
end
|
43
|
+
|
44
|
+
it 'should be reloaded when :config-file property changes changes' do
|
45
|
+
subject.should_receive(:force_reload)
|
46
|
+
subject[:'config-file'] = SAMPLE_STRING
|
47
|
+
end
|
48
|
+
|
49
|
+
it 'should be reloaded when script_filename changes' do
|
50
|
+
subject.should_receive(:force_reload)
|
51
|
+
subject.script_filename = SAMPLE_STRING
|
52
|
+
end
|
53
|
+
|
54
|
+
|
55
|
+
describe 'should override data when present in multiple layers' do
|
56
|
+
before(:all) do
|
57
|
+
EasyAppHelper.config.layers.each do |layer|
|
58
|
+
EasyAppHelper.config.internal_configs[layer][:content][:basic_test] = "#{SAMPLE_STRING} #{layer.to_s}"
|
59
|
+
end
|
60
|
+
EasyAppHelper.config.internal_configs[:command_line][:content][:'config-file'] = true
|
61
|
+
end
|
62
|
+
|
63
|
+
context "when requesting some data" do
|
64
|
+
let(:layers) {[:modified, :command_line, :specific_file, :user, :global, :system]}
|
65
|
+
|
66
|
+
original_ordered_layers = [:modified, :command_line, :specific_file, :user, :global, :system]
|
67
|
+
layers = original_ordered_layers.dup
|
68
|
+
original_ordered_layers.each do |layer|
|
69
|
+
test_descr = "should find the data in #{layer} if present in #{layer}"
|
70
|
+
unless layers.length == original_ordered_layers.length
|
71
|
+
already_removed = original_ordered_layers - layers
|
72
|
+
if already_removed.length == 1
|
73
|
+
test_descr += " and #{already_removed[0]} level is not specified."
|
74
|
+
end
|
75
|
+
if already_removed.length > 1
|
76
|
+
test_descr += " and #{already_removed.join ', '} levels are not specified."
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
it test_descr, layers: layers.dup do
|
81
|
+
layers = example.metadata[:layers]
|
82
|
+
expect(subject.find_layer :basic_test).to eq layer
|
83
|
+
expect(subject[:basic_test]).to eq "#{SAMPLE_STRING} #{layer.to_s}"
|
84
|
+
subject.internal_configs[layer][:content].delete :basic_test
|
85
|
+
end
|
86
|
+
|
87
|
+
layers.shift
|
88
|
+
|
89
|
+
end
|
90
|
+
end
|
91
|
+
|
92
|
+
end
|
93
|
+
|
94
|
+
context "when reset" do
|
95
|
+
|
96
|
+
it "should remove all modifications done the standard way" do
|
97
|
+
subject[:test_remove] = SAMPLE_STRING
|
98
|
+
subject.reset
|
99
|
+
expect(subject[:test_remove]).to be_nil
|
100
|
+
end
|
101
|
+
|
102
|
+
it "should keep modifications directly done on internal layers" do
|
103
|
+
subject.internal_configs[:system][:content][:stupid_conf] = SAMPLE_STRING
|
104
|
+
subject.reset
|
105
|
+
expect(subject.internal_configs[:system][:content][:stupid_conf]).to eq SAMPLE_STRING
|
106
|
+
end
|
107
|
+
|
108
|
+
end
|
109
|
+
|
110
|
+
context "when reloaded" do
|
111
|
+
|
112
|
+
it "should keep all modifications done the standard way" do
|
113
|
+
subject[:test_remove] = SAMPLE_STRING
|
114
|
+
subject.load_config
|
115
|
+
expect(subject[:test_remove]).to eq SAMPLE_STRING
|
116
|
+
end
|
117
|
+
|
118
|
+
it "should remove all modifications directly done on internal layers" do
|
119
|
+
subject.internal_configs[:system][:content][:stupid_conf] = SAMPLE_STRING
|
120
|
+
subject.internal_configs[:command_line][:content][:stupid_conf] = SAMPLE_STRING
|
121
|
+
subject.load_config
|
122
|
+
expect(subject.internal_configs[:system][:content][:stupid_conf]).to be_nil
|
123
|
+
expect(subject.internal_configs[:command_line][:content][:stupid_conf]).to be_nil
|
124
|
+
end
|
125
|
+
|
126
|
+
end
|
127
|
+
|
128
|
+
end
|
data/spec/logger_spec.rb
ADDED
@@ -0,0 +1,33 @@
|
|
1
|
+
#-------------------------------------------------------------------------------
|
2
|
+
#
|
3
|
+
#
|
4
|
+
# Copyright (c) 2013 L.Briais under MIT license
|
5
|
+
# http://opensource.org/licenses/MIT
|
6
|
+
#-------------------------------------------------------------------------------
|
7
|
+
|
8
|
+
require 'rspec'
|
9
|
+
require 'easy_app_helper'
|
10
|
+
|
11
|
+
|
12
|
+
#describe EasyAppHelper::Core::Logger
|
13
|
+
describe EasyAppHelper.logger do
|
14
|
+
let (:config) {EasyAppHelper.config}
|
15
|
+
|
16
|
+
context "to modify the log level" do
|
17
|
+
|
18
|
+
it 'should be ok to use the config object' do
|
19
|
+
Logger::Severity::DEBUG.upto(Logger::Severity::UNKNOWN) do |severity|
|
20
|
+
config[:'log-level'] = severity
|
21
|
+
expect(subject.level).to eq severity
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
it 'should be ok to use the #log_level= method' do
|
26
|
+
Logger::Severity::DEBUG.upto(Logger::Severity::UNKNOWN) do |severity|
|
27
|
+
subject.level= severity
|
28
|
+
expect(config[:'log-level']).to eq severity
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
end
|
data/test/test.yml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
|
-
stupid_config: true
|
2
|
-
|
3
|
-
pipo: bimbo
|
4
|
-
|
5
|
-
hash_example:
|
6
|
-
first: one
|
7
|
-
second: two
|
1
|
+
stupid_config: true
|
2
|
+
|
3
|
+
pipo: bimbo
|
4
|
+
|
5
|
+
hash_example:
|
6
|
+
first: one
|
7
|
+
second: two
|
data/test/test2_app.rb
CHANGED
@@ -1,33 +1,33 @@
|
|
1
|
-
#!/usr/bin/env ruby
|
2
|
-
|
3
|
-
|
4
|
-
require 'easy_app_helper'
|
5
|
-
|
6
|
-
|
7
|
-
# EasyAppHelper.logger.level = 0
|
8
|
-
EasyAppHelper.puts_and_logs "Groovy baby !"
|
9
|
-
EasyAppHelper.config[:zboubi] = "Hi shared"
|
10
|
-
|
11
|
-
class A
|
12
|
-
include EasyAppHelper
|
13
|
-
|
14
|
-
def echo
|
15
|
-
puts_and_logs config[:zboubi]
|
16
|
-
end
|
17
|
-
end
|
18
|
-
|
19
|
-
A.new.echo
|
20
|
-
EasyAppHelper.puts_and_logs EasyAppHelper.config[:zboubi]
|
21
|
-
|
22
|
-
include EasyAppHelper
|
23
|
-
puts_and_logs "ZBOUBI: #{config[:zboubi]}"
|
24
|
-
config.reset
|
25
|
-
puts_and_logs "ZBOUBI2: #{config[:zboubi]}"
|
26
|
-
|
27
|
-
puts config.to_yaml
|
28
|
-
config.script_filename = 'batch_audio_convert'
|
29
|
-
puts 'Internal configs'
|
30
|
-
puts config.internal_configs.to_yaml
|
31
|
-
puts 'Resulting config'
|
32
|
-
puts config.to_yaml
|
33
|
-
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
|
4
|
+
require 'easy_app_helper'
|
5
|
+
|
6
|
+
|
7
|
+
# EasyAppHelper.logger.level = 0
|
8
|
+
EasyAppHelper.puts_and_logs "Groovy baby !"
|
9
|
+
EasyAppHelper.config[:zboubi] = "Hi shared"
|
10
|
+
|
11
|
+
class A
|
12
|
+
include EasyAppHelper
|
13
|
+
|
14
|
+
def echo
|
15
|
+
puts_and_logs config[:zboubi]
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
A.new.echo
|
20
|
+
EasyAppHelper.puts_and_logs EasyAppHelper.config[:zboubi]
|
21
|
+
|
22
|
+
include EasyAppHelper
|
23
|
+
puts_and_logs "ZBOUBI: #{config[:zboubi]}"
|
24
|
+
config.reset
|
25
|
+
puts_and_logs "ZBOUBI2: #{config[:zboubi]}"
|
26
|
+
|
27
|
+
puts config.to_yaml
|
28
|
+
config.script_filename = 'batch_audio_convert'
|
29
|
+
puts 'Internal configs'
|
30
|
+
puts config.internal_configs.to_yaml
|
31
|
+
puts 'Resulting config'
|
32
|
+
puts config.to_yaml
|
33
|
+
|
data/test/test3_app.rb
CHANGED
@@ -1,90 +1,90 @@
|
|
1
|
-
#!/usr/bin/env ruby
|
2
|
-
|
3
|
-
require 'easy_app_helper'
|
4
|
-
|
5
|
-
# You can directly access the config or the logger through the EasyAppHelper module
|
6
|
-
puts "The application verbose flag is #{EasyAppHelper.config[:verbose]}"
|
7
|
-
|
8
|
-
# You can directly use the logger according to the command line flags
|
9
|
-
# This will do nothing unless --debug is set and --log-level is set to the correct level
|
10
|
-
EasyAppHelper.logger.info "Hi guys!"
|
11
|
-
|
12
|
-
# Fed up with the EasyAppHelper prefix ? Just include the module where you want
|
13
|
-
include EasyAppHelper
|
14
|
-
|
15
|
-
# You can override programmatically any part of the config
|
16
|
-
config[:debug] = true
|
17
|
-
logger.level = 1
|
18
|
-
config[:test] = 'Groovy'
|
19
|
-
EasyAppHelper.logger.info "Hi guys!... again"
|
20
|
-
|
21
|
-
# You can see the internals of the config
|
22
|
-
puts config.internal_configs.to_yaml
|
23
|
-
# Which will output
|
24
|
-
#:modified:
|
25
|
-
# :content:
|
26
|
-
# :log-level: 1
|
27
|
-
# :debug: true
|
28
|
-
# :test: cool
|
29
|
-
# :source: Changed by code
|
30
|
-
#:command_line:
|
31
|
-
# :content:
|
32
|
-
# :auto:
|
33
|
-
# :simulate:
|
34
|
-
# :verbose: true
|
35
|
-
# :help:
|
36
|
-
# :config-file:
|
37
|
-
# :config-override:
|
38
|
-
# :debug:
|
39
|
-
# :debug-on-err:
|
40
|
-
# :log-level:
|
41
|
-
# :log-file:
|
42
|
-
# :source: Command line
|
43
|
-
#:system:
|
44
|
-
# :content: {}
|
45
|
-
# :source:
|
46
|
-
# :origin: EasyAppHelper
|
47
|
-
#:global:
|
48
|
-
# :content: {}
|
49
|
-
# :source:
|
50
|
-
# :origin: ''
|
51
|
-
#:user:
|
52
|
-
# :content: {}
|
53
|
-
# :source:
|
54
|
-
# :origin: ''
|
55
|
-
#:specific_file:
|
56
|
-
# :content: {}
|
57
|
-
|
58
|
-
# You see of course that the two modifications we did are in the modified sub-hash
|
59
|
-
# And now the merged config
|
60
|
-
puts config.to_hash
|
61
|
-
|
62
|
-
# But you can see the modified part as it is:
|
63
|
-
puts config.internal_configs[:modified]
|
64
|
-
|
65
|
-
# Of course you can access it from any class
|
66
|
-
class Dummy
|
67
|
-
include EasyAppHelper
|
68
|
-
|
69
|
-
def initialize
|
70
|
-
puts "#{config[:test]} baby !"
|
71
|
-
# Back to the original
|
72
|
-
config.reset
|
73
|
-
puts config.internal_configs[:modified]
|
74
|
-
end
|
75
|
-
end
|
76
|
-
|
77
|
-
Dummy.new
|
78
|
-
|
79
|
-
# Some methods are provided to ease common tasks. For example this one will log at info level
|
80
|
-
# (so only displayed if debug mode and log level low enough), but will also puts on the console
|
81
|
-
# if verbose if set...
|
82
|
-
puts_and_logs "Hi world"
|
83
|
-
|
84
|
-
# It is actually one of the few methods added to regular Logger class (The added value of this logger
|
85
|
-
# is much more to be tightly coupled with the config object). Thus could access it like that:
|
86
|
-
logger.puts_and_logs "Hi world"
|
87
|
-
|
88
|
-
# or even
|
89
|
-
EasyAppHelper.logger.puts_and_logs "Hi world... 3 is enough."
|
90
|
-
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require 'easy_app_helper'
|
4
|
+
|
5
|
+
# You can directly access the config or the logger through the EasyAppHelper module
|
6
|
+
puts "The application verbose flag is #{EasyAppHelper.config[:verbose]}"
|
7
|
+
|
8
|
+
# You can directly use the logger according to the command line flags
|
9
|
+
# This will do nothing unless --debug is set and --log-level is set to the correct level
|
10
|
+
EasyAppHelper.logger.info "Hi guys!"
|
11
|
+
|
12
|
+
# Fed up with the EasyAppHelper prefix ? Just include the module where you want
|
13
|
+
include EasyAppHelper
|
14
|
+
|
15
|
+
# You can override programmatically any part of the config
|
16
|
+
config[:debug] = true
|
17
|
+
logger.level = 1
|
18
|
+
config[:test] = 'Groovy'
|
19
|
+
EasyAppHelper.logger.info "Hi guys!... again"
|
20
|
+
|
21
|
+
# You can see the internals of the config
|
22
|
+
puts config.internal_configs.to_yaml
|
23
|
+
# Which will output
|
24
|
+
#:modified:
|
25
|
+
# :content:
|
26
|
+
# :log-level: 1
|
27
|
+
# :debug: true
|
28
|
+
# :test: cool
|
29
|
+
# :source: Changed by code
|
30
|
+
#:command_line:
|
31
|
+
# :content:
|
32
|
+
# :auto:
|
33
|
+
# :simulate:
|
34
|
+
# :verbose: true
|
35
|
+
# :help:
|
36
|
+
# :config-file:
|
37
|
+
# :config-override:
|
38
|
+
# :debug:
|
39
|
+
# :debug-on-err:
|
40
|
+
# :log-level:
|
41
|
+
# :log-file:
|
42
|
+
# :source: Command line
|
43
|
+
#:system:
|
44
|
+
# :content: {}
|
45
|
+
# :source:
|
46
|
+
# :origin: EasyAppHelper
|
47
|
+
#:global:
|
48
|
+
# :content: {}
|
49
|
+
# :source:
|
50
|
+
# :origin: ''
|
51
|
+
#:user:
|
52
|
+
# :content: {}
|
53
|
+
# :source:
|
54
|
+
# :origin: ''
|
55
|
+
#:specific_file:
|
56
|
+
# :content: {}
|
57
|
+
|
58
|
+
# You see of course that the two modifications we did are in the modified sub-hash
|
59
|
+
# And now the merged config
|
60
|
+
puts config.to_hash
|
61
|
+
|
62
|
+
# But you can see the modified part as it is:
|
63
|
+
puts config.internal_configs[:modified]
|
64
|
+
|
65
|
+
# Of course you can access it from any class
|
66
|
+
class Dummy
|
67
|
+
include EasyAppHelper
|
68
|
+
|
69
|
+
def initialize
|
70
|
+
puts "#{config[:test]} baby !"
|
71
|
+
# Back to the original
|
72
|
+
config.reset
|
73
|
+
puts config.internal_configs[:modified]
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
Dummy.new
|
78
|
+
|
79
|
+
# Some methods are provided to ease common tasks. For example this one will log at info level
|
80
|
+
# (so only displayed if debug mode and log level low enough), but will also puts on the console
|
81
|
+
# if verbose if set...
|
82
|
+
puts_and_logs "Hi world"
|
83
|
+
|
84
|
+
# It is actually one of the few methods added to regular Logger class (The added value of this logger
|
85
|
+
# is much more to be tightly coupled with the config object). Thus could access it like that:
|
86
|
+
logger.puts_and_logs "Hi world"
|
87
|
+
|
88
|
+
# or even
|
89
|
+
EasyAppHelper.logger.puts_and_logs "Hi world... 3 is enough."
|
90
|
+
|
data/test/test4_app.rb
CHANGED
@@ -1,36 +1,36 @@
|
|
1
|
-
#!/usr/bin/env ruby
|
2
|
-
|
3
|
-
require 'easy_app_helper'
|
4
|
-
|
5
|
-
class MyApp
|
6
|
-
include EasyAppHelper
|
7
|
-
|
8
|
-
APP_NAME = "My super application"
|
9
|
-
# SCRIPT_NAME = File.basename($0, '.*')
|
10
|
-
VERSION = '0.0.1'
|
11
|
-
DESCRIPTION = 'This application is a proof of concept for EasyAppHelper.'
|
12
|
-
|
13
|
-
|
14
|
-
def initialize
|
15
|
-
# Providing this data is optional
|
16
|
-
config.describes_application(app_name: APP_NAME, app_version: VERSION, app_description: DESCRIPTION)
|
17
|
-
end
|
18
|
-
|
19
|
-
|
20
|
-
def run
|
21
|
-
if config[:help]
|
22
|
-
puts config.help
|
23
|
-
exit 0
|
24
|
-
end
|
25
|
-
puts_and_logs "Application is starting"
|
26
|
-
do_some_processing
|
27
|
-
end
|
28
|
-
|
29
|
-
def do_some_processing
|
30
|
-
puts_and_logs "Starting some heavy processing"
|
31
|
-
end
|
32
|
-
|
33
|
-
end
|
34
|
-
|
35
|
-
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require 'easy_app_helper'
|
4
|
+
|
5
|
+
class MyApp
|
6
|
+
include EasyAppHelper
|
7
|
+
|
8
|
+
APP_NAME = "My super application"
|
9
|
+
# SCRIPT_NAME = File.basename($0, '.*')
|
10
|
+
VERSION = '0.0.1'
|
11
|
+
DESCRIPTION = 'This application is a proof of concept for EasyAppHelper.'
|
12
|
+
|
13
|
+
|
14
|
+
def initialize
|
15
|
+
# Providing this data is optional
|
16
|
+
config.describes_application(app_name: APP_NAME, app_version: VERSION, app_description: DESCRIPTION)
|
17
|
+
end
|
18
|
+
|
19
|
+
|
20
|
+
def run
|
21
|
+
if config[:help]
|
22
|
+
puts config.help
|
23
|
+
exit 0
|
24
|
+
end
|
25
|
+
puts_and_logs "Application is starting"
|
26
|
+
do_some_processing
|
27
|
+
end
|
28
|
+
|
29
|
+
def do_some_processing
|
30
|
+
puts_and_logs "Starting some heavy processing"
|
31
|
+
end
|
32
|
+
|
33
|
+
end
|
34
|
+
|
35
|
+
|
36
36
|
MyApp.new.run
|