k_manager 0.0.13 → 0.0.28
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/.rubocop.yml +1 -0
- data/Gemfile +23 -0
- data/Rakefile +2 -0
- data/docs/flow.drawio +16 -0
- data/exe/k_manager +19 -0
- data/hooks/update-version +1 -1
- data/k_manager.gemspec +9 -0
- data/lib/k_manager/area.rb +49 -0
- data/lib/k_manager/cli/base_command.rb +23 -0
- data/lib/k_manager/cli/commands.rb +25 -0
- data/lib/k_manager/cli/info.rb +81 -0
- data/lib/k_manager/cli/new.rb +130 -0
- data/lib/k_manager/cli/version.rb +15 -0
- data/lib/k_manager/cli/watch.rb +65 -0
- data/lib/k_manager/document_factory.rb +81 -0
- data/lib/k_manager/manager.rb +158 -0
- data/lib/k_manager/overview/dashboard.rb +197 -0
- data/lib/k_manager/overview/dump_json.rb +35 -0
- data/lib/k_manager/overview/models.rb +76 -0
- data/lib/k_manager/overview/queries.rb +53 -0
- data/lib/k_manager/resources/base_resource.rb +203 -52
- data/lib/k_manager/resources/file_resource.rb +81 -58
- data/lib/k_manager/resources/{ruby_file_resource.rb → file_resources/ruby_file_resource.rb} +0 -0
- data/lib/k_manager/resources/{unknown_file_resource.rb → file_resources/unknown_file_resource.rb} +0 -0
- data/lib/k_manager/resources/mem_resource.rb +17 -0
- data/lib/k_manager/resources/resource_document_factory.rb +123 -0
- data/lib/k_manager/resources/resource_factory.rb +28 -0
- data/lib/k_manager/resources/resource_manager.rb +201 -0
- data/lib/k_manager/resources/resource_set.rb +90 -0
- data/lib/k_manager/resources/web_resource.rb +113 -0
- data/lib/k_manager/version.rb +1 -1
- data/lib/k_manager/watcher.rb +113 -0
- data/lib/k_manager/{x_project.rb → x_resource_documents/x_project.rb} +0 -0
- data/lib/k_manager/{x_project_manager.rb → x_resource_documents/x_project_manager.rb} +0 -0
- data/lib/k_manager/{x_register.rb → x_resource_documents/x_register.rb} +0 -0
- data/lib/k_manager.rb +111 -24
- data/tasks/watch.rake +18 -0
- metadata +118 -25
- data/Assessment1.md +0 -127
- data/Assessment2.md +0 -88
- data/lib/k_manager/configuration/project_config.rb +0 -14
- data/lib/k_manager/create_document.rb +0 -31
- data/lib/k_manager/documents/basic_document.rb +0 -21
- data/lib/k_manager/documents/builder_document.rb +0 -18
- data/lib/k_manager/documents/document_taggable.rb +0 -94
- data/lib/k_manager/documents/model_document.rb +0 -19
- data/lib/k_manager/project.rb +0 -50
- data/lib/k_manager/resources/csv_file_resource.rb +0 -27
- data/lib/k_manager/resources/factories/document_factory.rb +0 -52
- data/lib/k_manager/resources/json_file_resource.rb +0 -22
- data/lib/k_manager/resources/yaml_file_resource.rb +0 -21
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 10d0353e9cdde7cbec88c6b6a7dd47135da7fa026bf90ec9b6e5017c75ac2a0b
|
4
|
+
data.tar.gz: a77c72d2aa9888f29f3b3b835919828cbf6480e349cecb723e6862d81478f540
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: eda368dd81ee863ad42831c6527f27b56a60d78d2e2417d377d8425fc6bcf823efe3998a61c5c358ff0329ba2251530b16e94e51acf44c2d463e0dc24874d921
|
7
|
+
data.tar.gz: 6aa66dabe51fcecf3d76dd65f202e5b21b7023133ca1892d1d743ed7059f0b7d3e2a00a354ea3b6d780ec59a77131d50b784aaf786e0937f20a8f71a419d24ea
|
data/.rubocop.yml
CHANGED
data/Gemfile
CHANGED
@@ -23,3 +23,26 @@ group :development, :test do
|
|
23
23
|
gem 'rubocop-rake', require: false
|
24
24
|
gem 'rubocop-rspec', require: false
|
25
25
|
end
|
26
|
+
|
27
|
+
# If local dependency
|
28
|
+
if ENV['KLUE_LOCAL_GEMS']&.to_s&.downcase == 'true'
|
29
|
+
group :development, :test do
|
30
|
+
puts 'Using Local GEMs'
|
31
|
+
gem 'handlebars-helpers' , path: '../handlebars-helpers'
|
32
|
+
gem 'k_builder' , path: '../k_builder'
|
33
|
+
gem 'k_builder-dotnet' , path: '../k_builder-dotnet'
|
34
|
+
# gem 'k_builder-package_json' , path: '../k_builder-package_json'
|
35
|
+
gem 'k_builder-webpack5' , path: '../k_builder-webpack5'
|
36
|
+
gem 'k_config' , path: '../k_config'
|
37
|
+
gem 'k_decor' , path: '../k_decor'
|
38
|
+
gem 'k_director' , path: '../k_director'
|
39
|
+
gem 'k_doc' , path: '../k_doc'
|
40
|
+
gem 'k_domain' , path: '../k_domain'
|
41
|
+
gem 'k_ext-github' , path: '../k_ext-github'
|
42
|
+
gem 'k_fileset' , path: '../k_fileset'
|
43
|
+
gem 'k_log' , path: '../k_log'
|
44
|
+
gem 'k_type' , path: '../k_type'
|
45
|
+
gem 'k_util' , path: '../k_util'
|
46
|
+
gem 'peeky' , path: '../peeky'
|
47
|
+
end
|
48
|
+
end
|
data/Rakefile
CHANGED
data/docs/flow.drawio
ADDED
@@ -0,0 +1,16 @@
|
|
1
|
+
<mxfile host="65bd71144e">
|
2
|
+
<diagram id="AE9tsI4e_FXgj975v7li" name="Page-1">
|
3
|
+
<mxGraphModel dx="1087" dy="583" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="1169" pageHeight="827" background="#ffffff" math="0" shadow="0">
|
4
|
+
<root>
|
5
|
+
<mxCell id="0"/>
|
6
|
+
<mxCell id="1" parent="0"/>
|
7
|
+
<mxCell id="2" value="KManager" style="rounded=1;whiteSpace=wrap;html=1;" vertex="1" parent="1">
|
8
|
+
<mxGeometry x="200" y="70" width="120" height="60" as="geometry"/>
|
9
|
+
</mxCell>
|
10
|
+
<mxCell id="3" value="" style="rounded=1;whiteSpace=wrap;html=1;" vertex="1" parent="1">
|
11
|
+
<mxGeometry x="390" y="210" width="120" height="60" as="geometry"/>
|
12
|
+
</mxCell>
|
13
|
+
</root>
|
14
|
+
</mxGraphModel>
|
15
|
+
</diagram>
|
16
|
+
</mxfile>
|
data/exe/k_manager
ADDED
@@ -0,0 +1,19 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
# frozen_string_literal: true
|
4
|
+
|
5
|
+
require 'pry'
|
6
|
+
puts 'dddddddddddddddddddddd'
|
7
|
+
|
8
|
+
lib_path = File.expand_path(File.join(File.dirname(__FILE__), '../lib'))
|
9
|
+
gem_path = File.expand_path(File.join(File.dirname(__FILE__), '../Gemfile'))
|
10
|
+
|
11
|
+
$LOAD_PATH.unshift(lib_path)
|
12
|
+
|
13
|
+
ENV['BUNDLE_GEMFILE'] = gem_path
|
14
|
+
|
15
|
+
require 'bundler/setup'
|
16
|
+
require 'k_manager'
|
17
|
+
require 'k_manager/cli/commands'
|
18
|
+
|
19
|
+
Dry::CLI.new(KManager::Cli::Commands).call
|
data/hooks/update-version
CHANGED
data/k_manager.gemspec
CHANGED
@@ -38,10 +38,19 @@ Gem::Specification.new do |spec|
|
|
38
38
|
spec.require_paths = ['lib']
|
39
39
|
# spec.extensions = ['ext/k_manager/extconf.rb']
|
40
40
|
|
41
|
+
spec.add_dependency 'dry-struct', '~> 1'
|
42
|
+
spec.add_dependency 'filewatcher', '~> 2.0.0.beta5'
|
41
43
|
spec.add_dependency 'k_builder', '~> 0.0.0'
|
44
|
+
spec.add_dependency 'k_director', '~> 0.1'
|
42
45
|
spec.add_dependency 'k_doc', '~> 0.0.0'
|
46
|
+
spec.add_dependency 'k_domain', '~> 0.0.0'
|
43
47
|
spec.add_dependency 'k_ext-github', '~> 0.0.0'
|
48
|
+
spec.add_dependency 'k_fileset', '~> 0.0.0'
|
44
49
|
spec.add_dependency 'k_log', '~> 0.0.0'
|
45
50
|
# spec.add_dependency 'k_type' , '~> 0.0.0'
|
46
51
|
# spec.add_dependency 'k_util' , '~> 0.0.0'
|
52
|
+
spec.add_dependency 'dry-cli', '~> 0.7.0'
|
53
|
+
spec.metadata = {
|
54
|
+
'rubygems_mfa_required' => 'true'
|
55
|
+
}
|
47
56
|
end
|
@@ -0,0 +1,49 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module KManager
|
4
|
+
class Area
|
5
|
+
include KLog::Logging
|
6
|
+
extend Forwardable
|
7
|
+
|
8
|
+
attr_reader :manager
|
9
|
+
# TODO: I have not got a use for area name yet, it may be able to drive default config, but not sure.
|
10
|
+
attr_reader :name
|
11
|
+
attr_reader :namespace
|
12
|
+
attr_reader :config
|
13
|
+
|
14
|
+
def initialize(**opts)
|
15
|
+
@manager = opts[:manager]
|
16
|
+
@name = opts[:name]
|
17
|
+
|
18
|
+
raise 'Area name is required' unless @name
|
19
|
+
|
20
|
+
@namespace = opts[:namespace] || @name
|
21
|
+
@config = KConfig.configuration(@name)
|
22
|
+
end
|
23
|
+
|
24
|
+
def resource_manager
|
25
|
+
@resource_manager ||= KManager::Resources::ResourceManager.new(self)
|
26
|
+
end
|
27
|
+
|
28
|
+
def_delegators :resource_manager, :resource_changed, :resources, :find_by_uri
|
29
|
+
|
30
|
+
def debug(*sections)
|
31
|
+
log.kv 'Area' , name
|
32
|
+
log.kv 'Namespace' , namespace
|
33
|
+
|
34
|
+
resource_manager.debug if sections.include?(:resource) || sections.include?(:resources)
|
35
|
+
config.debug if sections.include?(:config)
|
36
|
+
end
|
37
|
+
|
38
|
+
# rubocop:disable Metrics/AbcSize
|
39
|
+
def attribute_values(prefix = nil)
|
40
|
+
result = {}
|
41
|
+
result["#{prefix}name".to_sym] = name
|
42
|
+
result["#{prefix}namespace".to_sym] = namespace
|
43
|
+
result["#{prefix}resource_count".to_sym] = resource_manager.resources.length
|
44
|
+
result["#{prefix}document_count".to_sym] = resource_manager.resources.sum { |resource| resource.documents.length }
|
45
|
+
result
|
46
|
+
end
|
47
|
+
# rubocop:enable Metrics/AbcSize
|
48
|
+
end
|
49
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module KManager
|
4
|
+
module Cli
|
5
|
+
module Commands
|
6
|
+
class BaseCommand < Dry::CLI::Command
|
7
|
+
include KLog::Logging
|
8
|
+
|
9
|
+
option :log_level,
|
10
|
+
default: 'none',
|
11
|
+
aliases: ['-l'],
|
12
|
+
desc: 'Log level (:none, :debug)'
|
13
|
+
|
14
|
+
private
|
15
|
+
|
16
|
+
def absolute_path(path, base_path)
|
17
|
+
pathname = Pathname.new(path)
|
18
|
+
pathname.absolute? ? path : File.expand_path(path, base_path)
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'dry/cli'
|
4
|
+
require_relative 'base_command'
|
5
|
+
require_relative 'version'
|
6
|
+
require_relative 'watch'
|
7
|
+
require_relative 'new'
|
8
|
+
require_relative 'info'
|
9
|
+
|
10
|
+
module KManager
|
11
|
+
module Cli
|
12
|
+
module Commands
|
13
|
+
extend Dry::CLI::Registry
|
14
|
+
|
15
|
+
register 'version' , Version , aliases: %w[v -v --version]
|
16
|
+
register 'watch' , Watch , aliases: %w[w]
|
17
|
+
register 'new' , New , aliases: %w[n]
|
18
|
+
register 'info' , Info , aliases: %w[i]
|
19
|
+
|
20
|
+
# register 'generate', aliases: ['g'] do |prefix|
|
21
|
+
# prefix.register 'config', Generate::Configuration
|
22
|
+
# end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,81 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module KManager
|
4
|
+
module Cli
|
5
|
+
module Commands
|
6
|
+
class Info < KManager::Cli::Commands::BaseCommand
|
7
|
+
desc 'Print information about builder, project, and watcher folders'
|
8
|
+
|
9
|
+
argument :project_folder,
|
10
|
+
default: '.',
|
11
|
+
desc: 'Info project folder (defaults to current directory .)'
|
12
|
+
|
13
|
+
option :builder_folder,
|
14
|
+
default: '.builders',
|
15
|
+
desc: 'The builder folder, defaults to (.builders)'
|
16
|
+
|
17
|
+
def call(project_folder:, builder_folder:, **)
|
18
|
+
project_folder = absolute_path(project_folder, Dir.pwd)
|
19
|
+
# name must be after project_folder
|
20
|
+
name = File.basename(project_folder)
|
21
|
+
builder_folder = absolute_path(builder_folder, project_folder)
|
22
|
+
|
23
|
+
log_params(name, project_folder, builder_folder)
|
24
|
+
end
|
25
|
+
|
26
|
+
private
|
27
|
+
|
28
|
+
def log_params(name, project_folder, builder_folder)
|
29
|
+
log.section_heading('Information')
|
30
|
+
log.kv 'Project Name' , name
|
31
|
+
log.kv 'Project Folder' , project_folder
|
32
|
+
log.kv 'Builder Folder' , builder_folder
|
33
|
+
log.kv 'Project File Count' , project_file_count(project_folder, builder_folder)
|
34
|
+
log.kv 'Builder File Count' , builder_file_count(builder_folder)
|
35
|
+
|
36
|
+
# log_files(project_folder, project_file_list(project_folder, builder_folder), 'Project Files List')
|
37
|
+
log_files(builder_folder, builder_file_list(builder_folder), 'Builder Files')
|
38
|
+
end
|
39
|
+
|
40
|
+
def log_files(root_folder, files, title)
|
41
|
+
log.section_heading(title)
|
42
|
+
files.each do |file|
|
43
|
+
pathname = Pathname.new(file)
|
44
|
+
puts pathname.relative_path_from(root_folder).to_s
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
def project_file_count(project_folder, builder_folder)
|
49
|
+
project_file_list(project_folder, builder_folder).length
|
50
|
+
end
|
51
|
+
|
52
|
+
def project_file_list(project_folder, builder_folder)
|
53
|
+
return @project_file_list if defined? @project_file_list
|
54
|
+
|
55
|
+
@project_file_list = begin
|
56
|
+
pattern = '{.[^\.]*,*,**}/**/*'
|
57
|
+
|
58
|
+
result = Dir.chdir(project_folder) do
|
59
|
+
Dir.glob(pattern).map { |f| File.realpath(f) }
|
60
|
+
end
|
61
|
+
|
62
|
+
result - builder_file_list(builder_folder)
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
def builder_file_count(builder_folder)
|
67
|
+
builder_file_list(builder_folder).length
|
68
|
+
end
|
69
|
+
|
70
|
+
# Dir.glob(".").map(&File.method(:realpath))
|
71
|
+
def builder_file_list(builder_folder)
|
72
|
+
return @builder_file_list if defined? @builder_file_list
|
73
|
+
|
74
|
+
@builder_file_list = Dir.chdir(builder_folder) do
|
75
|
+
Dir.glob('**/*').map { |f| File.realpath(f) }
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|
79
|
+
end
|
80
|
+
end
|
81
|
+
end
|
@@ -0,0 +1,130 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module KManager
|
4
|
+
module Cli
|
5
|
+
module Commands
|
6
|
+
class New < KManager::Cli::Commands::BaseCommand
|
7
|
+
desc 'Create a new KManager project'
|
8
|
+
|
9
|
+
argument :project_folder,
|
10
|
+
default: '.',
|
11
|
+
desc: 'New project folder (defaults to current directory .)'
|
12
|
+
|
13
|
+
option :builder_folder,
|
14
|
+
default: '.builders',
|
15
|
+
desc: 'The builder folder, defaults to (.builders)'
|
16
|
+
|
17
|
+
option :force,
|
18
|
+
default: false,
|
19
|
+
aliases: ['-f'],
|
20
|
+
desc: 'Force even if guard fails'
|
21
|
+
|
22
|
+
option :template,
|
23
|
+
default: false,
|
24
|
+
aliases: ['-t'],
|
25
|
+
desc: 'Starter template'
|
26
|
+
|
27
|
+
option :log_level,
|
28
|
+
default: nil,
|
29
|
+
desc: 'Log level, use debug for more info'
|
30
|
+
|
31
|
+
example [
|
32
|
+
' # Project in current directory - will create a .builders folder and boot file at ./builders/boot.rb',
|
33
|
+
'-b ../config/boot.rb # Project in current directory - will create a .builders folder and boot file at ./config/boot.rb',
|
34
|
+
'-t ruby_gem # Use starter template `ruby_gem` to setup the files in .builders/*',
|
35
|
+
'my_project # will watch .xmen folder'
|
36
|
+
]
|
37
|
+
|
38
|
+
# rubocop:disable Metrics/ParameterLists
|
39
|
+
def call(project_folder:, builder_folder:, log_level:, force:, template:, **)
|
40
|
+
project_folder = absolute_path(project_folder, Dir.pwd)
|
41
|
+
name = File.basename(project_folder)
|
42
|
+
builder_folder = absolute_path(builder_folder, project_folder)
|
43
|
+
template_root_folder = File.expand_path('~/dev/kgems/k_templates/definitions/starter')
|
44
|
+
|
45
|
+
log_params(name, project_folder, builder_folder, force, log_level, template_root_folder, template) if log_level == 'debug'
|
46
|
+
|
47
|
+
create_project(name, project_folder, builder_folder, template_root_folder, template) if can_create?(force, builder_folder)
|
48
|
+
end
|
49
|
+
# rubocop:enable Metrics/ParameterLists
|
50
|
+
|
51
|
+
private
|
52
|
+
|
53
|
+
def create_project(name, project_folder, builder_folder, template_root_folder, template)
|
54
|
+
FileUtils.mkdir_p(project_folder)
|
55
|
+
FileUtils.mkdir_p(builder_folder)
|
56
|
+
|
57
|
+
# handle_main_start_command
|
58
|
+
|
59
|
+
setup_builder_from_template(name, builder_folder, template_root_folder, 'default') unless setup_builder_from_template(name, builder_folder, template_root_folder, template)
|
60
|
+
|
61
|
+
log.info 'Project created'
|
62
|
+
end
|
63
|
+
|
64
|
+
def setup_builder_from_template(name, builder_folder, template_root_folder, template = nil)
|
65
|
+
return false unless template
|
66
|
+
|
67
|
+
# /Users/davidcruwys/dev/kgems/k_templates/definitions/starter/ruby_gem/.starter.json
|
68
|
+
template_folder = File.join(template_root_folder, template)
|
69
|
+
starter_config = template_starter_config(template_folder)
|
70
|
+
|
71
|
+
return false unless starter_config
|
72
|
+
|
73
|
+
builder = get_builder(builder_folder, template_folder)
|
74
|
+
|
75
|
+
return false if starter_config['files'].nil? || starter_config['files'].empty?
|
76
|
+
|
77
|
+
starter_config['files']&.each do |relative_file|
|
78
|
+
builder.add_file(relative_file, template_file: relative_file, name: name)
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
def template_starter_config(template_folder)
|
83
|
+
starter_file = File.join(template_folder, '.starter.json')
|
84
|
+
|
85
|
+
return nil unless File.exist?(starter_file)
|
86
|
+
|
87
|
+
JSON.parse(File.read(starter_file))
|
88
|
+
end
|
89
|
+
|
90
|
+
# rubocop:disable Metrics/AbcSize
|
91
|
+
def get_builder(builder_folder, template_folder)
|
92
|
+
Handlebars::Helpers.configure do |config|
|
93
|
+
config.helper_config_file = File.join(Gem.loaded_specs['handlebars-helpers'].full_gem_path, '.handlebars_helpers.json')
|
94
|
+
config.string_formatter_config_file = File.join(Gem.loaded_specs['handlebars-helpers'].full_gem_path, '.handlebars_string_formatters.json')
|
95
|
+
end
|
96
|
+
|
97
|
+
KConfig.configure(:starter_template) do |config|
|
98
|
+
config.target_folders.add(:builder , builder_folder)
|
99
|
+
config.template_folders.add(:template , template_folder)
|
100
|
+
end
|
101
|
+
|
102
|
+
KBuilder::BaseBuilder.init(KConfig.configuration(:starter_template))
|
103
|
+
end
|
104
|
+
# rubocop:enable Metrics/AbcSize
|
105
|
+
|
106
|
+
def can_create?(force, builder_folder)
|
107
|
+
return true if force
|
108
|
+
return true unless File.directory?(builder_folder)
|
109
|
+
|
110
|
+
log.error "Project builder folder already exists: #{builder_folder}"
|
111
|
+
|
112
|
+
false
|
113
|
+
end
|
114
|
+
|
115
|
+
# rubocop:disable Metrics/ParameterLists
|
116
|
+
def log_params(name, project_folder, builder_folder, force, log_level, template_root_folder, template)
|
117
|
+
log.section_heading('Create new project')
|
118
|
+
log.kv 'name' , name
|
119
|
+
log.kv 'project_folder' , project_folder
|
120
|
+
log.kv 'builder_folder' , builder_folder
|
121
|
+
log.kv 'force' , force
|
122
|
+
log.kv 'log_level' , log_level
|
123
|
+
log.kv 'template_root_folder' , template_root_folder
|
124
|
+
log.kv 'template' , template
|
125
|
+
end
|
126
|
+
# rubocop:enable Metrics/ParameterLists
|
127
|
+
end
|
128
|
+
end
|
129
|
+
end
|
130
|
+
end
|
@@ -0,0 +1,65 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module KManager
|
4
|
+
module Cli
|
5
|
+
module Commands
|
6
|
+
class Watch < KManager::Cli::Commands::BaseCommand
|
7
|
+
desc 'Watch folder'
|
8
|
+
|
9
|
+
argument :builder_folder,
|
10
|
+
default: '.builders',
|
11
|
+
desc: 'Folder to watch (aka builder folder), defaults to (.builders)'
|
12
|
+
|
13
|
+
option :boot_file,
|
14
|
+
default: 'boot.rb',
|
15
|
+
aliases: ['-b'],
|
16
|
+
desc: 'The boot file used for k_manager configuration'
|
17
|
+
|
18
|
+
example [
|
19
|
+
' # will watch .builders folder and boot from ./builders/boot.rb',
|
20
|
+
'-b ../config/boot.rb # will watch .builders folder and boot from ./config/boot.rb',
|
21
|
+
'.xmen # will watch .xmen folder'
|
22
|
+
]
|
23
|
+
|
24
|
+
def call(builder_folder:, boot_file:, log_level: , **)
|
25
|
+
builder_folder = absolute_path(builder_folder, Dir.pwd)
|
26
|
+
boot_file = absolute_path(boot_file, builder_folder)
|
27
|
+
|
28
|
+
log_params(builder_folder, boot_file) if log_level == 'debug'
|
29
|
+
|
30
|
+
# If you do a System Exit (control+c) you can go into a reboot sequence based on options
|
31
|
+
# if the option is not set then system will exit gracefully
|
32
|
+
while keep_watching(builder_folder, boot_file); end
|
33
|
+
end
|
34
|
+
|
35
|
+
private
|
36
|
+
|
37
|
+
# rubocop:disable Metrics/AbcSize
|
38
|
+
def keep_watching(builder_folder, boot_file)
|
39
|
+
Dir.chdir(builder_folder) do
|
40
|
+
watcher = KManager::Watcher.new(builder_folder, boot_file)
|
41
|
+
watcher.start
|
42
|
+
end
|
43
|
+
false
|
44
|
+
rescue Interrupt, SystemExit
|
45
|
+
if KManager.opts.reboot_on_kill == true || KManager.opts.reboot_on_kill == 1
|
46
|
+
puts "\nRebooting #{KManager.opts.app_name}..."
|
47
|
+
sleep KManager.opts.reboot_sleep unless KManager.opts.reboot_sleep.zero?
|
48
|
+
|
49
|
+
return true
|
50
|
+
end
|
51
|
+
|
52
|
+
puts "\nExiting..."
|
53
|
+
false
|
54
|
+
end
|
55
|
+
# rubocop:enable Metrics/AbcSize
|
56
|
+
|
57
|
+
def log_params(builder_folder, boot_file)
|
58
|
+
log.section_heading('Watch project')
|
59
|
+
log.kv 'builder_folder' , builder_folder
|
60
|
+
log.kv 'boot_file' , boot_file
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
@@ -0,0 +1,81 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module KManager
|
4
|
+
# Factories for creating common DSL documents quickly
|
5
|
+
#
|
6
|
+
# Example:
|
7
|
+
#
|
8
|
+
# KManager.csv(file: 'somepath/somefile.csv') do
|
9
|
+
# load
|
10
|
+
# end
|
11
|
+
class DocumentFactory
|
12
|
+
include KLog::Logging
|
13
|
+
|
14
|
+
# Create a KDoc::Model instance
|
15
|
+
def action(key = nil, **opts, &block)
|
16
|
+
document = new_document(KDoc::Action, key, **opts, &block)
|
17
|
+
|
18
|
+
attach_to_current_resource(document, change_content_type: :ruby)
|
19
|
+
end
|
20
|
+
|
21
|
+
# Create a KDoc::Model instance
|
22
|
+
def model(key = nil, **opts, &block)
|
23
|
+
document = new_document(KDoc::Model, key, **opts, &block)
|
24
|
+
|
25
|
+
attach_to_current_resource(document, change_content_type: :dsl)
|
26
|
+
end
|
27
|
+
|
28
|
+
# Create a KDoc::CsvDoc instance
|
29
|
+
def csv(key = nil, **opts, &block)
|
30
|
+
document = new_document(KDoc::CsvDoc, key, **opts, &block)
|
31
|
+
|
32
|
+
attach_to_current_resource(document, change_content_type: :dsl)
|
33
|
+
rescue StandardError => e
|
34
|
+
log.error(e)
|
35
|
+
end
|
36
|
+
|
37
|
+
# Create a KDoc::JsonDoc instance
|
38
|
+
def json(key = nil, **opts, &block)
|
39
|
+
document = new_document(KDoc::JsonDoc, key, **opts, &block)
|
40
|
+
|
41
|
+
attach_to_current_resource(document, change_content_type: :dsl)
|
42
|
+
rescue StandardError => e
|
43
|
+
log.error(e)
|
44
|
+
end
|
45
|
+
|
46
|
+
# Create a KDoc::YamlDoc instance
|
47
|
+
def yaml(key = nil, **opts, &block)
|
48
|
+
document = new_document(KDoc::YamlDoc, key, **opts, &block)
|
49
|
+
|
50
|
+
attach_to_current_resource(document, change_content_type: :dsl)
|
51
|
+
rescue StandardError => e
|
52
|
+
log.error(e)
|
53
|
+
end
|
54
|
+
|
55
|
+
private
|
56
|
+
|
57
|
+
# If document gets created dynamically due to class_eval then they
|
58
|
+
# can attach themselves to the currently focussed resource.
|
59
|
+
#
|
60
|
+
# It will throw an error if for_resource has not been called earlier
|
61
|
+
# in the thread lifecycle.
|
62
|
+
def attach_to_current_resource(document, change_content_type: nil)
|
63
|
+
return document unless KManager.current_resource
|
64
|
+
|
65
|
+
KManager.for_current_resource do |resource|
|
66
|
+
resource.attach_document(document, change_content_type: change_content_type)
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
# Create an instance of a document
|
71
|
+
#
|
72
|
+
# @param [Class<DocumentTaggable>] klass type of document to create
|
73
|
+
def new_document(klass, key = nil, **opts, &block)
|
74
|
+
# Should be able to infer
|
75
|
+
# key = KManager.current_resource.documents.length.zero? ? KManager.current_resource.infer_key : nil
|
76
|
+
|
77
|
+
# klass.new(key, **{ owner: KManager.current_resource }.merge(opts), &block)
|
78
|
+
klass.new(key, **opts, &block)
|
79
|
+
end
|
80
|
+
end
|
81
|
+
end
|