dev_suite 0.2.4 → 0.2.5
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile +2 -0
- data/Gemfile.lock +1 -1
- data/README.md +53 -0
- data/dev_suite.gemspec +0 -4
- data/lib/dev_suite/cli/commands/base.rb +0 -2
- data/lib/dev_suite/cli/commands/tree.rb +3 -3
- data/lib/dev_suite/cli/commands/version.rb +1 -1
- data/lib/dev_suite/cli/main.rb +1 -1
- data/lib/dev_suite/dev_suite.rb +12 -0
- data/lib/dev_suite/directory_tree/config/config.rb +11 -0
- data/lib/dev_suite/directory_tree/config/configuration.rb +21 -0
- data/lib/dev_suite/directory_tree/config.rb +2 -36
- data/lib/dev_suite/directory_tree/directory_tree.rb +0 -1
- data/lib/dev_suite/directory_tree/renderer/base.rb +0 -6
- data/lib/dev_suite/performance/analyzer.rb +1 -1
- data/lib/dev_suite/performance/config/config.rb +11 -0
- data/lib/dev_suite/performance/config/configuration.rb +30 -0
- data/lib/dev_suite/performance/config.rb +2 -30
- data/lib/dev_suite/performance/{reportor → reporter}/base.rb +1 -1
- data/lib/dev_suite/performance/{reportor → reporter}/helpers/stat_mappings.rb +1 -1
- data/lib/dev_suite/performance/{reportor → reporter}/helpers/table_builder.rb +1 -1
- data/lib/dev_suite/performance/{reportor → reporter}/helpers.rb +1 -1
- data/lib/dev_suite/performance/{reportor → reporter}/simple.rb +1 -1
- data/lib/dev_suite/performance/reporter.rb +22 -0
- data/lib/dev_suite/performance.rb +1 -1
- data/lib/dev_suite/request_logger/adapter/adapter.rb +27 -0
- data/lib/dev_suite/request_logger/adapter/base.rb +17 -0
- data/lib/dev_suite/request_logger/adapter/net_http.rb +42 -0
- data/lib/dev_suite/request_logger/adapter.rb +9 -0
- data/lib/dev_suite/request_logger/config/config.rb +11 -0
- data/lib/dev_suite/request_logger/config/configuration.rb +24 -0
- data/lib/dev_suite/request_logger/config.rb +9 -0
- data/lib/dev_suite/request_logger/logger.rb +93 -0
- data/lib/dev_suite/request_logger/request_logger.rb +29 -0
- data/lib/dev_suite/request_logger.rb +7 -0
- data/lib/dev_suite/utils/color/color.rb +12 -0
- data/lib/dev_suite/utils/color/config/config.rb +13 -0
- data/lib/dev_suite/utils/color/config/configuration.rb +31 -0
- data/lib/dev_suite/utils/color/config.rb +2 -31
- data/lib/dev_suite/utils/color/strategy/theme.rb +6 -7
- data/lib/dev_suite/utils/color/strategy.rb +2 -4
- data/lib/dev_suite/utils/color.rb +1 -4
- data/lib/dev_suite/utils/construct/config/attribute/attribute.rb +15 -0
- data/lib/dev_suite/utils/construct/config/attribute/manager.rb +63 -0
- data/lib/dev_suite/utils/construct/config/attribute/resolver.rb +31 -0
- data/lib/dev_suite/utils/construct/config/attribute/validator.rb +55 -0
- data/lib/dev_suite/utils/construct/config/attribute.rb +13 -0
- data/lib/dev_suite/utils/construct/config/base.rb +20 -0
- data/lib/dev_suite/utils/construct/config/config.rb +24 -0
- data/lib/dev_suite/utils/construct/config/configuration.rb +13 -0
- data/lib/dev_suite/utils/construct/config/hook/hook.rb +13 -0
- data/lib/dev_suite/utils/construct/config/hook/manager.rb +36 -0
- data/lib/dev_suite/utils/construct/config/hook.rb +13 -0
- data/lib/dev_suite/utils/construct/config/initializer.rb +21 -0
- data/lib/dev_suite/utils/construct/config/manager.rb +33 -0
- data/lib/dev_suite/utils/construct/config/settings/base.rb +59 -0
- data/lib/dev_suite/utils/construct/config/settings/manager.rb +38 -0
- data/lib/dev_suite/utils/construct/config/settings/settings.rb +14 -0
- data/lib/dev_suite/utils/construct/config/settings.rb +13 -0
- data/lib/dev_suite/utils/construct/config.rb +11 -0
- data/lib/dev_suite/utils/construct/construct.rb +9 -0
- data/lib/dev_suite/utils/construct.rb +16 -0
- data/lib/dev_suite/utils/emoji.rb +71 -0
- data/lib/dev_suite/utils/error_handler.rb +24 -0
- data/lib/dev_suite/utils/file_loader/config/config.rb +13 -0
- data/lib/dev_suite/utils/file_loader/config/configuration.rb +33 -0
- data/lib/dev_suite/utils/file_loader/config.rb +11 -0
- data/lib/dev_suite/utils/file_loader/file_loader.rb +23 -0
- data/lib/dev_suite/utils/file_loader/loader/base.rb +21 -0
- data/lib/dev_suite/utils/file_loader/loader/json.rb +21 -0
- data/lib/dev_suite/utils/file_loader/loader/text.rb +21 -0
- data/lib/dev_suite/utils/file_loader/loader/yaml.rb +38 -0
- data/lib/dev_suite/utils/file_loader/loader.rb +41 -0
- data/lib/dev_suite/utils/file_loader/loader_manager.rb +34 -0
- data/lib/dev_suite/utils/file_loader/loader_registry.rb +36 -0
- data/lib/dev_suite/utils/file_loader.rb +9 -0
- data/lib/dev_suite/utils/logger.rb +58 -0
- data/lib/dev_suite/utils/path_matcher/matcher.rb +31 -0
- data/lib/dev_suite/utils/path_matcher/path_matcher.rb +17 -0
- data/lib/dev_suite/utils/path_matcher/pattern.rb +35 -0
- data/lib/dev_suite/utils/path_matcher.rb +9 -0
- data/lib/dev_suite/utils/table/config/config.rb +13 -0
- data/lib/dev_suite/utils/table/config/configuration.rb +32 -0
- data/lib/dev_suite/utils/table/config.rb +2 -23
- data/lib/dev_suite/utils/table/renderer/base.rb +0 -6
- data/lib/dev_suite/utils/table/renderer/simple.rb +9 -5
- data/lib/dev_suite/utils/table/renderer.rb +2 -2
- data/lib/dev_suite/utils/table/table.rb +6 -0
- data/lib/dev_suite/utils/table.rb +0 -6
- data/lib/dev_suite/utils/utils.rb +14 -0
- data/lib/dev_suite/utils.rb +1 -3
- data/lib/dev_suite/version.rb +1 -1
- data/lib/dev_suite.rb +1 -10
- metadata +68 -44
- data/lib/dev_suite/directory_tree/settings.rb +0 -18
- data/lib/dev_suite/emoji.rb +0 -33
- data/lib/dev_suite/error_handler.rb +0 -22
- data/lib/dev_suite/logger.rb +0 -56
- data/lib/dev_suite/performance/reportor.rb +0 -22
- data/lib/dev_suite/utils/config_tools/configuration.rb +0 -134
- data/lib/dev_suite/utils/config_tools/settings.rb +0 -67
- data/lib/dev_suite/utils/config_tools.rb +0 -10
- data/lib/dev_suite/utils/table/settings.rb +0 -34
@@ -0,0 +1,59 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module DevSuite
|
4
|
+
module Utils
|
5
|
+
module Construct
|
6
|
+
module Config
|
7
|
+
module Settings
|
8
|
+
class Base
|
9
|
+
def initialize(settings = {})
|
10
|
+
@default_settings = settings
|
11
|
+
@settings = merge_settings(@default_settings, settings)
|
12
|
+
end
|
13
|
+
|
14
|
+
def set(*keys, value)
|
15
|
+
key_path = normalize_keys(keys)
|
16
|
+
last_key = key_path.pop
|
17
|
+
target = key_path.each_with_object(@settings) do |key, nested|
|
18
|
+
nested[key] ||= {}
|
19
|
+
end
|
20
|
+
target[last_key] = value
|
21
|
+
end
|
22
|
+
|
23
|
+
def get(*keys)
|
24
|
+
key_path = normalize_keys(keys)
|
25
|
+
key_path.reduce(@settings) do |nested, key|
|
26
|
+
nested.is_a?(Hash) ? nested[key] : nil
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
def reset!
|
31
|
+
@settings = @default_settings
|
32
|
+
end
|
33
|
+
|
34
|
+
private
|
35
|
+
|
36
|
+
def normalize_keys(keys)
|
37
|
+
key_path = keys.flatten
|
38
|
+
if key_path.size == 1 && key_path.first.is_a?(String)
|
39
|
+
key_path.first.to_s.split(".").map(&:to_sym)
|
40
|
+
else
|
41
|
+
key_path.map(&:to_sym)
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
def merge_settings(defaults, overrides)
|
46
|
+
defaults.merge(overrides) do |_key, oldval, newval|
|
47
|
+
if oldval.is_a?(Hash) && newval.is_a?(Hash)
|
48
|
+
merge_settings(oldval, newval)
|
49
|
+
else
|
50
|
+
newval
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
@@ -0,0 +1,38 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module DevSuite
|
4
|
+
module Utils
|
5
|
+
module Construct
|
6
|
+
module Config
|
7
|
+
module Settings
|
8
|
+
module Manager
|
9
|
+
class << self
|
10
|
+
def included(base)
|
11
|
+
base.extend(ClassMethods)
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
module ClassMethods
|
16
|
+
# Ensure that default configuration attributes are applied to subclasses.
|
17
|
+
def inherited(subclass)
|
18
|
+
subclass.set_default_settings
|
19
|
+
super
|
20
|
+
end
|
21
|
+
|
22
|
+
# Define default settings for the class.
|
23
|
+
def set_default_settings(settings = {})
|
24
|
+
config_attr(:settings, default_value: settings, type: :hash, resolver: :resolve_settings)
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
private
|
29
|
+
|
30
|
+
def resolve_settings(value)
|
31
|
+
Base.new(value)
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module DevSuite
|
4
|
+
module Utils
|
5
|
+
module Construct
|
6
|
+
# The Construct module serves as a namespace for reusable constructs that
|
7
|
+
# provide foundational utilities, such as configuration management, which
|
8
|
+
# can be included in other modules throughout the DevSuite framework.
|
9
|
+
#
|
10
|
+
# This module centralizes shared functionality to promote code reuse,
|
11
|
+
# maintainability, and consistency across different modules.
|
12
|
+
|
13
|
+
require_relative "construct/construct"
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,71 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module DevSuite
|
4
|
+
module Utils
|
5
|
+
module Emoji
|
6
|
+
# Status-related emojis
|
7
|
+
STATUS = {
|
8
|
+
start: "🚀",
|
9
|
+
success: "✅",
|
10
|
+
error: "🚨❌",
|
11
|
+
retry: "💥",
|
12
|
+
warning: "⚠️", # For warnings
|
13
|
+
caution: "🟡", # For caution or proceed with care
|
14
|
+
}.freeze
|
15
|
+
|
16
|
+
# Action-related emojis
|
17
|
+
ACTIONS = {
|
18
|
+
update: "🔄", # For updates or changes
|
19
|
+
fix: "🔧", # For fixes or repairs
|
20
|
+
bug: "🐞", # For bugs or issues
|
21
|
+
code: "💻", # For code or technical content
|
22
|
+
}.freeze
|
23
|
+
|
24
|
+
# Notification-related emojis
|
25
|
+
NOTIFICATIONS = {
|
26
|
+
info: "ℹ️",
|
27
|
+
important: "❗",
|
28
|
+
note: "📝", # For notes or annotations
|
29
|
+
tip: "💡", # For tips or helpful hints
|
30
|
+
}.freeze
|
31
|
+
|
32
|
+
# Resource-related emojis
|
33
|
+
RESOURCES = {
|
34
|
+
document: "📄", # For representing documents or files
|
35
|
+
network: "🌐", # For network-related logs
|
36
|
+
database: "💾", # For database-related logs
|
37
|
+
cache: "🗄️", # For cache-related logs
|
38
|
+
file: "📁", # For file-related logs
|
39
|
+
cookie: "🍪", # For cookie-related logs
|
40
|
+
header: "📑", # For header-related logs
|
41
|
+
request: "📤", # For request-related logs
|
42
|
+
response: "📥", # For response-related logs
|
43
|
+
}.freeze
|
44
|
+
|
45
|
+
DEFAULT_EMOJI = "❓"
|
46
|
+
|
47
|
+
EMOJIS = STATUS.merge(ACTIONS).merge(NOTIFICATIONS).merge(RESOURCES).freeze
|
48
|
+
|
49
|
+
class << self
|
50
|
+
# Returns the emoji corresponding to the given key.
|
51
|
+
# @param key [Symbol] the key to look up the emoji
|
52
|
+
# @param default [String] the default emoji if the key is not found
|
53
|
+
# @return [String] the corresponding emoji or the default emoji
|
54
|
+
def get(key, default: DEFAULT_EMOJI)
|
55
|
+
EMOJIS[key] || default
|
56
|
+
end
|
57
|
+
|
58
|
+
# Returns all emojis categorized by their purpose.
|
59
|
+
# @return [Hash] a hash containing all emojis organized by categories.
|
60
|
+
def all
|
61
|
+
{
|
62
|
+
status: STATUS,
|
63
|
+
actions: ACTIONS,
|
64
|
+
notifications: NOTIFICATIONS,
|
65
|
+
resources: RESOURCES,
|
66
|
+
}
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module DevSuite
|
4
|
+
module Utils
|
5
|
+
module ErrorHandler
|
6
|
+
extend self # This makes all instance methods behave like class methods
|
7
|
+
|
8
|
+
def handle_error(error)
|
9
|
+
Utils::Logger.log(
|
10
|
+
"Oops! An error occurred: #{error.message}",
|
11
|
+
level: :error,
|
12
|
+
emoji: :error,
|
13
|
+
)
|
14
|
+
Utils::Logger.log(
|
15
|
+
"For more information, please refer to the README: " \
|
16
|
+
"https://github.com/patrick204nqh/dev_suite",
|
17
|
+
level: :error,
|
18
|
+
emoji: :document,
|
19
|
+
)
|
20
|
+
# exit(1)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module DevSuite
|
4
|
+
module Utils
|
5
|
+
module FileLoader
|
6
|
+
module Config
|
7
|
+
class Configuration < BaseConfiguration
|
8
|
+
config_attr :loaders, default_value: [:text, :json, :yaml], type: :array
|
9
|
+
|
10
|
+
register_hook :after_initialize do
|
11
|
+
setup_registry
|
12
|
+
end
|
13
|
+
|
14
|
+
# Expose the registry as a read-only attribute
|
15
|
+
attr_reader :registry
|
16
|
+
|
17
|
+
# Setup the registry based on the current loaders
|
18
|
+
def setup_registry
|
19
|
+
@registry = LoaderRegistry.new
|
20
|
+
update_registry(loaders)
|
21
|
+
end
|
22
|
+
|
23
|
+
# Update the registry with the provided loaders
|
24
|
+
def update_registry(loaders)
|
25
|
+
@registry ||= LoaderRegistry.new
|
26
|
+
@registry.clear # Clear the existing registry
|
27
|
+
Loader.registry_loaders(@registry, loaders)
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module DevSuite
|
4
|
+
module Utils
|
5
|
+
module FileLoader
|
6
|
+
require "pathname"
|
7
|
+
require "json"
|
8
|
+
require "yaml"
|
9
|
+
|
10
|
+
require_relative "loader"
|
11
|
+
require_relative "loader_registry"
|
12
|
+
require_relative "loader_manager"
|
13
|
+
require_relative "config"
|
14
|
+
|
15
|
+
class << self
|
16
|
+
def load(path)
|
17
|
+
loader = LoaderManager.new
|
18
|
+
loader.load(path)
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module DevSuite
|
4
|
+
module Utils
|
5
|
+
module FileLoader
|
6
|
+
module Loader
|
7
|
+
class Base
|
8
|
+
class << self
|
9
|
+
def extensions
|
10
|
+
raise NotImplementedError, "You must implement the extensions method"
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
def load(_path)
|
15
|
+
raise NotImplementedError, "You must implement the load method"
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module DevSuite
|
4
|
+
module Utils
|
5
|
+
module FileLoader
|
6
|
+
module Loader
|
7
|
+
class Json < Base
|
8
|
+
class << self
|
9
|
+
def extensions
|
10
|
+
["json"]
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
def load(path)
|
15
|
+
::JSON.parse(::File.read(path))
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module DevSuite
|
4
|
+
module Utils
|
5
|
+
module FileLoader
|
6
|
+
module Loader
|
7
|
+
class Text < Base
|
8
|
+
class << self
|
9
|
+
def extensions
|
10
|
+
["txt"]
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
def load(path)
|
15
|
+
::File.read(path)
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,38 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module DevSuite
|
4
|
+
module Utils
|
5
|
+
module FileLoader
|
6
|
+
module Loader
|
7
|
+
class Yaml < Base
|
8
|
+
class << self
|
9
|
+
def extensions
|
10
|
+
["yml", "yaml"]
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
def load(path, safe: true)
|
15
|
+
validate_file_existence!(path)
|
16
|
+
parse_yaml_file(path, safe)
|
17
|
+
rescue ::Psych::SyntaxError => e
|
18
|
+
handle_yaml_parsing_error(path, e)
|
19
|
+
end
|
20
|
+
|
21
|
+
private
|
22
|
+
|
23
|
+
def validate_file_existence!(path)
|
24
|
+
raise "File not found: #{path}" unless ::File.exist?(path)
|
25
|
+
end
|
26
|
+
|
27
|
+
def parse_yaml_file(path, safe)
|
28
|
+
safe ? ::YAML.safe_load_file(path) : ::YAML.load_file(path)
|
29
|
+
end
|
30
|
+
|
31
|
+
def handle_yaml_parsing_error(path, error)
|
32
|
+
raise "YAML parsing error in file #{path}: #{error.message}"
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module DevSuite
|
4
|
+
module Utils
|
5
|
+
module FileLoader
|
6
|
+
module Loader
|
7
|
+
require_relative "loader/base"
|
8
|
+
require_relative "loader/text"
|
9
|
+
require_relative "loader/json"
|
10
|
+
require_relative "loader/yaml"
|
11
|
+
|
12
|
+
class << self
|
13
|
+
def registry_loaders(registry, loader_symbols)
|
14
|
+
loader_classes = map_loaders(loader_symbols)
|
15
|
+
loader_classes.each do |loader|
|
16
|
+
registry.register(loader)
|
17
|
+
end
|
18
|
+
registry
|
19
|
+
end
|
20
|
+
|
21
|
+
private
|
22
|
+
|
23
|
+
def map_loaders(loader_symbols)
|
24
|
+
loader_symbols.map do |symbol|
|
25
|
+
case symbol
|
26
|
+
when :json
|
27
|
+
Loader::Json
|
28
|
+
when :text
|
29
|
+
Loader::Text
|
30
|
+
when :yaml
|
31
|
+
Loader::Yaml
|
32
|
+
else
|
33
|
+
raise "Unknown loader: #{symbol}"
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module DevSuite
|
4
|
+
module Utils
|
5
|
+
module FileLoader
|
6
|
+
class LoaderManager
|
7
|
+
def load(path)
|
8
|
+
loader = find_loader_for(path)
|
9
|
+
loader.load(path)
|
10
|
+
end
|
11
|
+
|
12
|
+
private
|
13
|
+
|
14
|
+
def find_loader_for(path)
|
15
|
+
extension = extract_extension(path)
|
16
|
+
loader = registry.find_loader(extension)
|
17
|
+
raise LoaderNotFoundError, "No loader registered for #{extension}" unless loader
|
18
|
+
|
19
|
+
loader
|
20
|
+
end
|
21
|
+
|
22
|
+
def extract_extension(path)
|
23
|
+
::File.extname(path).delete_prefix(".")
|
24
|
+
end
|
25
|
+
|
26
|
+
def registry
|
27
|
+
Config.configuration.registry
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
class LoaderNotFoundError < StandardError; end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module DevSuite
|
4
|
+
module Utils
|
5
|
+
module FileLoader
|
6
|
+
class LoaderRegistry
|
7
|
+
def initialize
|
8
|
+
@registry = {}
|
9
|
+
end
|
10
|
+
|
11
|
+
def register(loader_class)
|
12
|
+
loader = loader_class.new
|
13
|
+
loader_class.extensions.each do |ext|
|
14
|
+
@registry[ext] = loader
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
def clear
|
19
|
+
@registry.clear
|
20
|
+
end
|
21
|
+
|
22
|
+
def find_loader(extension)
|
23
|
+
@registry[extension]
|
24
|
+
end
|
25
|
+
|
26
|
+
def registered_extensions
|
27
|
+
@registry.keys
|
28
|
+
end
|
29
|
+
|
30
|
+
def registered_loaders
|
31
|
+
@registry.values.uniq
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
@@ -0,0 +1,58 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module DevSuite
|
4
|
+
module Utils
|
5
|
+
module Logger
|
6
|
+
LOG_DETAILS = {
|
7
|
+
info: { prefix: "[INFO]", color: :green },
|
8
|
+
warn: { prefix: "[WARNING]", color: :yellow },
|
9
|
+
error: { prefix: "[ERROR]", color: :red },
|
10
|
+
debug: { prefix: "[DEBUG]", color: :blue },
|
11
|
+
}.freeze
|
12
|
+
|
13
|
+
class << self
|
14
|
+
# Logs a message with an optional emoji and specified log level.
|
15
|
+
#
|
16
|
+
# @param message [String] The message to log.
|
17
|
+
# @param level [Symbol] The log level (:info, :warn, :error, :debug).
|
18
|
+
# @param emoji [String, Symbol] Optional emoji to prepend to the message.
|
19
|
+
def log(message, level: :info, emoji: nil)
|
20
|
+
emoji_icon = resolve_emoji(emoji)
|
21
|
+
formatted_message = format_message("#{emoji_icon} #{message}", level)
|
22
|
+
output_log(formatted_message)
|
23
|
+
end
|
24
|
+
|
25
|
+
private
|
26
|
+
|
27
|
+
# Resolves the emoji, either from a symbol or directly as a string.
|
28
|
+
#
|
29
|
+
# @param emoji [String, Symbol, nil] The emoji or its symbol key.
|
30
|
+
# @return [String] The resolved emoji or an empty string if none is provided.
|
31
|
+
def resolve_emoji(emoji)
|
32
|
+
return "" unless emoji
|
33
|
+
|
34
|
+
emoji.is_a?(Symbol) ? Emoji.get(emoji) : emoji
|
35
|
+
end
|
36
|
+
|
37
|
+
# Formats the log message with the appropriate prefix and color.
|
38
|
+
#
|
39
|
+
# @param message [String] The message to format.
|
40
|
+
# @param level [Symbol] The log level (:info, :warn, :error, :debug).
|
41
|
+
# @return [String] The formatted log message.
|
42
|
+
def format_message(message, level)
|
43
|
+
details = LOG_DETAILS[level]
|
44
|
+
raise ArgumentError, "Invalid log level: #{level}" unless details
|
45
|
+
|
46
|
+
Utils::Color.colorize("#{details[:prefix]} #{message}", color: details[:color])
|
47
|
+
end
|
48
|
+
|
49
|
+
# Outputs the formatted log message to the console.
|
50
|
+
#
|
51
|
+
# @param formatted_message [String] The message to output.
|
52
|
+
def output_log(formatted_message)
|
53
|
+
puts formatted_message if formatted_message
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module DevSuite
|
4
|
+
module Utils
|
5
|
+
module PathMatcher
|
6
|
+
class Matcher
|
7
|
+
def initialize(includes: [], excludes: [])
|
8
|
+
@include_patterns = includes.map { |pattern| Pattern.new(pattern) }
|
9
|
+
@exclude_patterns = excludes.map { |pattern| Pattern.new(pattern) }
|
10
|
+
end
|
11
|
+
|
12
|
+
def match?(path)
|
13
|
+
return false if excluded?(path)
|
14
|
+
return true if included?(path)
|
15
|
+
|
16
|
+
false
|
17
|
+
end
|
18
|
+
|
19
|
+
private
|
20
|
+
|
21
|
+
def included?(path)
|
22
|
+
@include_patterns.empty? || @include_patterns.any? { |pattern| pattern.match?(path) }
|
23
|
+
end
|
24
|
+
|
25
|
+
def excluded?(path)
|
26
|
+
@exclude_patterns.any? { |pattern| pattern.match?(path) }
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module DevSuite
|
4
|
+
module Utils
|
5
|
+
module PathMatcher
|
6
|
+
require_relative "pattern"
|
7
|
+
require_relative "matcher"
|
8
|
+
|
9
|
+
class << self
|
10
|
+
def match?(path, includes: [], excludes: [])
|
11
|
+
matcher = Matcher.new(includes: includes, excludes: excludes)
|
12
|
+
matcher.match?(path)
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|