kamaze-project 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.
- checksums.yaml +7 -0
- data/.yardopts +18 -0
- data/bin/plop +5 -0
- data/lib/kamaze-project.rb +39 -0
- data/lib/kamaze/project.rb +155 -0
- data/lib/kamaze/project/boot/core_ext.rb +16 -0
- data/lib/kamaze/project/boot/listen.rb +38 -0
- data/lib/kamaze/project/concern.rb +13 -0
- data/lib/kamaze/project/concern/cli.rb +53 -0
- data/lib/kamaze/project/concern/cli/with_exit_on_failure.rb +36 -0
- data/lib/kamaze/project/concern/env.rb +63 -0
- data/lib/kamaze/project/concern/helper.rb +20 -0
- data/lib/kamaze/project/concern/mode.rb +19 -0
- data/lib/kamaze/project/concern/observable.rb +132 -0
- data/lib/kamaze/project/concern/sh.rb +91 -0
- data/lib/kamaze/project/concern/tasks.rb +55 -0
- data/lib/kamaze/project/concern/tools.rb +27 -0
- data/lib/kamaze/project/config.rb +58 -0
- data/lib/kamaze/project/core_ext/object.rb +27 -0
- data/lib/kamaze/project/core_ext/pp.rb +28 -0
- data/lib/kamaze/project/debug.rb +136 -0
- data/lib/kamaze/project/dsl.rb +16 -0
- data/lib/kamaze/project/dsl/definition.rb +43 -0
- data/lib/kamaze/project/dsl/setup.rb +11 -0
- data/lib/kamaze/project/helper.rb +63 -0
- data/lib/kamaze/project/helper/inflector.rb +44 -0
- data/lib/kamaze/project/helper/project.rb +34 -0
- data/lib/kamaze/project/helper/project/config.rb +25 -0
- data/lib/kamaze/project/observable.rb +20 -0
- data/lib/kamaze/project/observer.rb +37 -0
- data/lib/kamaze/project/resources/Vagrantfile +128 -0
- data/lib/kamaze/project/resources/config/tools.yml +15 -0
- data/lib/kamaze/project/struct.rb +34 -0
- data/lib/kamaze/project/tasks/cs.rb +23 -0
- data/lib/kamaze/project/tasks/cs/control.rb +17 -0
- data/lib/kamaze/project/tasks/cs/correct.rb +17 -0
- data/lib/kamaze/project/tasks/cs/pre_commit.rb +66 -0
- data/lib/kamaze/project/tasks/doc.rb +21 -0
- data/lib/kamaze/project/tasks/doc/watch.rb +41 -0
- data/lib/kamaze/project/tasks/gem.rb +14 -0
- data/lib/kamaze/project/tasks/gem/build.rb +34 -0
- data/lib/kamaze/project/tasks/gem/compile.rb +30 -0
- data/lib/kamaze/project/tasks/gem/gemspec.rb +20 -0
- data/lib/kamaze/project/tasks/gem/install.rb +32 -0
- data/lib/kamaze/project/tasks/gem/push.rb +27 -0
- data/lib/kamaze/project/tasks/misc/gitignore.rb +29 -0
- data/lib/kamaze/project/tasks/shell.rb +17 -0
- data/lib/kamaze/project/tasks/sources.rb +6 -0
- data/lib/kamaze/project/tasks/sources/license.rb +35 -0
- data/lib/kamaze/project/tasks/test.rb +16 -0
- data/lib/kamaze/project/tasks/vagrant.rb +71 -0
- data/lib/kamaze/project/tasks/version/edit.rb +16 -0
- data/lib/kamaze/project/tools.rb +18 -0
- data/lib/kamaze/project/tools/base_tool.rb +55 -0
- data/lib/kamaze/project/tools/console.rb +48 -0
- data/lib/kamaze/project/tools/console/output.rb +120 -0
- data/lib/kamaze/project/tools/console/output/buffer.rb +48 -0
- data/lib/kamaze/project/tools/gemspec.rb +33 -0
- data/lib/kamaze/project/tools/gemspec/builder.rb +99 -0
- data/lib/kamaze/project/tools/gemspec/concern.rb +13 -0
- data/lib/kamaze/project/tools/gemspec/concern/reading.rb +49 -0
- data/lib/kamaze/project/tools/gemspec/packager.rb +67 -0
- data/lib/kamaze/project/tools/gemspec/packer.rb +89 -0
- data/lib/kamaze/project/tools/gemspec/packer/command.rb +143 -0
- data/lib/kamaze/project/tools/gemspec/reader.rb +70 -0
- data/lib/kamaze/project/tools/gemspec/reader/decorator.rb +78 -0
- data/lib/kamaze/project/tools/gemspec/writer.rb +127 -0
- data/lib/kamaze/project/tools/gemspec/writer/dep_gen.rb +61 -0
- data/lib/kamaze/project/tools/gemspec/writer/dependency.rb +104 -0
- data/lib/kamaze/project/tools/git.rb +95 -0
- data/lib/kamaze/project/tools/git/hooks.rb +66 -0
- data/lib/kamaze/project/tools/git/hooks/base_hook.rb +33 -0
- data/lib/kamaze/project/tools/git/hooks/pre_commit.rb +81 -0
- data/lib/kamaze/project/tools/git/status.rb +101 -0
- data/lib/kamaze/project/tools/git/status/decorator.rb +39 -0
- data/lib/kamaze/project/tools/git/status/file.rb +180 -0
- data/lib/kamaze/project/tools/git/status/files_array.rb +39 -0
- data/lib/kamaze/project/tools/git/status/index.rb +77 -0
- data/lib/kamaze/project/tools/git/status/worktree.rb +19 -0
- data/lib/kamaze/project/tools/git/util.rb +35 -0
- data/lib/kamaze/project/tools/licenser.rb +197 -0
- data/lib/kamaze/project/tools/packager.rb +86 -0
- data/lib/kamaze/project/tools/packager/filesystem.rb +178 -0
- data/lib/kamaze/project/tools/packager/filesystem/operator.rb +83 -0
- data/lib/kamaze/project/tools/packager/filesystem/operator/utils.rb +77 -0
- data/lib/kamaze/project/tools/process_locker.rb +106 -0
- data/lib/kamaze/project/tools/rspec.rb +115 -0
- data/lib/kamaze/project/tools/rubocop.rb +128 -0
- data/lib/kamaze/project/tools/rubocop/arguments.rb +19 -0
- data/lib/kamaze/project/tools/rubocop/config.rb +43 -0
- data/lib/kamaze/project/tools/shell.rb +85 -0
- data/lib/kamaze/project/tools/vagrant.rb +182 -0
- data/lib/kamaze/project/tools/vagrant/composer.rb +88 -0
- data/lib/kamaze/project/tools/vagrant/composer/file.rb +79 -0
- data/lib/kamaze/project/tools/vagrant/remote.rb +79 -0
- data/lib/kamaze/project/tools/vagrant/shell.rb +102 -0
- data/lib/kamaze/project/tools/vagrant/writer.rb +81 -0
- data/lib/kamaze/project/tools/yardoc.rb +75 -0
- data/lib/kamaze/project/tools/yardoc/file.rb +55 -0
- data/lib/kamaze/project/tools/yardoc/watchable.rb +70 -0
- data/lib/kamaze/project/tools/yardoc/watcher.rb +106 -0
- data/lib/kamaze/project/tools_provider.rb +161 -0
- data/lib/kamaze/project/tools_provider/resolver.rb +42 -0
- data/lib/kamaze/project/version.rb +104 -0
- data/lib/kamaze/project/version.yml +17 -0
- metadata +321 -0
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
# Copyright (C) 2017-2018 Dimitri Arrigoni <dimitri@arrigoni.me>
|
|
4
|
+
# License GPLv3+: GNU GPL version 3 or later
|
|
5
|
+
# <http://www.gnu.org/licenses/gpl.html>.
|
|
6
|
+
# This is free software: you are free to change and redistribute it.
|
|
7
|
+
# There is NO WARRANTY, to the extent permitted by law.
|
|
8
|
+
|
|
9
|
+
require_relative '../concern'
|
|
10
|
+
require_relative '../helper'
|
|
11
|
+
|
|
12
|
+
# Provides access to helpers
|
|
13
|
+
module Kamaze::Project::Concern::Helper
|
|
14
|
+
protected
|
|
15
|
+
|
|
16
|
+
# @return [Sys::Proc::Helper]
|
|
17
|
+
def helper
|
|
18
|
+
Kamaze::Project::Helper.instance
|
|
19
|
+
end
|
|
20
|
+
end
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
# Copyright (C) 2017-2018 Dimitri Arrigoni <dimitri@arrigoni.me>
|
|
4
|
+
# License GPLv3+: GNU GPL version 3 or later
|
|
5
|
+
# <http://www.gnu.org/licenses/gpl.html>.
|
|
6
|
+
# This is free software: you are free to change and redistribute it.
|
|
7
|
+
# There is NO WARRANTY, to the extent permitted by law.
|
|
8
|
+
|
|
9
|
+
require_relative '../concern'
|
|
10
|
+
|
|
11
|
+
# Provide access to ``mode`` (baed on environment ``PROJECT_MODE``)
|
|
12
|
+
module Kamaze::Project::Concern::Mode
|
|
13
|
+
# Get project mode
|
|
14
|
+
#
|
|
15
|
+
# @return [String]
|
|
16
|
+
def mode
|
|
17
|
+
(ENV['PROJECT_MODE'] || 'production').freeze
|
|
18
|
+
end
|
|
19
|
+
end
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
# Copyright (C) 2017-2018 Dimitri Arrigoni <dimitri@arrigoni.me>
|
|
4
|
+
# License GPLv3+: GNU GPL version 3 or later
|
|
5
|
+
# <http://www.gnu.org/licenses/gpl.html>.
|
|
6
|
+
# This is free software: you are free to change and redistribute it.
|
|
7
|
+
# There is NO WARRANTY, to the extent permitted by law.
|
|
8
|
+
|
|
9
|
+
require_relative '../concern'
|
|
10
|
+
|
|
11
|
+
# Observable provides the methods for managing the associated observers.
|
|
12
|
+
#
|
|
13
|
+
# The observers SHOULD implement a method called ``update``
|
|
14
|
+
# to receive notifications.
|
|
15
|
+
#
|
|
16
|
+
# The observable object MNUST:
|
|
17
|
+
#
|
|
18
|
+
# * call ``#dispatch_event``
|
|
19
|
+
#
|
|
20
|
+
# Sample of use:
|
|
21
|
+
#
|
|
22
|
+
# ```ruby
|
|
23
|
+
# # @abstract
|
|
24
|
+
# class Observable
|
|
25
|
+
# include Kamaze::Project::Concern::Observable
|
|
26
|
+
# end
|
|
27
|
+
#
|
|
28
|
+
# class Subject < Observable
|
|
29
|
+
# attr_accessor :updated_at
|
|
30
|
+
#
|
|
31
|
+
# def update
|
|
32
|
+
# # do something
|
|
33
|
+
# dispatch_event(:after_update)
|
|
34
|
+
# end
|
|
35
|
+
# end
|
|
36
|
+
#
|
|
37
|
+
# class SubjectObserver < Kamaze::Project::Observer
|
|
38
|
+
# observe Subject
|
|
39
|
+
#
|
|
40
|
+
# def after_update(subject)
|
|
41
|
+
# subject.updated_at = Time.now
|
|
42
|
+
# end
|
|
43
|
+
# end
|
|
44
|
+
# ```
|
|
45
|
+
module Kamaze::Project::Concern::Observable
|
|
46
|
+
class << self
|
|
47
|
+
def included(base)
|
|
48
|
+
base.extend(ClassMethods)
|
|
49
|
+
end
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
# Class methods
|
|
53
|
+
module ClassMethods
|
|
54
|
+
# Add observer.
|
|
55
|
+
#
|
|
56
|
+
# @param [Class] observer_class
|
|
57
|
+
# @return [self]
|
|
58
|
+
def add_observer(observer_class, func = :handle_event)
|
|
59
|
+
func = func.to_sym
|
|
60
|
+
|
|
61
|
+
unless observer_class.instance_methods.include?(func)
|
|
62
|
+
m = "#<#{observer_class}> does not respond to `#{func}'"
|
|
63
|
+
raise NoMethodError, m
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
observer_peers[observer_class] = func
|
|
67
|
+
|
|
68
|
+
self
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
# Remove observer, so that it will no longer receive notifications.
|
|
72
|
+
#
|
|
73
|
+
# @param [Class] observer_class
|
|
74
|
+
# @return [self]
|
|
75
|
+
def delete_observer(observer_class)
|
|
76
|
+
observer_peers.delete(observer_class)
|
|
77
|
+
|
|
78
|
+
return self
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
# Remove all observers.
|
|
82
|
+
#
|
|
83
|
+
# @return [self]
|
|
84
|
+
def delete_observers
|
|
85
|
+
observers.clear
|
|
86
|
+
|
|
87
|
+
self
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
protected
|
|
91
|
+
|
|
92
|
+
# @return [Hash]
|
|
93
|
+
def observer_peers
|
|
94
|
+
@observer_peers ||= {}
|
|
95
|
+
end
|
|
96
|
+
end
|
|
97
|
+
|
|
98
|
+
def initialize
|
|
99
|
+
observer_peers_initialize
|
|
100
|
+
end
|
|
101
|
+
|
|
102
|
+
protected
|
|
103
|
+
|
|
104
|
+
# @return [Hash|nil]
|
|
105
|
+
attr_reader :observer_peers
|
|
106
|
+
|
|
107
|
+
# Initialize observers (defined from ``self.class.observer_peers``)
|
|
108
|
+
#
|
|
109
|
+
# @return [self]
|
|
110
|
+
def observer_peers_initialize
|
|
111
|
+
(@observer_peers ||= {}).yield_self do |observer_peers|
|
|
112
|
+
self.class.__send__(:observer_peers).to_h.each do |k, v|
|
|
113
|
+
observer_peers[k.new] = v
|
|
114
|
+
end
|
|
115
|
+
end
|
|
116
|
+
|
|
117
|
+
self
|
|
118
|
+
end
|
|
119
|
+
|
|
120
|
+
# Dispatch given ``event``
|
|
121
|
+
#
|
|
122
|
+
# @param [Symbol|String] event
|
|
123
|
+
# @param [Array<Object>] args
|
|
124
|
+
# @return [self]
|
|
125
|
+
def dispatch_event(event, *args)
|
|
126
|
+
observer_peers.to_h.each do |k, v|
|
|
127
|
+
k.__send__(v, *[event, self].concat(args))
|
|
128
|
+
end
|
|
129
|
+
|
|
130
|
+
self
|
|
131
|
+
end
|
|
132
|
+
end
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
# Copyright (C) 2017-2018 Dimitri Arrigoni <dimitri@arrigoni.me>
|
|
4
|
+
# License GPLv3+: GNU GPL version 3 or later
|
|
5
|
+
# <http://www.gnu.org/licenses/gpl.html>.
|
|
6
|
+
# This is free software: you are free to change and redistribute it.
|
|
7
|
+
# There is NO WARRANTY, to the extent permitted by law.
|
|
8
|
+
|
|
9
|
+
require_relative '../concern'
|
|
10
|
+
|
|
11
|
+
# Concern for Sh
|
|
12
|
+
#
|
|
13
|
+
# This module provides a wrapper around ``Rake::FileUtilsExt.sh()``
|
|
14
|
+
module Kamaze::Project::Concern::Sh
|
|
15
|
+
# @!attribute [rw] shell_runner_last_status
|
|
16
|
+
# @return [Process::Status]
|
|
17
|
+
|
|
18
|
+
class << self
|
|
19
|
+
def included(base)
|
|
20
|
+
base.class_eval <<-"ACCESSORS", __FILE__, __LINE__ + 1
|
|
21
|
+
protected
|
|
22
|
+
|
|
23
|
+
attr_accessor :shell_runner_last_status
|
|
24
|
+
|
|
25
|
+
attr_writer :shell_runner_debug
|
|
26
|
+
ACCESSORS
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
# Denote shell runner is in debug mode.
|
|
31
|
+
#
|
|
32
|
+
# @return [Boolean]
|
|
33
|
+
def shell_runner_debug?
|
|
34
|
+
@shell_runner_debug.nil? ? true : @shell_runner_debug
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
protected
|
|
38
|
+
|
|
39
|
+
# Run given (``cmd``) system command.
|
|
40
|
+
#
|
|
41
|
+
# If multiple arguments are given the command is run directly
|
|
42
|
+
# (without the shell, same semantics as Kernel::exec and Kernel::system).
|
|
43
|
+
#
|
|
44
|
+
# @see [Rake::FileUtilsExt]
|
|
45
|
+
# @see https://github.com/ruby/rake/blob/68ef9140c11d083d8bb7ee5da5b0543e3a7df73d/lib/rake/file_utils.rb#L44
|
|
46
|
+
def sh(*cmd, &block)
|
|
47
|
+
require 'rake'
|
|
48
|
+
require 'rake/file_utils'
|
|
49
|
+
|
|
50
|
+
block ||= create_shell_runner(cmd)
|
|
51
|
+
|
|
52
|
+
::Rake::FileUtilsExt.sh(*cmd, &block)
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
# Get shell block
|
|
56
|
+
#
|
|
57
|
+
# @param [Array] cmd
|
|
58
|
+
# @return [Proc]
|
|
59
|
+
def create_shell_runner(cmd)
|
|
60
|
+
proc do |ok, status|
|
|
61
|
+
self.shell_runner_last_status = status
|
|
62
|
+
|
|
63
|
+
if !ok and shell_runner_debug?
|
|
64
|
+
# rubocop:disable Layout/IndentHash
|
|
65
|
+
warn("Command failed with status (%<retcode>s):\n# %<command>s" % {
|
|
66
|
+
retcode: status.exitstatus,
|
|
67
|
+
command: debug_cmd(cmd.clone).gsub(/\{\}$/, '')
|
|
68
|
+
})
|
|
69
|
+
# rubocop:enable Layout/IndentHash
|
|
70
|
+
end
|
|
71
|
+
end
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
# Print a debug message
|
|
75
|
+
#
|
|
76
|
+
# @param [Array] cmd
|
|
77
|
+
# @return [String]
|
|
78
|
+
def debug_cmd(cmd)
|
|
79
|
+
options = cmd.last.is_a?(Hash) ? cmd.delete_at(-1) : {}
|
|
80
|
+
|
|
81
|
+
'%<command>s' % {
|
|
82
|
+
command: [
|
|
83
|
+
(cmd[0].is_a?(Hash) ? cmd.delete_at(0) : {}).to_a.map do |v|
|
|
84
|
+
"#{v[0]}=#{Shellwords.shellescape(v[1])}"
|
|
85
|
+
end.join(' '),
|
|
86
|
+
Shellwords.shelljoin(cmd),
|
|
87
|
+
options
|
|
88
|
+
].join(' ')
|
|
89
|
+
}
|
|
90
|
+
end
|
|
91
|
+
end
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
# Copyright (C) 2017-2018 Dimitri Arrigoni <dimitri@arrigoni.me>
|
|
4
|
+
# License GPLv3+: GNU GPL version 3 or later
|
|
5
|
+
# <http://www.gnu.org/licenses/gpl.html>.
|
|
6
|
+
# This is free software: you are free to change and redistribute it.
|
|
7
|
+
# There is NO WARRANTY, to the extent permitted by law.
|
|
8
|
+
|
|
9
|
+
require_relative '../concern'
|
|
10
|
+
|
|
11
|
+
# Concern tasks
|
|
12
|
+
#
|
|
13
|
+
# Stores tasks to enable and provides method to load them
|
|
14
|
+
module Kamaze::Project::Concern::Tasks
|
|
15
|
+
# Get tasks
|
|
16
|
+
#
|
|
17
|
+
# @return [Array<Symbol>]
|
|
18
|
+
def tasks
|
|
19
|
+
@tasks ||= []
|
|
20
|
+
|
|
21
|
+
@tasks.clone.freeze
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
# Set tasks
|
|
25
|
+
#
|
|
26
|
+
# @param [Array] tasks
|
|
27
|
+
def tasks=(tasks)
|
|
28
|
+
@tasks = (@tasks.to_a + tasks.to_a).map(&:to_s).map do |tn|
|
|
29
|
+
{ ':': '/', '-': '_' }.each { |k, v| tn = tn.tr(k.to_s, v) }
|
|
30
|
+
|
|
31
|
+
tn
|
|
32
|
+
end.map(&:to_sym).uniq
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
protected
|
|
36
|
+
|
|
37
|
+
# Load tasks
|
|
38
|
+
#
|
|
39
|
+
# Tasks are loaded only when ``Rake::DSL`` is defined.
|
|
40
|
+
# ``DSL::Definition`` is loaded during tasks loading.
|
|
41
|
+
#
|
|
42
|
+
# @see Kamaze::Project::DSL::Definition
|
|
43
|
+
# @return [self]
|
|
44
|
+
def tasks_load!
|
|
45
|
+
if Kernel.const_defined?('Rake::DSL')
|
|
46
|
+
ns = Pathname.new('kamaze/project')
|
|
47
|
+
|
|
48
|
+
[ns.join('dsl/setup'),
|
|
49
|
+
tasks.map { |task| ns.join("tasks/#{task}") }]
|
|
50
|
+
.flatten.map(&:to_s).each { |req| require req }
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
self
|
|
54
|
+
end
|
|
55
|
+
end
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
# Copyright (C) 2017-2018 Dimitri Arrigoni <dimitri@arrigoni.me>
|
|
4
|
+
# License GPLv3+: GNU GPL version 3 or later
|
|
5
|
+
# <http://www.gnu.org/licenses/gpl.html>.
|
|
6
|
+
# This is free software: you are free to change and redistribute it.
|
|
7
|
+
# There is NO WARRANTY, to the extent permitted by law.
|
|
8
|
+
|
|
9
|
+
require_relative '../concern'
|
|
10
|
+
require_relative '../../project/tools_provider'
|
|
11
|
+
|
|
12
|
+
# Provides access to tools
|
|
13
|
+
#
|
|
14
|
+
# Tools provide an extensibility mechanism
|
|
15
|
+
module Kamaze::Project::Concern::Tools
|
|
16
|
+
# Get tools
|
|
17
|
+
#
|
|
18
|
+
# @return [Hash]
|
|
19
|
+
def tools
|
|
20
|
+
@tools ||= Kamaze::Project::ToolsProvider.new
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
# @param [Hash] tools
|
|
24
|
+
def tools=(tools)
|
|
25
|
+
@tools = self.tools.merge!(tools)
|
|
26
|
+
end
|
|
27
|
+
end
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
# Copyright (C) 2017-2018 Dimitri Arrigoni <dimitri@arrigoni.me>
|
|
4
|
+
# License GPLv3+: GNU GPL version 3 or later
|
|
5
|
+
# <http://www.gnu.org/licenses/gpl.html>.
|
|
6
|
+
# This is free software: you are free to change and redistribute it.
|
|
7
|
+
# There is NO WARRANTY, to the extent permitted by law.
|
|
8
|
+
|
|
9
|
+
require_relative '../project'
|
|
10
|
+
require_relative 'struct'
|
|
11
|
+
|
|
12
|
+
# Generic config(urator) class
|
|
13
|
+
#
|
|
14
|
+
# @abstract Subclass and override {#defaults} to implement
|
|
15
|
+
class Kamaze::Project::Config
|
|
16
|
+
# @return [Kamaze::Project::Struct]
|
|
17
|
+
attr_reader :attributes
|
|
18
|
+
|
|
19
|
+
def initialize
|
|
20
|
+
@attributes = Kamaze::Project::Struct.new(defaults)
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
# Configure an object (manipulating its properties)
|
|
24
|
+
#
|
|
25
|
+
# @param [Object] configurable
|
|
26
|
+
# @return [Object]
|
|
27
|
+
def configure(configurable)
|
|
28
|
+
to_h.each do |k, v|
|
|
29
|
+
configurable.__send__("#{k}=", v)
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
configurable
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
# @return [Hash]
|
|
36
|
+
def to_h
|
|
37
|
+
attributes.to_h
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
def method_missing(method, *args, &block)
|
|
41
|
+
if respond_to_missing?(method)
|
|
42
|
+
@attributes.public_send(method, *args, &block)
|
|
43
|
+
else
|
|
44
|
+
super
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
def respond_to_missing?(method, include_private = false)
|
|
49
|
+
return true if attributes.respond_to?(method, include_private)
|
|
50
|
+
|
|
51
|
+
super(method, include_private)
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
# @return [Hash]
|
|
55
|
+
def defaults
|
|
56
|
+
{}
|
|
57
|
+
end
|
|
58
|
+
end
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
# Copyright (C) 2017-2018 Dimitri Arrigoni <dimitri@arrigoni.me>
|
|
4
|
+
# License GPLv3+: GNU GPL version 3 or later
|
|
5
|
+
# <http://www.gnu.org/licenses/gpl.html>.
|
|
6
|
+
# This is free software: you are free to change and redistribute it.
|
|
7
|
+
# There is NO WARRANTY, to the extent permitted by law.
|
|
8
|
+
|
|
9
|
+
# Object is the default root of all Ruby objects
|
|
10
|
+
#
|
|
11
|
+
# Object inherits from BasicObject
|
|
12
|
+
# which allows creating alternate object hierarchies.
|
|
13
|
+
# Methods on Object are available to all classes
|
|
14
|
+
# (unless explicitly overridden).
|
|
15
|
+
#
|
|
16
|
+
# @see https://ruby-doc.org/core-2.5.0/Object.html
|
|
17
|
+
class Object
|
|
18
|
+
if Gem::Version.new(RUBY_VERSION) < Gem::Version.new('2.5.0')
|
|
19
|
+
# Yields self to the block and returns the result of the block.
|
|
20
|
+
#
|
|
21
|
+
# @return [Object]
|
|
22
|
+
# @see https://ruby-doc.org/core-2.5.0/Object.html#method-i-yield_self
|
|
23
|
+
def yield_self
|
|
24
|
+
yield(self)
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
end
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
# Copyright (C) 2017-2018 Dimitri Arrigoni <dimitri@arrigoni.me>
|
|
4
|
+
# License GPLv3+: GNU GPL version 3 or later
|
|
5
|
+
# <http://www.gnu.org/licenses/gpl.html>.
|
|
6
|
+
# This is free software: you are free to change and redistribute it.
|
|
7
|
+
# There is NO WARRANTY, to the extent permitted by law.
|
|
8
|
+
|
|
9
|
+
require_relative '../debug'
|
|
10
|
+
|
|
11
|
+
# rubocop:disable Style/Documentation
|
|
12
|
+
|
|
13
|
+
class Object
|
|
14
|
+
private
|
|
15
|
+
|
|
16
|
+
# Print arguments in pretty form
|
|
17
|
+
#
|
|
18
|
+
# @see https://ruby-doc.org/stdlib-2.4.0/libdoc/pp/rdoc/Kernel.html
|
|
19
|
+
# @see https://github.com/topazproject/topaz/blob/master/lib-ruby/pp.rb
|
|
20
|
+
def pp(*objs)
|
|
21
|
+
debug = Kamaze::Project::Debug.new
|
|
22
|
+
objs.each { |obj| debug.dump(obj) }
|
|
23
|
+
|
|
24
|
+
objs.size <= 1 ? objs.first : objs
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
# rubocop:enable Style/Documentation
|