k_manager 0.0.22 → 0.0.23
Sign up to get free protection for your applications and to get access to all the features.
- 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
|