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,111 +1,111 @@
|
|
1
|
-
################################################################################
|
2
|
-
# EasyAppHelper
|
3
|
-
#
|
4
|
-
# Copyright (c) 2013 L.Briais under MIT license
|
5
|
-
# http://opensource.org/licenses/MIT
|
6
|
-
################################################################################
|
7
|
-
|
8
|
-
require 'logger'
|
9
|
-
require 'singleton'
|
10
|
-
|
11
|
-
# Official Ruby Logger re-opened to introduce a method to hand-over the temporary history from a temporary logger
|
12
|
-
# to the definitive one.
|
13
|
-
# TODO: Ensure only the messages that are above the current level are displayed when handing over to the definitive logger.
|
14
|
-
class Logger
|
15
|
-
def handing_over_to(log)
|
16
|
-
history = []
|
17
|
-
history = @logdev.dev.history if @logdev.dev.respond_to? :history
|
18
|
-
@logdev.close
|
19
|
-
@logdev = LogDevice.new log
|
20
|
-
history.each do |msg|
|
21
|
-
@logdev.write msg if ENV['DEBUG_EASY_MODULES'] or (msg =~ /^[WE]/)
|
22
|
-
end
|
23
|
-
end
|
24
|
-
end
|
25
|
-
|
26
|
-
# This is the logger that will be used by the application and any class that include {EasyAppHelper} module. It is
|
27
|
-
# configured by the {EasyAppHelper::Core::Config Config} object, and provides a temporary logger until the config
|
28
|
-
# is fully loaded.
|
29
|
-
class EasyAppHelper::Core::Logger < Logger
|
30
|
-
include Singleton
|
31
|
-
|
32
|
-
|
33
|
-
def initialize
|
34
|
-
@config = {}
|
35
|
-
super(TempLogger.new)
|
36
|
-
self.level = Severity::DEBUG
|
37
|
-
debug "Temporary initialisation logger created..."
|
38
|
-
end
|
39
|
-
|
40
|
-
# Change the log level while keeping the config in sync.
|
41
|
-
def level=(level)
|
42
|
-
super
|
43
|
-
@config[:'log-level'] = level
|
44
|
-
end
|
45
|
-
|
46
|
-
# Displays the message according to application verbosity and logs it as info.
|
47
|
-
def puts_and_logs(msg)
|
48
|
-
puts msg if @config[:verbose]
|
49
|
-
info(msg)
|
50
|
-
end
|
51
|
-
|
52
|
-
# Reset the logger regarding the config provided
|
53
|
-
def set_app_config(config)
|
54
|
-
@config = config
|
55
|
-
add_cmd_line_options
|
56
|
-
@config.load_config
|
57
|
-
debug "Config layers:\n#{@config.internal_configs.to_yaml}"
|
58
|
-
debug "Merged config:\n#{@config.to_yaml}"
|
59
|
-
if config[:debug]
|
60
|
-
if config[:'log-file']
|
61
|
-
handing_over_to config[:'log-file']
|
62
|
-
elsif config[:"debug-on-err"]
|
63
|
-
handing_over_to STDERR
|
64
|
-
else
|
65
|
-
handing_over_to STDOUT
|
66
|
-
end
|
67
|
-
else
|
68
|
-
close
|
69
|
-
end
|
70
|
-
self.level = config[:'log-level'] ? config[:'log-level'] : Severity::WARN
|
71
|
-
self
|
72
|
-
end
|
73
|
-
|
74
|
-
private
|
75
|
-
|
76
|
-
|
77
|
-
def add_cmd_line_options
|
78
|
-
@config.add_command_line_section('Debug and logging options') do |slop|
|
79
|
-
slop.on :debug, 'Run in debug mode.', :argument => false
|
80
|
-
slop.on 'debug-on-err', 'Run in debug mode with output to stderr.', :argument => false
|
81
|
-
slop.on 'log-level', "Log level from 0 to 5, default #{Severity::WARN}.", :argument => true, :as => Integer
|
82
|
-
slop.on 'log-file', 'File to log to.', :argument => true
|
83
|
-
end
|
84
|
-
end
|
85
|
-
|
86
|
-
# This class will act as a temporary logger, actually just keeping the history until the real
|
87
|
-
# configuration for the logger is known. Then the history is displayed or not regarding the
|
88
|
-
# definitive logger configuration.
|
89
|
-
class TempLogger
|
90
|
-
attr_reader :history
|
91
|
-
|
92
|
-
def initialize
|
93
|
-
@history = []
|
94
|
-
end
|
95
|
-
|
96
|
-
def write(data)
|
97
|
-
return if closed?
|
98
|
-
@history << data if @history
|
99
|
-
end
|
100
|
-
|
101
|
-
def close
|
102
|
-
@closed = true
|
103
|
-
end
|
104
|
-
|
105
|
-
def opened?() not @closed ; end
|
106
|
-
def closed?() @closed ; end
|
107
|
-
end
|
108
|
-
|
109
|
-
end
|
110
|
-
|
111
|
-
|
1
|
+
################################################################################
|
2
|
+
# EasyAppHelper
|
3
|
+
#
|
4
|
+
# Copyright (c) 2013 L.Briais under MIT license
|
5
|
+
# http://opensource.org/licenses/MIT
|
6
|
+
################################################################################
|
7
|
+
|
8
|
+
require 'logger'
|
9
|
+
require 'singleton'
|
10
|
+
|
11
|
+
# Official Ruby Logger re-opened to introduce a method to hand-over the temporary history from a temporary logger
|
12
|
+
# to the definitive one.
|
13
|
+
# TODO: Ensure only the messages that are above the current level are displayed when handing over to the definitive logger.
|
14
|
+
class Logger
|
15
|
+
def handing_over_to(log)
|
16
|
+
history = []
|
17
|
+
history = @logdev.dev.history if @logdev.dev.respond_to? :history
|
18
|
+
@logdev.close
|
19
|
+
@logdev = LogDevice.new log
|
20
|
+
history.each do |msg|
|
21
|
+
@logdev.write msg if ENV['DEBUG_EASY_MODULES'] or (msg =~ /^[WE]/)
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
# This is the logger that will be used by the application and any class that include {EasyAppHelper} module. It is
|
27
|
+
# configured by the {EasyAppHelper::Core::Config Config} object, and provides a temporary logger until the config
|
28
|
+
# is fully loaded.
|
29
|
+
class EasyAppHelper::Core::Logger < Logger
|
30
|
+
include Singleton
|
31
|
+
|
32
|
+
|
33
|
+
def initialize
|
34
|
+
@config = {}
|
35
|
+
super(TempLogger.new)
|
36
|
+
self.level = Severity::DEBUG
|
37
|
+
debug "Temporary initialisation logger created..."
|
38
|
+
end
|
39
|
+
|
40
|
+
# Change the log level while keeping the config in sync.
|
41
|
+
def level=(level, update_config = true)
|
42
|
+
super(level)
|
43
|
+
@config[:'log-level'] = level if update_config
|
44
|
+
end
|
45
|
+
|
46
|
+
# Displays the message according to application verbosity and logs it as info.
|
47
|
+
def puts_and_logs(msg)
|
48
|
+
puts msg if @config[:verbose]
|
49
|
+
info(msg)
|
50
|
+
end
|
51
|
+
|
52
|
+
# Reset the logger regarding the config provided
|
53
|
+
def set_app_config(config)
|
54
|
+
@config = config
|
55
|
+
add_cmd_line_options
|
56
|
+
@config.load_config
|
57
|
+
debug "Config layers:\n#{@config.internal_configs.to_yaml}"
|
58
|
+
debug "Merged config:\n#{@config.to_yaml}"
|
59
|
+
if config[:debug]
|
60
|
+
if config[:'log-file']
|
61
|
+
handing_over_to config[:'log-file']
|
62
|
+
elsif config[:"debug-on-err"]
|
63
|
+
handing_over_to STDERR
|
64
|
+
else
|
65
|
+
handing_over_to STDOUT
|
66
|
+
end
|
67
|
+
else
|
68
|
+
close
|
69
|
+
end
|
70
|
+
self.level = config[:'log-level'] ? config[:'log-level'] : Severity::WARN
|
71
|
+
self
|
72
|
+
end
|
73
|
+
|
74
|
+
private
|
75
|
+
|
76
|
+
|
77
|
+
def add_cmd_line_options
|
78
|
+
@config.add_command_line_section('Debug and logging options') do |slop|
|
79
|
+
slop.on :debug, 'Run in debug mode.', :argument => false
|
80
|
+
slop.on 'debug-on-err', 'Run in debug mode with output to stderr.', :argument => false
|
81
|
+
slop.on 'log-level', "Log level from 0 to 5, default #{Severity::WARN}.", :argument => true, :as => Integer
|
82
|
+
slop.on 'log-file', 'File to log to.', :argument => true
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
86
|
+
# This class will act as a temporary logger, actually just keeping the history until the real
|
87
|
+
# configuration for the logger is known. Then the history is displayed or not regarding the
|
88
|
+
# definitive logger configuration.
|
89
|
+
class TempLogger
|
90
|
+
attr_reader :history
|
91
|
+
|
92
|
+
def initialize
|
93
|
+
@history = []
|
94
|
+
end
|
95
|
+
|
96
|
+
def write(data)
|
97
|
+
return if closed?
|
98
|
+
@history << data if @history
|
99
|
+
end
|
100
|
+
|
101
|
+
def close
|
102
|
+
@closed = true
|
103
|
+
end
|
104
|
+
|
105
|
+
def opened?() not @closed ; end
|
106
|
+
def closed?() @closed ; end
|
107
|
+
end
|
108
|
+
|
109
|
+
end
|
110
|
+
|
111
|
+
|
@@ -1,37 +1,37 @@
|
|
1
|
-
################################################################################
|
2
|
-
# EasyAppHelper
|
3
|
-
#
|
4
|
-
# Copyright (c) 2013 L.Briais under MIT license
|
5
|
-
# http://opensource.org/licenses/MIT
|
6
|
-
################################################################################
|
7
|
-
|
8
|
-
# This module proposes different merge policies for two hashes.
|
9
|
-
module EasyAppHelper::Core::HashesMergePolicies
|
10
|
-
|
11
|
-
# Performs a merge at the second level of hashes.
|
12
|
-
# simple entries and arrays are overridden.
|
13
|
-
def hashes_second_level_merge(h1, h2)
|
14
|
-
h2.each do |key, v|
|
15
|
-
if h1[key] and h1[key].is_a?(Hash)
|
16
|
-
# Merges hashes
|
17
|
-
h1[key].merge! h2[key]
|
18
|
-
else
|
19
|
-
# Overrides the rest
|
20
|
-
h1[key] = h2[key] unless h2[key].nil?
|
21
|
-
end
|
22
|
-
end
|
23
|
-
h1
|
24
|
-
end
|
25
|
-
|
26
|
-
# Uses the standard "merge!" method
|
27
|
-
def simple_merge(h1, h2)
|
28
|
-
h1.merge! h2
|
29
|
-
end
|
30
|
-
|
31
|
-
# Brutal override
|
32
|
-
def override_merge(h1, h2)
|
33
|
-
h1 = nil
|
34
|
-
h1 = h2
|
35
|
-
|
36
|
-
end
|
37
|
-
end
|
1
|
+
################################################################################
|
2
|
+
# EasyAppHelper
|
3
|
+
#
|
4
|
+
# Copyright (c) 2013 L.Briais under MIT license
|
5
|
+
# http://opensource.org/licenses/MIT
|
6
|
+
################################################################################
|
7
|
+
|
8
|
+
# This module proposes different merge policies for two hashes.
|
9
|
+
module EasyAppHelper::Core::HashesMergePolicies
|
10
|
+
|
11
|
+
# Performs a merge at the second level of hashes.
|
12
|
+
# simple entries and arrays are overridden.
|
13
|
+
def hashes_second_level_merge(h1, h2)
|
14
|
+
h2.each do |key, v|
|
15
|
+
if h1[key] and h1[key].is_a?(Hash)
|
16
|
+
# Merges hashes
|
17
|
+
h1[key].merge! h2[key]
|
18
|
+
else
|
19
|
+
# Overrides the rest
|
20
|
+
h1[key] = h2[key] unless h2[key].nil?
|
21
|
+
end
|
22
|
+
end
|
23
|
+
h1
|
24
|
+
end
|
25
|
+
|
26
|
+
# Uses the standard "merge!" method
|
27
|
+
def simple_merge(h1, h2)
|
28
|
+
h1.merge! h2
|
29
|
+
end
|
30
|
+
|
31
|
+
# Brutal override
|
32
|
+
def override_merge(h1, h2)
|
33
|
+
h1 = nil
|
34
|
+
h1 = h2
|
35
|
+
|
36
|
+
end
|
37
|
+
end
|
@@ -1,52 +1,52 @@
|
|
1
|
-
################################################################################
|
2
|
-
# EasyAppHelper
|
3
|
-
#
|
4
|
-
# Copyright (c) 2013 L.Briais under MIT license
|
5
|
-
# http://opensource.org/licenses/MIT
|
6
|
-
################################################################################
|
7
|
-
|
8
|
-
# Possible places regarding the OS
|
9
|
-
# TODO: Add equivalent for Mac
|
10
|
-
class EasyAppHelper::Core::Config::Places
|
11
|
-
module Unix
|
12
|
-
# Where could be stored admin configuration that rules all EasyAppHelper
|
13
|
-
# based applications.
|
14
|
-
POSSIBLE_PLACES = {
|
15
|
-
|
16
|
-
system: ["/etc"],
|
17
|
-
|
18
|
-
# Where could be stored global wide configuration
|
19
|
-
global: ["/etc",
|
20
|
-
"/usr/local/etc"],
|
21
|
-
|
22
|
-
# Where could be stored user configuration
|
23
|
-
user: ["#{ENV['HOME']}/.config"]
|
24
|
-
}
|
25
|
-
end
|
26
|
-
|
27
|
-
module Windows
|
28
|
-
# Where could be stored admin configuration that rules all EasyAppHelper
|
29
|
-
# based applications.
|
30
|
-
POSSIBLE_PLACES = {
|
31
|
-
|
32
|
-
system: ["#{ENV['systemRoot']}/Config"],
|
33
|
-
|
34
|
-
# Where could be stored global configuration
|
35
|
-
global: ['C:/Windows/Config',
|
36
|
-
"#{ENV['ALLUSERSPROFILE']}/Application Data"],
|
37
|
-
|
38
|
-
# Where could be stored user configuration
|
39
|
-
user: [ENV['APPDATA']]
|
40
|
-
}
|
41
|
-
end
|
42
|
-
|
43
|
-
CONF ={
|
44
|
-
mingw32: Windows
|
45
|
-
}
|
46
|
-
DEFAULT = Unix
|
47
|
-
|
48
|
-
def self.get_OS_module
|
49
|
-
conf = CONF[RbConfig::CONFIG['target_os'].to_sym]
|
50
|
-
conf.nil? ? DEFAULT : conf
|
51
|
-
end
|
1
|
+
################################################################################
|
2
|
+
# EasyAppHelper
|
3
|
+
#
|
4
|
+
# Copyright (c) 2013 L.Briais under MIT license
|
5
|
+
# http://opensource.org/licenses/MIT
|
6
|
+
################################################################################
|
7
|
+
|
8
|
+
# Possible places regarding the OS
|
9
|
+
# TODO: Add equivalent for Mac
|
10
|
+
class EasyAppHelper::Core::Config::Places
|
11
|
+
module Unix
|
12
|
+
# Where could be stored admin configuration that rules all EasyAppHelper
|
13
|
+
# based applications.
|
14
|
+
POSSIBLE_PLACES = {
|
15
|
+
|
16
|
+
system: ["/etc"],
|
17
|
+
|
18
|
+
# Where could be stored global wide configuration
|
19
|
+
global: ["/etc",
|
20
|
+
"/usr/local/etc"],
|
21
|
+
|
22
|
+
# Where could be stored user configuration
|
23
|
+
user: ["#{ENV['HOME']}/.config"]
|
24
|
+
}
|
25
|
+
end
|
26
|
+
|
27
|
+
module Windows
|
28
|
+
# Where could be stored admin configuration that rules all EasyAppHelper
|
29
|
+
# based applications.
|
30
|
+
POSSIBLE_PLACES = {
|
31
|
+
|
32
|
+
system: ["#{ENV['systemRoot']}/Config"],
|
33
|
+
|
34
|
+
# Where could be stored global configuration
|
35
|
+
global: ['C:/Windows/Config',
|
36
|
+
"#{ENV['ALLUSERSPROFILE']}/Application Data"],
|
37
|
+
|
38
|
+
# Where could be stored user configuration
|
39
|
+
user: [ENV['APPDATA']]
|
40
|
+
}
|
41
|
+
end
|
42
|
+
|
43
|
+
CONF ={
|
44
|
+
mingw32: Windows
|
45
|
+
}
|
46
|
+
DEFAULT = Unix
|
47
|
+
|
48
|
+
def self.get_OS_module
|
49
|
+
conf = CONF[RbConfig::CONFIG['target_os'].to_sym]
|
50
|
+
conf.nil? ? DEFAULT : conf
|
51
|
+
end
|
52
52
|
end
|
@@ -1,68 +1,68 @@
|
|
1
|
-
################################################################################
|
2
|
-
# EasyAppHelper
|
3
|
-
#
|
4
|
-
# Copyright (c) 2013 L.Briais under MIT license
|
5
|
-
# http://opensource.org/licenses/MIT
|
6
|
-
################################################################################
|
7
|
-
|
8
|
-
module EasyAppHelper::Core
|
9
|
-
|
10
|
-
end
|
11
|
-
|
12
|
-
require 'easy_app_helper/core/logger'
|
13
|
-
require 'easy_app_helper/core/base'
|
14
|
-
require 'easy_app_helper/core/config'
|
15
|
-
|
16
|
-
# This module contains the exposed methods of the framework
|
17
|
-
# It is included and extended into EasyAppHelper
|
18
|
-
module EasyAppHelper::ModuleManager
|
19
|
-
|
20
|
-
# @return [EasyAppHelper::Core::Logger] The application logger
|
21
|
-
def logger
|
22
|
-
@@logger
|
23
|
-
end
|
24
|
-
|
25
|
-
# @return [EasyAppHelper::Core::Config] The application config
|
26
|
-
def config
|
27
|
-
@@config
|
28
|
-
end
|
29
|
-
|
30
|
-
# Convenient method that logs at info level, but also outputs the message to STDOUT if
|
31
|
-
# verbose is set in the config.
|
32
|
-
# @param [String] msg to be displayed
|
33
|
-
def puts_and_logs(msg)
|
34
|
-
@@logger.puts_and_logs msg
|
35
|
-
end
|
36
|
-
|
37
|
-
# Method to do something (expects a block) unless --simulate is specified on the command line.
|
38
|
-
# See {EasyAppHelper::Core::Base#safely_exec original implementation}.
|
39
|
-
def safely_exec(message, *args, &block)
|
40
|
-
@@config.safely_exec message, *args, &block
|
41
|
-
end
|
42
|
-
|
43
|
-
|
44
|
-
def self.included(base)
|
45
|
-
init_core_modules
|
46
|
-
base.extend self
|
47
|
-
end
|
48
|
-
|
49
|
-
################################################################################
|
50
|
-
private
|
51
|
-
|
52
|
-
def self.init_logger
|
53
|
-
@@logger ||= EasyAppHelper::Core::Logger.instance
|
54
|
-
@@logger
|
55
|
-
end
|
56
|
-
|
57
|
-
def self.init_config
|
58
|
-
@@config ||= EasyAppHelper::Core::Config.new @@logger
|
59
|
-
@@logger.set_app_config(@@config)
|
60
|
-
@@config
|
61
|
-
end
|
62
|
-
|
63
|
-
def self.init_core_modules
|
64
|
-
init_logger
|
65
|
-
init_config
|
66
|
-
end
|
67
|
-
|
1
|
+
################################################################################
|
2
|
+
# EasyAppHelper
|
3
|
+
#
|
4
|
+
# Copyright (c) 2013 L.Briais under MIT license
|
5
|
+
# http://opensource.org/licenses/MIT
|
6
|
+
################################################################################
|
7
|
+
|
8
|
+
module EasyAppHelper::Core
|
9
|
+
|
10
|
+
end
|
11
|
+
|
12
|
+
require 'easy_app_helper/core/logger'
|
13
|
+
require 'easy_app_helper/core/base'
|
14
|
+
require 'easy_app_helper/core/config'
|
15
|
+
|
16
|
+
# This module contains the exposed methods of the framework
|
17
|
+
# It is included and extended into EasyAppHelper
|
18
|
+
module EasyAppHelper::ModuleManager
|
19
|
+
|
20
|
+
# @return [EasyAppHelper::Core::Logger] The application logger
|
21
|
+
def logger
|
22
|
+
@@logger
|
23
|
+
end
|
24
|
+
|
25
|
+
# @return [EasyAppHelper::Core::Config] The application config
|
26
|
+
def config
|
27
|
+
@@config
|
28
|
+
end
|
29
|
+
|
30
|
+
# Convenient method that logs at info level, but also outputs the message to STDOUT if
|
31
|
+
# verbose is set in the config.
|
32
|
+
# @param [String] msg to be displayed
|
33
|
+
def puts_and_logs(msg)
|
34
|
+
@@logger.puts_and_logs msg
|
35
|
+
end
|
36
|
+
|
37
|
+
# Method to do something (expects a block) unless --simulate is specified on the command line.
|
38
|
+
# See {EasyAppHelper::Core::Base#safely_exec original implementation}.
|
39
|
+
def safely_exec(message, *args, &block)
|
40
|
+
@@config.safely_exec message, *args, &block
|
41
|
+
end
|
42
|
+
|
43
|
+
|
44
|
+
def self.included(base)
|
45
|
+
init_core_modules
|
46
|
+
base.extend self
|
47
|
+
end
|
48
|
+
|
49
|
+
################################################################################
|
50
|
+
private
|
51
|
+
|
52
|
+
def self.init_logger
|
53
|
+
@@logger ||= EasyAppHelper::Core::Logger.instance
|
54
|
+
@@logger
|
55
|
+
end
|
56
|
+
|
57
|
+
def self.init_config
|
58
|
+
@@config ||= EasyAppHelper::Core::Config.new @@logger
|
59
|
+
@@logger.set_app_config(@@config)
|
60
|
+
@@config
|
61
|
+
end
|
62
|
+
|
63
|
+
def self.init_core_modules
|
64
|
+
init_logger
|
65
|
+
init_config
|
66
|
+
end
|
67
|
+
|
68
68
|
end
|