k_manager 0.0.22 → 0.0.23
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/exe/k_manager +2 -4
- data/k_manager.gemspec +1 -0
- data/lib/k_manager/area.rb +3 -1
- 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 +75 -0
- data/lib/k_manager/cli/version.rb +15 -0
- data/lib/k_manager/cli/watch.rb +49 -0
- data/lib/k_manager/document_factory.rb +7 -0
- data/lib/k_manager/manager.rb +60 -1
- data/lib/k_manager/overview/dashboard.rb +2 -1
- data/lib/k_manager/resources/base_resource.rb +14 -1
- data/lib/k_manager/resources/file_resource.rb +1 -0
- data/lib/k_manager/resources/resource_document_factory.rb +2 -0
- data/lib/k_manager/resources/resource_manager.rb +5 -20
- data/lib/k_manager/version.rb +1 -1
- data/lib/k_manager/watcher.rb +21 -15
- data/lib/k_manager.rb +12 -1
- data/tasks/watch.rake +5 -9
- metadata +22 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 29518b2bd651ed4742111e2a9e3a08ab30cd8fc8fc417f3b628958645f662fed
|
4
|
+
data.tar.gz: f5e88ae2f11dea060f598d06be1e207332d87dfdce86d4a9915ebb8d197b9c7c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 739a4b224ab25f1a0e8ef7bf19c3fa0569141a28ff817b323c167e6a38a9b5c6bc5e4c4532abc20f2444cb1c68c2ffc13579188be9d033e1e219ffba683f6731
|
7
|
+
data.tar.gz: 64aa8b8771591fbd494982211c0e00275daa05019e9577ca173ef2e4b51c75f357d1e2a81e5f49e15fe26be0ac12cb00659b63e45804e55dee4976b97cea308e
|
data/exe/k_manager
CHANGED
@@ -13,8 +13,6 @@ ENV['BUNDLE_GEMFILE'] = gem_path
|
|
13
13
|
|
14
14
|
require 'bundler/setup'
|
15
15
|
require 'k_manager'
|
16
|
+
require 'k_manager/cli/commands'
|
16
17
|
|
17
|
-
|
18
|
-
# options = KBuilder::Watch::Cli.parse_options
|
19
|
-
|
20
|
-
# KBuilder::Watch::Execute.new(options).run
|
18
|
+
Dry::CLI.new(KManager::Cli::Commands).call
|
data/k_manager.gemspec
CHANGED
@@ -47,6 +47,7 @@ Gem::Specification.new do |spec|
|
|
47
47
|
spec.add_dependency 'k_log', '~> 0.0.0'
|
48
48
|
# spec.add_dependency 'k_type' , '~> 0.0.0'
|
49
49
|
# spec.add_dependency 'k_util' , '~> 0.0.0'
|
50
|
+
spec.add_dependency 'dry-cli', '~> 0.7.0'
|
50
51
|
spec.metadata = {
|
51
52
|
'rubygems_mfa_required' => 'true'
|
52
53
|
}
|
data/lib/k_manager/area.rb
CHANGED
@@ -5,12 +5,14 @@ module KManager
|
|
5
5
|
include KLog::Logging
|
6
6
|
extend Forwardable
|
7
7
|
|
8
|
+
attr_reader :manager
|
8
9
|
# TODO: I have not got a use for area name yet, it may be able to drive default config, but not sure.
|
9
10
|
attr_reader :name
|
10
11
|
attr_reader :namespace
|
11
12
|
attr_reader :config
|
12
13
|
|
13
14
|
def initialize(**opts)
|
15
|
+
@manager = opts[:manager]
|
14
16
|
@name = opts[:name]
|
15
17
|
|
16
18
|
raise 'Area name is required' unless @name
|
@@ -23,7 +25,7 @@ module KManager
|
|
23
25
|
@resource_manager ||= KManager::Resources::ResourceManager.new(self)
|
24
26
|
end
|
25
27
|
|
26
|
-
def_delegators :resource_manager, :resource_changed
|
28
|
+
def_delegators :resource_manager, :resource_changed, :resources, :find_by_uri
|
27
29
|
|
28
30
|
def debug(*sections)
|
29
31
|
log.kv 'Area' , name
|
@@ -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,75 @@
|
|
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 :boot_file,
|
18
|
+
default: 'boot.rb',
|
19
|
+
aliases: ['-b'],
|
20
|
+
desc: 'The name of the boot file to create'
|
21
|
+
|
22
|
+
option :force,
|
23
|
+
default: false,
|
24
|
+
aliases: ['-f'],
|
25
|
+
desc: 'Force even if guard fails'
|
26
|
+
|
27
|
+
example [
|
28
|
+
' # Project in current directory - will create a .builders folder and boot file at ./builders/boot.rb',
|
29
|
+
'-b ../config/boot.rb # Project in current directory - will create a .builders folder and boot file at ./config/boot.rb',
|
30
|
+
'my_project # will watch .xmen folder'
|
31
|
+
]
|
32
|
+
|
33
|
+
def call(project_folder:, builder_folder:, boot_file:, log_level:, force:, **)
|
34
|
+
project_folder = absolute_path(project_folder, Dir.pwd)
|
35
|
+
name = File.basename(project_folder)
|
36
|
+
builder_folder = absolute_path(builder_folder, project_folder)
|
37
|
+
boot_file = absolute_path(boot_file, builder_folder)
|
38
|
+
|
39
|
+
log_params(name, project_folder, builder_folder, boot_file, force) if log_level == 'debug'
|
40
|
+
|
41
|
+
create_project(project_folder, builder_folder, boot_file) if can_create?(force, builder_folder)
|
42
|
+
end
|
43
|
+
|
44
|
+
private
|
45
|
+
|
46
|
+
def create_project(project_folder, builder_folder, boot_file)
|
47
|
+
FileUtils.mkdir_p(project_folder)
|
48
|
+
FileUtils.mkdir_p(builder_folder)
|
49
|
+
File.write(boot_file, '# Boot Sequence')
|
50
|
+
# Use a boot_file_template if needed
|
51
|
+
|
52
|
+
log.info 'Project created'
|
53
|
+
end
|
54
|
+
|
55
|
+
def can_create?(force, builder_folder)
|
56
|
+
return true if force
|
57
|
+
return true unless File.directory?(builder_folder)
|
58
|
+
|
59
|
+
log.error "Project builder folder already exists: #{builder_folder}"
|
60
|
+
|
61
|
+
false
|
62
|
+
end
|
63
|
+
|
64
|
+
def log_params(name, project_folder, builder_folder, boot_file, force)
|
65
|
+
log.section_heading('Create new project')
|
66
|
+
log.kv 'name' , name
|
67
|
+
log.kv 'project_folder' , project_folder
|
68
|
+
log.kv 'builder_folder' , builder_folder
|
69
|
+
log.kv 'boot_file' , boot_file
|
70
|
+
log.kv 'force' , force
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
@@ -0,0 +1,49 @@
|
|
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
|
+
# puts builder_folder
|
31
|
+
# puts boot_file
|
32
|
+
|
33
|
+
Dir.chdir(builder_folder) do
|
34
|
+
watcher = KManager::Watcher.new(builder_folder, boot_file)
|
35
|
+
watcher.start
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
private
|
40
|
+
|
41
|
+
def log_params(builder_folder, boot_file)
|
42
|
+
log.section_heading('Watch project')
|
43
|
+
log.kv 'builder_folder' , builder_folder
|
44
|
+
log.kv 'boot_file' , boot_file
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
@@ -11,6 +11,13 @@ module KManager
|
|
11
11
|
class DocumentFactory
|
12
12
|
include KLog::Logging
|
13
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
|
+
|
14
21
|
# Create a KDoc::Model instance
|
15
22
|
def model(key = nil, **opts, &block)
|
16
23
|
document = new_document(KDoc::Model, key, **opts, &block)
|
data/lib/k_manager/manager.rb
CHANGED
@@ -5,6 +5,29 @@ module KManager
|
|
5
5
|
#
|
6
6
|
# TODO: Write Tests
|
7
7
|
class Manager
|
8
|
+
attr_accessor :active_uri
|
9
|
+
|
10
|
+
# NOTE: rename current_resource to active_resource, focused_resource?
|
11
|
+
attr_reader :current_resource
|
12
|
+
|
13
|
+
def resource_mutex
|
14
|
+
@resource_mutex ||= Mutex.new
|
15
|
+
end
|
16
|
+
|
17
|
+
def for_resource(resource = nil)
|
18
|
+
resource_mutex.synchronize do
|
19
|
+
@current_resource = resource
|
20
|
+
yield(current_resource)
|
21
|
+
@current_resource = nil
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
def for_current_resource
|
26
|
+
raise KManager::Error, 'Attempting to yield current_resource, when a different thread has the lock?' unless resource_mutex.owned?
|
27
|
+
|
28
|
+
yield(@current_resource)
|
29
|
+
end
|
30
|
+
|
8
31
|
def areas
|
9
32
|
@areas ||= []
|
10
33
|
end
|
@@ -14,11 +37,24 @@ module KManager
|
|
14
37
|
|
15
38
|
return area if area
|
16
39
|
|
17
|
-
area = KManager::Area.new(name: name, namespace: namespace)
|
40
|
+
area = KManager::Area.new(manager: self, name: name, namespace: namespace)
|
18
41
|
areas << area
|
19
42
|
area
|
20
43
|
end
|
21
44
|
|
45
|
+
def find_document(tag, area: nil)
|
46
|
+
area = resolve_area(area)
|
47
|
+
|
48
|
+
log.error 'Could not resolve area' if area.nil?
|
49
|
+
|
50
|
+
log.line
|
51
|
+
log.error(tag)
|
52
|
+
log.line
|
53
|
+
|
54
|
+
documents = area.resources.flat_map(&:documents)
|
55
|
+
documents.find { |d| d.tag == tag }
|
56
|
+
end
|
57
|
+
|
22
58
|
def fire_actions(*actions)
|
23
59
|
areas.each do |area|
|
24
60
|
# delegate
|
@@ -30,10 +66,31 @@ module KManager
|
|
30
66
|
areas.find { |a| a.name == name }
|
31
67
|
end
|
32
68
|
|
69
|
+
def resolve_area(area)
|
70
|
+
if area.nil?
|
71
|
+
return KManager.current_resource.area if KManager.current_resource
|
72
|
+
|
73
|
+
return KManager.areas.first
|
74
|
+
end
|
75
|
+
|
76
|
+
return area if area.is_a?(Area)
|
77
|
+
|
78
|
+
find_area(name)
|
79
|
+
end
|
80
|
+
|
81
|
+
# Return a list of resources for a URI.
|
82
|
+
#
|
83
|
+
# Generally only one resource is returned, unless the URI exists in more than one area
|
84
|
+
def resources_by_uri(uri)
|
85
|
+
areas.map { |area| area.resources_by_uri(uri) }.compact
|
86
|
+
end
|
87
|
+
|
33
88
|
def resource_changed(uri, state)
|
89
|
+
@active_uri = uri
|
34
90
|
areas.each do |area|
|
35
91
|
area.resource_changed(uri, state)
|
36
92
|
end
|
93
|
+
@active_uri = nil
|
37
94
|
end
|
38
95
|
|
39
96
|
def debug(*sections)
|
@@ -42,6 +99,8 @@ module KManager
|
|
42
99
|
end
|
43
100
|
end
|
44
101
|
|
102
|
+
# def cons
|
103
|
+
|
45
104
|
# # May replace config with default channel name
|
46
105
|
# # Channels represent configurations that are independent of project or builder,
|
47
106
|
# # but a project may want to have a default channel that it supplies
|
@@ -52,7 +52,8 @@ module KManager
|
|
52
52
|
{ scheme: { display_method: ->(row) { row.scheme } } },
|
53
53
|
{ root: { display_method: ->(row) { row.scheme == :file ? '' : row.host } } },
|
54
54
|
{ relative_path: { display_method: ->(row) { right(50, row.relative_path) }, width: 50 } },
|
55
|
-
{ exist: { display_method: ->(row) { row.exist } } }
|
55
|
+
{ exist: { display_method: ->(row) { row.exist } } } # ,
|
56
|
+
# { resource_path: { display_method: ->(row) { row.path }, width: 100 } }
|
56
57
|
]
|
57
58
|
}
|
58
59
|
}
|
@@ -87,6 +87,7 @@ module KManager
|
|
87
87
|
self.uri = uri
|
88
88
|
|
89
89
|
@status = :alive
|
90
|
+
@area = value_remove(opts, :area)
|
90
91
|
@namespace = value_remove(opts, :namespace)
|
91
92
|
@content_type = @content_type || value_remove(opts, :content_type) || infer_content_type || default_content_type
|
92
93
|
@content = value_remove(opts, :content)
|
@@ -100,10 +101,20 @@ module KManager
|
|
100
101
|
uri.to_s
|
101
102
|
end
|
102
103
|
|
104
|
+
# TODO: Is this really needed?
|
103
105
|
def document
|
104
106
|
@document ||= documents&.first
|
105
107
|
end
|
106
108
|
|
109
|
+
def activated?
|
110
|
+
# log.section_heading("Am I activated?")
|
111
|
+
# log.kv 'URI', uri
|
112
|
+
# log.kv 'ACTIVE URI', self.area.manager.active_uri
|
113
|
+
return false if area.nil?
|
114
|
+
|
115
|
+
uri.to_s == area.manager.active_uri.to_s
|
116
|
+
end
|
117
|
+
|
107
118
|
# Fire actions and keep track of status as they fire
|
108
119
|
#
|
109
120
|
# @param [Symbol] action what action is to be fired
|
@@ -158,7 +169,9 @@ module KManager
|
|
158
169
|
# rubocop:disable Lint/RescueException
|
159
170
|
def load_document
|
160
171
|
# log.warn 'you need to implement register_document'
|
161
|
-
documents.each
|
172
|
+
documents.each do |document|
|
173
|
+
document.execute_block(run_actions: activated?)
|
174
|
+
end
|
162
175
|
rescue Exception => e
|
163
176
|
guard(e.message)
|
164
177
|
debug
|
@@ -81,6 +81,8 @@ module KManager
|
|
81
81
|
# KManager::Manager.current_resource
|
82
82
|
# KDsl.target_resource = self
|
83
83
|
|
84
|
+
log.error "#{resource.activated?} - #{resource.resource_path}"
|
85
|
+
|
84
86
|
Object.class_eval resource.content, resource.resource_path
|
85
87
|
|
86
88
|
# # Only DSL's will add new resource_documents
|
@@ -3,25 +3,6 @@
|
|
3
3
|
module KManager
|
4
4
|
# TODO: Write tests
|
5
5
|
|
6
|
-
# Usage1:
|
7
|
-
# manager = ResourceManager.new
|
8
|
-
# manager.add_resource('file:///david.csv')
|
9
|
-
# manager.add_resource('file:///david.txt', content_type: :json)
|
10
|
-
# manager.add_resource('https://gist.github.com/12345/david.csv', content_type: :csv)
|
11
|
-
# manager.load_resource_content
|
12
|
-
#
|
13
|
-
# Usage2:
|
14
|
-
# manager = ResourceManager.new
|
15
|
-
# manager.fileset.add('**/*.csv').add('**/*.json').add('lib/*.rb')
|
16
|
-
# manager.add_resources
|
17
|
-
# manager.load_resource_content
|
18
|
-
#
|
19
|
-
#
|
20
|
-
# Usage KWatcher
|
21
|
-
# WatchingDirctory('abc') do |path|
|
22
|
-
# manager.update_resource(path)
|
23
|
-
# end
|
24
|
-
|
25
6
|
# Example Director
|
26
7
|
# KDoc.diagram(:k_resource) do
|
27
8
|
|
@@ -86,7 +67,10 @@ module KManager
|
|
86
67
|
update_resource(resource_uri) if state == :updated
|
87
68
|
delete_resource(resource_uri) if state == :deleted
|
88
69
|
|
89
|
-
|
70
|
+
return if valid?
|
71
|
+
|
72
|
+
log_any_messages
|
73
|
+
clear_errors
|
90
74
|
end
|
91
75
|
|
92
76
|
def create_resource(resource_uri)
|
@@ -105,6 +89,7 @@ module KManager
|
|
105
89
|
|
106
90
|
return warn("Resource not in Resource Set - Skipping: #{resource_uri.path}") unless resource
|
107
91
|
|
92
|
+
# TODO: Do I need to recreate, can I just reset instead?
|
108
93
|
replace_resource = resource.recreate(resource)
|
109
94
|
replace_resource.fire_action(:load_content)
|
110
95
|
replace_resource.fire_action(:register_document)
|
data/lib/k_manager/version.rb
CHANGED
data/lib/k_manager/watcher.rb
CHANGED
@@ -7,10 +7,10 @@ module KManager
|
|
7
7
|
# NOTE: Does Watcher belong in this GEM?
|
8
8
|
class Watcher
|
9
9
|
include KLog::Logging
|
10
|
-
|
10
|
+
|
11
11
|
attr_reader :watch_folder
|
12
12
|
attr_reader :boot_file
|
13
|
-
|
13
|
+
|
14
14
|
def initialize(watch_folder, boot_file)
|
15
15
|
@watch_folder = watch_folder
|
16
16
|
@boot_file = boot_file
|
@@ -22,7 +22,7 @@ module KManager
|
|
22
22
|
|
23
23
|
# rubocop:disable Lint/RescueException
|
24
24
|
def start
|
25
|
-
|
25
|
+
boot_up
|
26
26
|
|
27
27
|
update_dashboard
|
28
28
|
|
@@ -31,11 +31,12 @@ module KManager
|
|
31
31
|
clear_screen
|
32
32
|
|
33
33
|
puts "File #{event}: #{filename}"
|
34
|
-
|
34
|
+
|
35
35
|
uri = URI::File.build(host: nil, path: filename)
|
36
36
|
KManager.resource_changed(uri, event)
|
37
|
-
|
37
|
+
|
38
38
|
update_dashboard
|
39
|
+
puts "File #{event}: #{filename}"
|
39
40
|
end
|
40
41
|
end
|
41
42
|
rescue Exception => e
|
@@ -43,30 +44,35 @@ module KManager
|
|
43
44
|
log.exception(e, style: :short)
|
44
45
|
end
|
45
46
|
# rubocop:enable Lint/RescueException
|
46
|
-
|
47
|
+
|
47
48
|
private
|
48
|
-
|
49
|
-
def
|
49
|
+
|
50
|
+
def boot_up
|
50
51
|
clear_screen
|
51
|
-
|
52
|
-
|
53
|
-
|
52
|
+
|
53
|
+
if File.exist?(boot_file)
|
54
|
+
content = File.read(boot_file)
|
55
|
+
Object.class_eval(content, boot_file)
|
56
|
+
return
|
57
|
+
end
|
58
|
+
|
59
|
+
log.error("Boot file not found: #{boot_file}")
|
54
60
|
end
|
55
|
-
|
61
|
+
|
56
62
|
def update_dashboard
|
57
63
|
dashboard = KManager::Overview::Dashboard.new(KManager.manager)
|
58
64
|
# dashboard.areas
|
59
65
|
dashboard.resources
|
60
66
|
dashboard.documents
|
61
67
|
end
|
62
|
-
|
68
|
+
|
63
69
|
def update_load_path(filename)
|
64
70
|
dirname = File.dirname(filename)
|
65
|
-
|
71
|
+
|
66
72
|
# This needs to be in detailed logging
|
67
73
|
$LOAD_PATH.unshift(dirname) unless $LOAD_PATH.find { |path| path.start_with?(dirname) }
|
68
74
|
end
|
69
|
-
|
75
|
+
|
70
76
|
def clear_screen
|
71
77
|
puts "\n" * 70
|
72
78
|
$stdout.clear_screen
|
data/lib/k_manager.rb
CHANGED
@@ -30,6 +30,7 @@ require 'k_manager/resources/resource_manager'
|
|
30
30
|
require 'k_manager/document_factory'
|
31
31
|
require 'k_manager/manager'
|
32
32
|
require 'k_manager/area'
|
33
|
+
require 'k_manager/watcher'
|
33
34
|
|
34
35
|
module KManager
|
35
36
|
# raise KManager::Error, 'Sample message'
|
@@ -42,6 +43,7 @@ module KManager
|
|
42
43
|
# Concurrency management for currently focused resource
|
43
44
|
# ----------------------------------------------------------------------
|
44
45
|
|
46
|
+
# NOTE: Can mutex be moved into manager?
|
45
47
|
attr_reader :current_resource
|
46
48
|
|
47
49
|
def resource_mutex
|
@@ -94,7 +96,7 @@ module KManager
|
|
94
96
|
@manager = Manager.new
|
95
97
|
end
|
96
98
|
|
97
|
-
def_delegators :manager, :areas, :add_area, :fire_actions, :resource_changed
|
99
|
+
def_delegators :manager, :areas, :add_area, :find_document, :fire_actions, :resource_changed
|
98
100
|
|
99
101
|
# ----------------------------------------------------------------------
|
100
102
|
# Document factory facade methods
|
@@ -112,6 +114,15 @@ module KManager
|
|
112
114
|
block.call(config) if block_given?
|
113
115
|
config
|
114
116
|
end
|
117
|
+
|
118
|
+
# ----------------------------------------------------------------------
|
119
|
+
# Utilities
|
120
|
+
# ----------------------------------------------------------------------
|
121
|
+
|
122
|
+
def clear_screen
|
123
|
+
puts "\n" * 70
|
124
|
+
$stdout.clear_screen
|
125
|
+
end
|
115
126
|
end
|
116
127
|
end
|
117
128
|
|
data/tasks/watch.rake
CHANGED
@@ -6,7 +6,7 @@ require 'k_manager'
|
|
6
6
|
# require 'io/console'
|
7
7
|
|
8
8
|
namespace :k_manager do
|
9
|
-
desc '
|
9
|
+
desc 'Watch '
|
10
10
|
task :watch do
|
11
11
|
target_folder = 'spec/k_manager/scenarios'
|
12
12
|
watch_folder = File.join(Dir.pwd, target_folder)
|
@@ -33,7 +33,7 @@ end
|
|
33
33
|
# @boot_file = boot_file
|
34
34
|
# end
|
35
35
|
|
36
|
-
#
|
36
|
+
#
|
37
37
|
# def start
|
38
38
|
# boot(boot_file)
|
39
39
|
# update_dashboard
|
@@ -56,9 +56,7 @@ end
|
|
56
56
|
# # TODO: Make style a setting: :message, :short, (whatever the last one is)
|
57
57
|
# log.exception(e, style: :short)
|
58
58
|
# end
|
59
|
-
# #
|
60
|
-
|
61
|
-
# private
|
59
|
+
# # private
|
62
60
|
|
63
61
|
# def boot(boot_file)
|
64
62
|
# clear_screen
|
@@ -67,7 +65,7 @@ end
|
|
67
65
|
# Object.class_eval(content, boot_file)
|
68
66
|
# end
|
69
67
|
|
70
|
-
#
|
68
|
+
#
|
71
69
|
# def process_updated_file(filename)
|
72
70
|
# clear_screen
|
73
71
|
# update_load_path(filename)
|
@@ -90,9 +88,7 @@ end
|
|
90
88
|
# # TODO: Make style a setting: :message, :short, (whatever the last one is)
|
91
89
|
# log.exception(e, style: :short)
|
92
90
|
# end
|
93
|
-
# #
|
94
|
-
|
95
|
-
# def update_dashboard
|
91
|
+
# # def update_dashboard
|
96
92
|
# dashboard = KManager::Overview::Dashboard.new(KManager.manager)
|
97
93
|
# dashboard.areas
|
98
94
|
# dashboard.resources
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: k_manager
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.23
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- David Cruwys
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2021-12-
|
11
|
+
date: 2021-12-20 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: dry-struct
|
@@ -108,6 +108,20 @@ dependencies:
|
|
108
108
|
- - "~>"
|
109
109
|
- !ruby/object:Gem::Version
|
110
110
|
version: 0.0.0
|
111
|
+
- !ruby/object:Gem::Dependency
|
112
|
+
name: dry-cli
|
113
|
+
requirement: !ruby/object:Gem::Requirement
|
114
|
+
requirements:
|
115
|
+
- - "~>"
|
116
|
+
- !ruby/object:Gem::Version
|
117
|
+
version: 0.7.0
|
118
|
+
type: :runtime
|
119
|
+
prerelease: false
|
120
|
+
version_requirements: !ruby/object:Gem::Requirement
|
121
|
+
requirements:
|
122
|
+
- - "~>"
|
123
|
+
- !ruby/object:Gem::Version
|
124
|
+
version: 0.7.0
|
111
125
|
description: " K Manager provides a managed host for documents, resources and code
|
112
126
|
generator execution\n"
|
113
127
|
email:
|
@@ -142,6 +156,12 @@ files:
|
|
142
156
|
- k_manager.gemspec
|
143
157
|
- lib/k_manager.rb
|
144
158
|
- lib/k_manager/area.rb
|
159
|
+
- lib/k_manager/cli/base_command.rb
|
160
|
+
- lib/k_manager/cli/commands.rb
|
161
|
+
- lib/k_manager/cli/info.rb
|
162
|
+
- lib/k_manager/cli/new.rb
|
163
|
+
- lib/k_manager/cli/version.rb
|
164
|
+
- lib/k_manager/cli/watch.rb
|
145
165
|
- lib/k_manager/configuration/project_config.rb
|
146
166
|
- lib/k_manager/document_factory.rb
|
147
167
|
- lib/k_manager/manager.rb
|