easy_app_helper 0.0.9 → 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.
@@ -1,88 +0,0 @@
1
- ################################################################################
2
- # EasyAppHelper
3
- #
4
- # Copyright (c) 2013 L.Briais under MIT license
5
- # http://opensource.org/licenses/MIT
6
- ################################################################################
7
-
8
- require 'singleton'
9
- require 'logger'
10
-
11
- ##
12
- # This contains very basic default values and methods.
13
- #
14
- module EasyAppHelper::Common
15
-
16
- # Default log-level
17
- DEFAULT_LOG_LEVEL = Logger::Severity::WARN
18
-
19
- def self.override_config(h1, h2)
20
- EasyAppHelper::Common::HashesMergePolicies.merge_hashes_second_level h1, h2
21
- end
22
-
23
- end
24
-
25
-
26
- # Ancestor of all module instanciators.
27
- module EasyAppHelper::Common::Instanciator
28
- # Default module priority
29
- MODULE_PRIORITY = 10000
30
-
31
- def self.add_cmd_line_options(app, opt)
32
- # Does nothing
33
- end
34
-
35
- def self.provides_config(app, script_filename, app_name, app_description, app_version)
36
- # Does nothing
37
- {}
38
- end
39
-
40
- def self.post_config_action(app)
41
- # Does nothing
42
- end
43
- end
44
-
45
-
46
-
47
-
48
-
49
- # This guy will never log something anywhere... :)
50
- # It mays be used as the logger until someone replaces by a real one
51
- # EasyAppHelper::Logger would do that efficiently
52
- class EasyAppHelper::Common::DummyLogger
53
- include Singleton
54
- def method_missing(method_name, *args, &block)
55
- # Do nothing !
56
- end
57
- end
58
-
59
- # Implements different merge policies for the configs.
60
- module EasyAppHelper::Common::HashesMergePolicies
61
- # Performs a merge at the second level of hashes.
62
- # simple entries and arrays are overriden.
63
- def self.merge_hashes_second_level(h1, h2)
64
- h2.each do |key, v|
65
- if h1[key] and h1[key].is_a?(Hash)
66
- # Merges hashes
67
- h1[key].merge! h2[key]
68
- else
69
- # Overrides the rest
70
- h1[key] = h2[key] unless h2[key].nil?
71
- end
72
- end
73
- h1
74
- end
75
-
76
- # Uses the standard "merge!" method
77
- def self.simple_merge(h1, h2)
78
- h1.merge! h2
79
- end
80
-
81
- # Brutal override
82
- def self.complete_override(h1, h2)
83
- h1 = nil
84
- h1 = h2
85
-
86
- end
87
-
88
- end
@@ -1,129 +0,0 @@
1
- ################################################################################
2
- # EasyAppHelper
3
- #
4
- # Copyright (c) 2013 L.Briais under MIT license
5
- # http://opensource.org/licenses/MIT
6
- ################################################################################
7
-
8
- # Config file format
9
- require 'yaml'
10
-
11
- # This module defines:
12
- # - Some basic command line options(see --help), with their underlying
13
- # mechanism.
14
- # - A mechanism (based on Slop) to add your own command line options.
15
- # - A generated inline help.
16
- # This module provides the following 5 levels of configuration:
17
- # - Admin wide YAML config file, for options common to all your EasyAppHelper applications.
18
- # - System wide YAML config file.
19
- # - User YAML config file.
20
- # These 3 levels depends on you OS (see EasyAppHelper::Config::Places).
21
- # - Command line options.
22
- # - Command line supplied YAML config file(any option defined here will override the previous).
23
- # All these 5 levels of configuration override with consistent override mechanism.
24
- # Config files are in YAML but can have different extensions.
25
- module EasyAppHelper::Config
26
-
27
- include EasyAppHelper::Common
28
-
29
- # If the option --config-file has been specified, it will be loaded and override
30
- # current configuration according to rules
31
- def load_custom_config
32
- end
33
-
34
- end
35
-
36
-
37
- module EasyAppHelper::Config::Instanciator
38
- extend EasyAppHelper::Common::Instanciator
39
-
40
- # Default module priority
41
- MODULE_PRIORITY = 10
42
- ADMIN_CONFIG_FILENAME = EasyAppHelper.name
43
-
44
- # include paths specific to the OS
45
- include EasyAppHelper::Config::Places.get_OS_module
46
-
47
- # Potential extensions a config file can have
48
- CONFIG_FILE_POSSIBLE_EXTENSIONS = ['conf', 'yml', 'cfg', 'yaml', 'CFG', 'YML', 'YAML', 'Yaml']
49
-
50
- # Adds a command line options for this module.
51
- # - +--config-file+ +filename+ To specify a config file from the command line.
52
- def self.add_cmd_line_options(app, slop_definition)
53
- slop_definition.separator "\n-- Configuration options -------------------------------------"
54
- slop_definition.on 'config-file', 'Specify a config file.', :argument => true
55
- end
56
-
57
-
58
- # Loads the configuration files (admin, system, user).
59
- #
60
- # Config files may define any type of structure supported by YAML.
61
- # The override policy is that, if an entry in the config is a hash and the next
62
- # level defines the same hash, they are merged.
63
- # For any other type (scalar, array), the overrider... overrides ;)
64
- #
65
- # Config files can be at different places and have different extensions (see
66
- # CONFIG_FILE_POSSIBLE_EXTENSIONS). They have the same base name as the script_filename.
67
- def self.provides_config(app, script_filename, app_name, app_description, app_version)
68
- config = load_admin_wide_config app
69
- config = EasyAppHelper::Common.override_config config, load_system_wide_config(app, script_filename)
70
- EasyAppHelper::Common.override_config config, load_user_config(app, script_filename)
71
- end
72
-
73
- def self.post_config_action(app)
74
- return unless app.app_config[:'config-file']
75
- begin
76
- app.app_config = EasyAppHelper::Common.override_config app.app_config, load_config_file(app, app.app_config[:'config-file'])
77
- rescue => e
78
- app.logger.error "Problem with \"#{app.app_config[:'config-file']}\" config file!\n#{e.message}\nIgnoring..."
79
- end
80
- end
81
-
82
- ################################################################################
83
- private
84
-
85
- # Reads config from admin config file.
86
- def self.load_admin_wide_config(app)
87
- load_config_file app, find_file(app, ADMIN_CONFIG_POSSIBLE_PLACES, ADMIN_CONFIG_FILENAME)
88
- end
89
-
90
- # Reads config from system config file.
91
- def self.load_system_wide_config(app, script_filename)
92
- load_config_file app, find_file(app, SYSTEM_CONFIG_POSSIBLE_PLACES, script_filename)
93
- end
94
-
95
- # Reads config from user config file.
96
- def self.load_user_config(app, script_filename)
97
- load_config_file app, find_file(app, USER_CONFIG_POSSIBLE_PLACES, script_filename)
98
- end
99
-
100
- # Loads a config file.
101
- def self.load_config_file(app, conf_filename)
102
- conf = {}
103
- return conf if conf_filename.nil?
104
- # A file exists
105
- begin
106
- app.logger.debug "Loading config file \"#{conf_filename}\""
107
- conf = Hash[YAML::load(open(conf_filename)).map { |k, v| [k.to_sym, v] }]
108
- rescue => e
109
- app.logger.error "Invalid config file \"#{conf_filename}\". Not respecting YAML syntax!\n#{e.message}"
110
- end
111
- conf
112
- end
113
-
114
- # Tries to find config files according to places (array) given and possible extensions
115
- def self.find_file(app, places, filename)
116
- places.each do |dir|
117
- CONFIG_FILE_POSSIBLE_EXTENSIONS.each do |ext|
118
- filename_with_path = dir + '/' + filename + '.' + ext
119
- if File.exists? filename_with_path
120
- return filename_with_path
121
- else
122
- app.logger.debug "Trying \"#{filename_with_path}\" as config file."
123
- end
124
- end
125
- end
126
- nil
127
- end
128
-
129
- end
@@ -1,104 +0,0 @@
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
-
10
-
11
- # This module provides access to logger(Logger) fully configured according to command line options
12
- # or config files.
13
- #
14
- # It will replace the stupid EasyAppHelper::Common::DummyLogger if the
15
- # module is included.
16
- #
17
- # It brings as well some command line options to manipulate debug.
18
- # See --help
19
- module EasyAppHelper::Logger
20
-
21
- # This module has the highest priority in order to be processed the first by
22
- # the framework and therefore give a chance to other modules to use it to log.
23
- MODULE_PRIORITY = 1
24
-
25
- include EasyAppHelper::Common
26
-
27
-
28
- # Returns the current log_level.
29
- def log_level
30
- app_config[:"log-level"]
31
- end
32
-
33
- # Enables to hot-change the log level.
34
- def log_level=(level)
35
- app_config[:"log-level"] = level
36
- logger.level = level
37
- end
38
-
39
- def logger=(logger)
40
- @logger = logger
41
- end
42
-
43
- # Displays the message according to application verbosity and logs it as info.
44
- def puts_and_logs(msg)
45
- puts msg if app_config[:verbose]
46
- logger.info(msg)
47
- end
48
-
49
-
50
- end
51
-
52
-
53
- module EasyAppHelper::Logger::Instanciator
54
- extend EasyAppHelper::Common::Instanciator
55
-
56
- # Default module priority
57
- MODULE_PRIORITY = 1
58
-
59
- # Adds some command line options for this module.
60
- # - +--debug+
61
- # - +--debug-on-err+ to have the debugging going to STDERR. Should be used on top of
62
- # --debug.
63
- # - +--log-file+ +filename+ To log to a specific file.
64
- # - +--log-level+ +0-5+ Log level according to Logger::Severity
65
- def self.add_cmd_line_options(app, slop_definition)
66
- slop_definition.separator "\n-- Debug and logging options ---------------------------------"
67
- slop_definition.on :debug, 'Run in debug mode.', :argument => false
68
- slop_definition.on 'debug-on-err', 'Run in debug mode with output to stderr.', :argument => false
69
- slop_definition.on 'log-level', "Log level from 0 to 5, default #{EasyAppHelper::Common::DEFAULT_LOG_LEVEL}.", :argument => true, :as => Integer
70
- slop_definition.on 'log-file', 'File to log to.', :argument => true
71
- end
72
-
73
- # Creates the application logger
74
- def self.post_config_action(app)
75
- # Build logger for the application. Depending on config may end-up up to nowhere
76
- # (by default), STDOUT, STDERR or a file. See --help or EasyAppHelper::Config#help
77
- # for all options.
78
- @logger = EasyAppHelper::Common::DummyLogger.instance
79
- issue_report = nil
80
- if app.app_config[:debug]
81
- unless app.app_config[:"log-file"].nil?
82
- begin
83
- if File.exists? app.app_config[:"log-file"]
84
- logger_type = File.open(app.app_config[:"log-file"], File::WRONLY | File::APPEND)
85
- else
86
- logger_type = File.open(app.app_config[:"log-file"], File::WRONLY | File::CREAT)
87
- end
88
- rescue Exception => e
89
- logger_type = STDOUT
90
- issue_report = e.message
91
- end
92
- else
93
- logger_type = STDOUT
94
- end
95
- logger_type = STDERR if app.app_config[:"debug-on-err"]
96
- app.logger = Logger.new(logger_type)
97
- end
98
- app.app_config[:'log-level'] = EasyAppHelper::Common::DEFAULT_LOG_LEVEL if app.app_config[:'log-level'].nil?
99
- app.logger.level = app.app_config[:"log-level"]
100
- app.logger.error issue_report if issue_report
101
- app.logger.debug "Logger is created."
102
- end
103
-
104
- end
@@ -1,42 +0,0 @@
1
-
2
- module EasyAppHelper
3
- module Config
4
- module UnixPlaces
5
- # Where could be stored admin configuration that rules all EasyAppHelper
6
- # based applications.
7
- ADMIN_CONFIG_POSSIBLE_PLACES = ["/etc"]
8
-
9
- # Where could be stored system wide configuration
10
- SYSTEM_CONFIG_POSSIBLE_PLACES = ["/etc",
11
- "/usr/local/etc"]
12
-
13
- # Where could be stored user configuration
14
- USER_CONFIG_POSSIBLE_PLACES = ["#{ENV['HOME']}/.config"]
15
- end
16
-
17
- module WindowsPlaces
18
- # Where could be stored admin configuration that rules all EasyAppHelper
19
- # based applications.
20
- ADMIN_CONFIG_POSSIBLE_PLACES = ["#{ENV['systemRoot']}/Config"]
21
-
22
- # Where could be stored system wide configuration
23
- SYSTEM_CONFIG_POSSIBLE_PLACES = ['C:/Windows/Config', "#{ENV['ALLUSERSPROFILE']}/Application Data"]
24
-
25
- # Where could be stored user configuration
26
- USER_CONFIG_POSSIBLE_PLACES = [ENV['APPDATA']]
27
- end
28
-
29
- module Places
30
- CONF ={
31
- mingw32: EasyAppHelper::Config::WindowsPlaces
32
- }
33
- DEFAULT = EasyAppHelper::Config::UnixPlaces
34
-
35
- def self.get_OS_module
36
- conf = CONF[RbConfig::CONFIG['target_os'].to_sym]
37
- conf.nil? ? DEFAULT : conf
38
- end
39
- end
40
- end
41
- end
42
-