dev_suite 0.2.3 → 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/.github/workflows/ci.yml +37 -0
- data/Gemfile +13 -6
- data/Gemfile.lock +9 -1
- data/README.md +66 -2
- data/dev_suite.gemspec +1 -0
- data/lib/dev_suite/cli/commands/base.rb +0 -30
- data/lib/dev_suite/cli/commands/tree.rb +29 -8
- data/lib/dev_suite/cli/commands/version.rb +1 -1
- data/lib/dev_suite/cli/main.rb +12 -9
- 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 -11
- data/lib/dev_suite/directory_tree/directory_tree.rb +20 -0
- data/lib/dev_suite/directory_tree/renderer/base.rb +0 -6
- data/lib/dev_suite/directory_tree/renderer/simple.rb +3 -3
- data/lib/dev_suite/directory_tree/visualizer/base.rb +13 -0
- data/lib/dev_suite/directory_tree/visualizer/tree.rb +50 -0
- data/lib/dev_suite/directory_tree/visualizer.rb +14 -13
- data/lib/dev_suite/directory_tree.rb +1 -8
- 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 -10
- 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 -8
- metadata +72 -13
- data/lib/dev_suite/directory_tree/settings.rb +0 -29
- data/lib/dev_suite/performance/reportor.rb +0 -22
- data/lib/dev_suite/utils/config_tools/configuration.rb +0 -41
- data/lib/dev_suite/utils/config_tools/settings.rb +0 -75
- data/lib/dev_suite/utils/config_tools.rb +0 -10
- data/lib/dev_suite/utils/table/settings.rb +0 -34
@@ -0,0 +1,22 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module DevSuite
|
4
|
+
module Performance
|
5
|
+
module Reporter
|
6
|
+
require_relative "reporter/base"
|
7
|
+
require_relative "reporter/simple"
|
8
|
+
require_relative "reporter/helpers"
|
9
|
+
|
10
|
+
class << self
|
11
|
+
def create(reporter)
|
12
|
+
case reporter
|
13
|
+
when :simple
|
14
|
+
Simple.new
|
15
|
+
else
|
16
|
+
raise ArgumentError, "Invalid reporter: #{reporter}"
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -8,7 +8,7 @@ module DevSuite
|
|
8
8
|
require_relative "performance/data"
|
9
9
|
require_relative "performance/profiler"
|
10
10
|
require_relative "performance/profiler_manager"
|
11
|
-
require_relative "performance/
|
11
|
+
require_relative "performance/reporter"
|
12
12
|
require_relative "performance/analyzer"
|
13
13
|
require_relative "performance/config"
|
14
14
|
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module DevSuite
|
4
|
+
module RequestLogger
|
5
|
+
module Adapter
|
6
|
+
require "net/http"
|
7
|
+
|
8
|
+
require_relative "base"
|
9
|
+
require_relative "net_http"
|
10
|
+
|
11
|
+
class << self
|
12
|
+
def create(adapter)
|
13
|
+
case adapter
|
14
|
+
when :net_http
|
15
|
+
NetHttp.new
|
16
|
+
else
|
17
|
+
raise ArgumentError, "Adapter not found: #{adapter}"
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
def create_multiple(adapters)
|
22
|
+
adapters.map { |adapter| create(adapter) }
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module DevSuite
|
4
|
+
module RequestLogger
|
5
|
+
module Adapter
|
6
|
+
class NetHttp < Base
|
7
|
+
# Enables the logging of Net::HTTP requests by monkey patching the request method
|
8
|
+
def enable
|
9
|
+
::Net::HTTP.class_eval do
|
10
|
+
# Alias the original request method with a unique name (_original_request)
|
11
|
+
# This preserves the original functionality so it can still be called after logging is added
|
12
|
+
alias_method(:_original_request, :request)
|
13
|
+
|
14
|
+
# Override the request method to add logging functionality
|
15
|
+
def request(request, body = nil, &block)
|
16
|
+
# Log the full URL of the HTTP request using the DevSuite::Utils::Logger
|
17
|
+
Logger.log_request(self, request)
|
18
|
+
|
19
|
+
# Call the original request method (now aliased as _original_request) to perform the actual HTTP request
|
20
|
+
response = _original_request(request, body, &block)
|
21
|
+
|
22
|
+
# Optionally log the response details
|
23
|
+
Logger.log_response(self, response)
|
24
|
+
|
25
|
+
# Return the response object so that the calling code receives the expected result
|
26
|
+
response
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
# Disables the logging by restoring the original Net::HTTP request method
|
32
|
+
def disable
|
33
|
+
::Net::HTTP.class_eval do
|
34
|
+
# Restore the original request method by aliasing it back from _original_request
|
35
|
+
# This effectively removes the logging functionality and returns Net::HTTP to its original state
|
36
|
+
alias_method(:request, :_original_request)
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module DevSuite
|
4
|
+
module RequestLogger
|
5
|
+
module Config
|
6
|
+
class Configuration < BaseConfiguration
|
7
|
+
set_default_settings(
|
8
|
+
log_headers: true,
|
9
|
+
log_cookies: true,
|
10
|
+
log_body: true,
|
11
|
+
log_level: :debug,
|
12
|
+
)
|
13
|
+
|
14
|
+
config_attr :adapters, default_value: [:net_http], type: :array, resolver: :resolve_adapters
|
15
|
+
|
16
|
+
private
|
17
|
+
|
18
|
+
def resolve_adapters(value)
|
19
|
+
Adapter.create_multiple(value)
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,93 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module DevSuite
|
4
|
+
module RequestLogger
|
5
|
+
module Logger
|
6
|
+
class << self
|
7
|
+
def log_request(adapter, request)
|
8
|
+
log_entry(format_request_line(adapter, request), :start)
|
9
|
+
log_headers(request) if settings.get(:log_headers)
|
10
|
+
log_cookies(request) if settings.get(:log_cookies)
|
11
|
+
log_body(request.body, "Request") if settings.get(:log_body)
|
12
|
+
end
|
13
|
+
|
14
|
+
def log_response(adapter, response)
|
15
|
+
status_emoji = determine_status_emoji(response)
|
16
|
+
log_level = determine_log_level(response)
|
17
|
+
|
18
|
+
log_entry(format_response_line(adapter, response), status_emoji, log_level)
|
19
|
+
log_headers(response) if settings.get(:log_headers)
|
20
|
+
log_body(response.body, "Response") if settings.get(:log_body)
|
21
|
+
end
|
22
|
+
|
23
|
+
private
|
24
|
+
|
25
|
+
def config
|
26
|
+
Config.configuration
|
27
|
+
end
|
28
|
+
|
29
|
+
def settings
|
30
|
+
config.settings
|
31
|
+
end
|
32
|
+
|
33
|
+
def log_entry(message, emoji, level = settings.get(:log_level))
|
34
|
+
Utils::Logger.log(message, level: level, emoji: emoji)
|
35
|
+
end
|
36
|
+
|
37
|
+
def determine_status_emoji(response)
|
38
|
+
response_success?(response) ? :success : :error
|
39
|
+
end
|
40
|
+
|
41
|
+
def determine_log_level(response)
|
42
|
+
response_success?(response) ? settings.get(:log_level) : :error
|
43
|
+
end
|
44
|
+
|
45
|
+
def response_success?(response)
|
46
|
+
response.code.to_i.between?(200, 299)
|
47
|
+
end
|
48
|
+
|
49
|
+
def extract_headers(request)
|
50
|
+
request.each_header.to_h
|
51
|
+
end
|
52
|
+
|
53
|
+
def extract_cookies(request)
|
54
|
+
if request.respond_to?(:to_hash) && request.to_hash["cookie"]
|
55
|
+
request.to_hash["cookie"]
|
56
|
+
elsif request.respond_to?(:headers) && request.headers["Cookie"]
|
57
|
+
[request.headers["Cookie"]]
|
58
|
+
else
|
59
|
+
[]
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
def format_request_line(adapter, request)
|
64
|
+
"#{adapter.class} Request: #{request.method} #{request.uri}"
|
65
|
+
end
|
66
|
+
|
67
|
+
def format_response_line(adapter, response)
|
68
|
+
"#{adapter.class} Response: #{response.code} #{response.message}"
|
69
|
+
end
|
70
|
+
|
71
|
+
def log_headers(request)
|
72
|
+
headers = extract_headers(request)
|
73
|
+
log_entry("Headers: #{headers}", :document) unless headers.empty?
|
74
|
+
end
|
75
|
+
|
76
|
+
def log_cookies(request)
|
77
|
+
cookies = extract_cookies(request)
|
78
|
+
if cookies.any?
|
79
|
+
log_entry("Cookies: #{cookies.join("; ")}", :cookie)
|
80
|
+
else
|
81
|
+
log_entry("Cookies: None", :cookie)
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
def log_body(body, type)
|
86
|
+
return unless body && !body.empty?
|
87
|
+
|
88
|
+
log_entry("#{type} Body: #{body}", :code)
|
89
|
+
end
|
90
|
+
end
|
91
|
+
end
|
92
|
+
end
|
93
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module DevSuite
|
4
|
+
module RequestLogger
|
5
|
+
require_relative "config"
|
6
|
+
require_relative "adapter"
|
7
|
+
require_relative "logger"
|
8
|
+
|
9
|
+
class << self
|
10
|
+
def with_logging(&block)
|
11
|
+
enable_adapters
|
12
|
+
block.call
|
13
|
+
ensure
|
14
|
+
# Ensure that adapters are disabled even if an exception is raised
|
15
|
+
disable_adapters
|
16
|
+
end
|
17
|
+
|
18
|
+
private
|
19
|
+
|
20
|
+
def enable_adapters
|
21
|
+
Config.configuration.adapters.each(&:enable)
|
22
|
+
end
|
23
|
+
|
24
|
+
def disable_adapters
|
25
|
+
Config.configuration.adapters.each(&:disable)
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module DevSuite
|
4
|
+
module Utils
|
5
|
+
module Color
|
6
|
+
module Config
|
7
|
+
class Configuration < BaseConfiguration
|
8
|
+
config_attr :strategy,
|
9
|
+
default_value: :theme,
|
10
|
+
type: :symbol,
|
11
|
+
resolver: :resolve_strategy
|
12
|
+
|
13
|
+
config_attr :palette,
|
14
|
+
default_value: :default,
|
15
|
+
type: :symbol,
|
16
|
+
resolver: :resolve_palette
|
17
|
+
|
18
|
+
private
|
19
|
+
|
20
|
+
def resolve_strategy(value)
|
21
|
+
Strategy.create(value)
|
22
|
+
end
|
23
|
+
|
24
|
+
def resolve_palette(value)
|
25
|
+
Palette.create(value)
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
@@ -3,37 +3,8 @@
|
|
3
3
|
module DevSuite
|
4
4
|
module Utils
|
5
5
|
module Color
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
def initialize(strategy: :theme, palette: :default)
|
10
|
-
@palette = Palette.create(palette)
|
11
|
-
@strategy = Strategy.create(strategy, palette: @palette)
|
12
|
-
freeze # Make the instance of this class immutable as well
|
13
|
-
end
|
14
|
-
|
15
|
-
class << self
|
16
|
-
#
|
17
|
-
# Provide global access to a single instance of Config
|
18
|
-
#
|
19
|
-
def configuration
|
20
|
-
@configuration ||= new
|
21
|
-
end
|
22
|
-
|
23
|
-
# Allow block-based configuration
|
24
|
-
def configure
|
25
|
-
yield(configuration)
|
26
|
-
rescue StandardError => e
|
27
|
-
handle_configuration_error(e)
|
28
|
-
raise
|
29
|
-
end
|
30
|
-
|
31
|
-
private
|
32
|
-
|
33
|
-
def handle_configuration_error(error)
|
34
|
-
puts "Configuration error: #{error.message}"
|
35
|
-
end
|
36
|
-
end
|
6
|
+
module Config
|
7
|
+
require_relative "config/config"
|
37
8
|
end
|
38
9
|
end
|
39
10
|
end
|
@@ -5,17 +5,12 @@ module DevSuite
|
|
5
5
|
module Color
|
6
6
|
module Strategy
|
7
7
|
class Theme < Base
|
8
|
-
def initialize(palette)
|
9
|
-
super()
|
10
|
-
@palette = palette
|
11
|
-
end
|
12
|
-
|
13
8
|
def colorize(text, color: :default)
|
14
|
-
unless
|
9
|
+
unless palette.colors.key?(color)
|
15
10
|
raise ArgumentError, "Invalid color key"
|
16
11
|
end
|
17
12
|
|
18
|
-
color_code =
|
13
|
+
color_code = palette.colors[color]
|
19
14
|
|
20
15
|
unless valid_color_code?(color_code)
|
21
16
|
raise ArgumentError, "Invalid color code"
|
@@ -26,6 +21,10 @@ module DevSuite
|
|
26
21
|
|
27
22
|
private
|
28
23
|
|
24
|
+
def palette
|
25
|
+
Config.configuration.palette
|
26
|
+
end
|
27
|
+
|
29
28
|
def valid_color_code?(color_code)
|
30
29
|
color_code.is_a?(Integer) && color_code.between?(0, 255)
|
31
30
|
end
|
@@ -10,16 +10,14 @@ module DevSuite
|
|
10
10
|
require_relative "strategy/theme"
|
11
11
|
|
12
12
|
class << self
|
13
|
-
def create(type
|
13
|
+
def create(type)
|
14
14
|
case type
|
15
15
|
when :basic
|
16
16
|
Basic.new
|
17
17
|
when :rgb
|
18
18
|
Rgb.new
|
19
19
|
when :theme
|
20
|
-
|
21
|
-
|
22
|
-
Theme.new(palette)
|
20
|
+
Theme.new
|
23
21
|
else
|
24
22
|
raise ArgumentError, "Unknown strategy type: #{type}"
|
25
23
|
end
|
@@ -0,0 +1,63 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module DevSuite
|
4
|
+
module Utils
|
5
|
+
module Construct
|
6
|
+
module Config
|
7
|
+
module Attribute
|
8
|
+
module Manager
|
9
|
+
include Validator
|
10
|
+
include Resolver
|
11
|
+
|
12
|
+
class << self
|
13
|
+
def included(base)
|
14
|
+
base.extend(ClassMethods)
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
module ClassMethods
|
19
|
+
def config_attr(attr, default_value: nil, type: nil, resolver: nil)
|
20
|
+
config_attrs[attr] = { default_value: default_value, type: type, resolver: resolver }
|
21
|
+
define_config_attr_methods(attr)
|
22
|
+
end
|
23
|
+
|
24
|
+
def config_attrs
|
25
|
+
@config_attrs ||= {}
|
26
|
+
end
|
27
|
+
|
28
|
+
def config_attr_present?(attr)
|
29
|
+
config_attrs.key?(attr)
|
30
|
+
end
|
31
|
+
|
32
|
+
private
|
33
|
+
|
34
|
+
def define_config_attr_methods(attr)
|
35
|
+
define_method(attr) { instance_variable_get("@#{attr}") }
|
36
|
+
define_method("#{attr}=") do |value|
|
37
|
+
validate_and_set_config_attr(attr: attr, value: value)
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
private
|
43
|
+
|
44
|
+
def initialize_config_attrs
|
45
|
+
self.class.config_attrs.each do |attr, details|
|
46
|
+
send("#{attr}=", details[:default_value]) unless instance_variable_defined?("@#{attr}")
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
def validate_and_set_config_attr(attr:, value:)
|
51
|
+
attr_details = self.class.config_attrs[attr]
|
52
|
+
type, resolver = attr_details.values_at(:type, :resolver)
|
53
|
+
|
54
|
+
validate_config_attr_type!(attr: attr, value: value, type: type) if type
|
55
|
+
resolved_value = resolver ? resolve_config_attr(value: value, resolver: resolver) : value
|
56
|
+
instance_variable_set("@#{attr}", resolved_value)
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module DevSuite
|
4
|
+
module Utils
|
5
|
+
module Construct
|
6
|
+
module Config
|
7
|
+
module Attribute
|
8
|
+
module Resolver
|
9
|
+
extend self
|
10
|
+
|
11
|
+
# Resolves the value of an attribute based on its resolver.
|
12
|
+
# If no resolver is provided, the value is returned as is.
|
13
|
+
#
|
14
|
+
# @param value [Object] The value to resolve.
|
15
|
+
# @param resolver [Proc] The resolver to use for the attribute.
|
16
|
+
def resolve_config_attr(value:, resolver:)
|
17
|
+
case resolver
|
18
|
+
when Proc
|
19
|
+
resolver.call(value)
|
20
|
+
when Symbol
|
21
|
+
send(resolver, value)
|
22
|
+
else
|
23
|
+
value
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,55 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module DevSuite
|
4
|
+
module Utils
|
5
|
+
module Construct
|
6
|
+
module Config
|
7
|
+
module Attribute
|
8
|
+
module Validator
|
9
|
+
extend self
|
10
|
+
|
11
|
+
# Validates an attribute's value based on its type.
|
12
|
+
#
|
13
|
+
# @param attr [Symbol] The name of the attribute.
|
14
|
+
# @param value [Object] The value to validate.
|
15
|
+
# @param type [Symbol] The expected type of the attribute.
|
16
|
+
def validate_config_attr_type!(attr:, value:, type:)
|
17
|
+
case type
|
18
|
+
when :symbol
|
19
|
+
validate_symbol!(value)
|
20
|
+
when :hash
|
21
|
+
validate_hash!(value)
|
22
|
+
when :array
|
23
|
+
validate_array!(value)
|
24
|
+
when :class
|
25
|
+
validate_instance_of!(value, Object)
|
26
|
+
else
|
27
|
+
raise ArgumentError, "Unknown type #{type} for attribute #{attr}"
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
# Utility method to validate a Symbol.
|
32
|
+
def validate_symbol!(value)
|
33
|
+
raise ArgumentError, "Expected a Symbol, got #{value.class}" unless value.is_a?(Symbol)
|
34
|
+
end
|
35
|
+
|
36
|
+
# Utility method to validate a Hash.
|
37
|
+
def validate_hash!(value)
|
38
|
+
raise ArgumentError, "Expected a Hash, got #{value.class}" unless value.is_a?(Hash)
|
39
|
+
end
|
40
|
+
|
41
|
+
# Utility method to validate an Array.
|
42
|
+
def validate_array!(value)
|
43
|
+
raise ArgumentError, "Expected an Array, got #{value.class}" unless value.is_a?(Array)
|
44
|
+
end
|
45
|
+
|
46
|
+
# Utility method to validate a class instance.
|
47
|
+
def validate_instance_of!(value, klass)
|
48
|
+
raise ArgumentError, "Expected an instance of #{klass}, got #{value.class}" unless value.is_a?(klass)
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|