taskloop 0.1.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/.idea/.gitignore +8 -0
- data/.idea/misc.xml +4 -0
- data/.idea/modules.xml +8 -0
- data/.idea/taskloop.iml +51 -0
- data/.idea/vcs.xml +6 -0
- data/Gemfile +9 -0
- data/Gemfile.lock +36 -0
- data/README.md +31 -0
- data/Rakefile +4 -0
- data/exe/taskloop +16 -0
- data/lib/taskloop/command/deploy.rb +136 -0
- data/lib/taskloop/command/env.rb +134 -0
- data/lib/taskloop/command/init.rb +42 -0
- data/lib/taskloop/command/launch.rb +67 -0
- data/lib/taskloop/command/list.rb +59 -0
- data/lib/taskloop/command/log.rb +104 -0
- data/lib/taskloop/command/run.rb +106 -0
- data/lib/taskloop/command/shutdown.rb +49 -0
- data/lib/taskloop/command/undeploy.rb +46 -0
- data/lib/taskloop/command.rb +168 -0
- data/lib/taskloop/dsl/dsl.rb +63 -0
- data/lib/taskloop/extension/integer_extension.rb +25 -0
- data/lib/taskloop/extension/string_extension.rb +18 -0
- data/lib/taskloop/rules/after_scope_rule.rb +91 -0
- data/lib/taskloop/rules/before_scope_rule.rb +90 -0
- data/lib/taskloop/rules/between_scope_rule.rb +130 -0
- data/lib/taskloop/rules/date_list_rule.rb +47 -0
- data/lib/taskloop/rules/default_rule.rb +19 -0
- data/lib/taskloop/rules/interval_rule.rb +26 -0
- data/lib/taskloop/rules/loop_rule.rb +25 -0
- data/lib/taskloop/rules/rule.rb +34 -0
- data/lib/taskloop/rules/scope_rule.rb +22 -0
- data/lib/taskloop/rules/specific_rule.rb +64 -0
- data/lib/taskloop/rules/time_list_rule.rb +49 -0
- data/lib/taskloop/task/task.rb +244 -0
- data/lib/taskloop/task/task_data_file.rb +46 -0
- data/lib/taskloop/task/task_error.rb +17 -0
- data/lib/taskloop/task/task_property.rb +294 -0
- data/lib/taskloop/utils/proj_tasklist.rb +145 -0
- data/lib/taskloop/version.rb +5 -0
- data/lib/taskloop.rb +9 -0
- data/sig/taskloop.rbs +4 -0
- data/taskloop.gemspec +37 -0
- metadata +103 -0
@@ -0,0 +1,145 @@
|
|
1
|
+
|
2
|
+
module TaskLoop
|
3
|
+
module ProjTaskList
|
4
|
+
attr_reader :proj_tasklist_map
|
5
|
+
|
6
|
+
def proj_tasklist_map
|
7
|
+
@proj_tasklist_map ||= {}
|
8
|
+
end
|
9
|
+
|
10
|
+
def create_data_proj_dir_if_needed
|
11
|
+
taskloop_proj_list_dirs.each do |dir|
|
12
|
+
# create ~/.tasklooop/data/<proj-sha1-8bit>/ dir
|
13
|
+
data_proj_dir = File.join(taskloop_data_dir, dir.sha1_8bit)
|
14
|
+
create_dir_if_needed(data_proj_dir)
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
def create_data_proj_description_if_needed
|
19
|
+
taskloop_proj_list_dirs.each do |dir|
|
20
|
+
# create ~/.taskloop/data/<proj_sha1-8bit>/.description
|
21
|
+
data_proj_description_path = File.join(taskloop_data_dir, dir.sha1_8bit, ".description")
|
22
|
+
unless File.exists?(data_proj_description_path)
|
23
|
+
desc = File.new(data_proj_description_path, "w+")
|
24
|
+
desc.puts dir
|
25
|
+
desc.close
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
|
31
|
+
def construct_proj_tasklist_map
|
32
|
+
# load Taskfiles from ~/.taskloop/projlist
|
33
|
+
taskloop_proj_list_dirs.each do |dir|
|
34
|
+
deploy_file_path = File.join(taskloop_data_dir, dir.sha1_8bit,".Taskfile.deploy")
|
35
|
+
unless File.exists?(deploy_file_path)
|
36
|
+
puts "Warning: #{deploy_file_path} is not exist, taskloop will skip its execution.".ansi.yellow
|
37
|
+
proj_tasklist_map[dir] = []
|
38
|
+
next
|
39
|
+
end
|
40
|
+
eval_taskfile(deploy_file_path)
|
41
|
+
proj_tasklist_map[dir] = TaskLoop::Task.tasklist
|
42
|
+
TaskLoop::Task.tasklist = []
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
private def setup_task_property
|
47
|
+
unless @proj_tasklist_map != nil
|
48
|
+
return
|
49
|
+
end
|
50
|
+
@proj_tasklist_map.each do |proj, list|
|
51
|
+
list.each do |task|
|
52
|
+
data_proj_dir = File.join(taskloop_data_dir, proj.sha1_8bit)
|
53
|
+
# set properties for task
|
54
|
+
task.data_proj_dir = data_proj_dir
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
private def create_data_proj_task_log_if_needed
|
60
|
+
unless @proj_tasklist_map != nil
|
61
|
+
return
|
62
|
+
end
|
63
|
+
@proj_tasklist_map.each do |proj, list|
|
64
|
+
list.each do |task|
|
65
|
+
data_proj_dir = File.join(taskloop_data_dir, proj.sha1_8bit)
|
66
|
+
|
67
|
+
task_cache_log_path = File.join(data_proj_dir, task.logfile_name)
|
68
|
+
unless File.file?(task_cache_log_path)
|
69
|
+
File.new(task_cache_log_path, "w+")
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
private def create_data_proj_task_time_if_needed
|
76
|
+
unless @proj_tasklist_map != nil
|
77
|
+
return
|
78
|
+
end
|
79
|
+
@proj_tasklist_map.each do |proj, list|
|
80
|
+
list.each do |task|
|
81
|
+
data_proj_dir = File.join(taskloop_data_dir, proj.sha1_8bit)
|
82
|
+
|
83
|
+
task_cache_time_path = File.join(data_proj_dir, task.timefile_name)
|
84
|
+
unless File.file?(task_cache_time_path)
|
85
|
+
file = File.new(task_cache_time_path, "w+")
|
86
|
+
file.puts "0"
|
87
|
+
file.close
|
88
|
+
end
|
89
|
+
end
|
90
|
+
end
|
91
|
+
end
|
92
|
+
|
93
|
+
private def create_data_proj_task_loop_if_needed
|
94
|
+
unless @proj_tasklist_map != nil
|
95
|
+
return
|
96
|
+
end
|
97
|
+
@proj_tasklist_map.each do |proj, list|
|
98
|
+
list.each do |task|
|
99
|
+
data_proj_dir = File.join(taskloop_data_dir, proj.sha1_8bit)
|
100
|
+
|
101
|
+
task_cache_loop_path = File.join(data_proj_dir, task.loopfile_name)
|
102
|
+
unless File.file?(task_cache_loop_path)
|
103
|
+
File.new(task_cache_loop_path, "w+")
|
104
|
+
end
|
105
|
+
end
|
106
|
+
end
|
107
|
+
end
|
108
|
+
|
109
|
+
def eval_taskfile(path)
|
110
|
+
string = File.open(path, 'r:utf-8', &:read)
|
111
|
+
if string.respond_to?(:encoding) && string.encoding.name != 'UTF-8'
|
112
|
+
string.encode!('UTF-8')
|
113
|
+
end
|
114
|
+
eval(string)
|
115
|
+
rescue Exception => e
|
116
|
+
message = "Invalid `#{path}` file: #{e.message}"
|
117
|
+
# TODO: @baocq
|
118
|
+
raise ArgumentError, "test"
|
119
|
+
end
|
120
|
+
|
121
|
+
def clean_cache_file_if_needed
|
122
|
+
unless @proj_tasklist_map != nil
|
123
|
+
return
|
124
|
+
end
|
125
|
+
|
126
|
+
@proj_tasklist_map.each do |proj, list|
|
127
|
+
data_proj_dir = File.join(taskloop_data_dir, proj.sha1_8bit)
|
128
|
+
files = Dir.entries(data_proj_dir)
|
129
|
+
|
130
|
+
list.each do |task|
|
131
|
+
files.delete(task.logfile_name)
|
132
|
+
files.delete(task.timefile_name)
|
133
|
+
files.delete(task.loopfile_name)
|
134
|
+
end
|
135
|
+
|
136
|
+
files.each do |file|
|
137
|
+
path = File.join(data_proj_dir, file)
|
138
|
+
if file != '.' && file != '..' && file != '.Taskfile.deploy' && file != '.description' && File.exists?(path)
|
139
|
+
File.delete(path)
|
140
|
+
end
|
141
|
+
end
|
142
|
+
end
|
143
|
+
end
|
144
|
+
end
|
145
|
+
end
|
data/lib/taskloop.rb
ADDED
data/sig/taskloop.rbs
ADDED
data/taskloop.gemspec
ADDED
@@ -0,0 +1,37 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative "lib/taskloop/version"
|
4
|
+
|
5
|
+
Gem::Specification.new do |spec|
|
6
|
+
spec.name = "taskloop"
|
7
|
+
spec.version = TaskLoop::VERSION
|
8
|
+
spec.authors = ["baochuquan"]
|
9
|
+
spec.email = ["baochuquan@163.com"]
|
10
|
+
|
11
|
+
spec.summary = "A highly flexible and customizable scheduled task manager."
|
12
|
+
spec.description = "Based on cron, with more flexible rule configurations."
|
13
|
+
spec.homepage = "https://github.com/baochuquan/taskloop"
|
14
|
+
spec.required_ruby_version = ">= 2.6.0"
|
15
|
+
|
16
|
+
spec.metadata["homepage_uri"] = spec.homepage
|
17
|
+
spec.metadata["source_code_uri"] = "https://github.com/baochuquan/taskloop"
|
18
|
+
spec.metadata["changelog_uri"] = "https://github.com/baochuquan/taskloop"
|
19
|
+
|
20
|
+
# Specify which files should be added to the gem when it is released.
|
21
|
+
# The `git ls-files -z` loads the files in the RubyGem that have been added into git.
|
22
|
+
spec.files = Dir.chdir(__dir__) do
|
23
|
+
`git ls-files -z`.split("\x0").reject do |f|
|
24
|
+
(f == __FILE__) || f.match(%r{\A(?:(?:bin|test|spec|features)/|\.(?:git|travis|circleci)|appveyor)})
|
25
|
+
end
|
26
|
+
end
|
27
|
+
spec.bindir = "exe"
|
28
|
+
spec.executables = "taskloop"
|
29
|
+
spec.require_paths = ["lib"]
|
30
|
+
|
31
|
+
# Uncomment to register a new dependency of your gem
|
32
|
+
# spec.add_dependency "example-gem", "~> 1.0"
|
33
|
+
spec.add_dependency 'claide', '~> 1.0.3'
|
34
|
+
|
35
|
+
# For more information and examples about making a new gem, check out our
|
36
|
+
# guide at: https://bundler.io/guides/creating_gem.html
|
37
|
+
end
|
metadata
ADDED
@@ -0,0 +1,103 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: taskloop
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- baochuquan
|
8
|
+
autorequire:
|
9
|
+
bindir: exe
|
10
|
+
cert_chain: []
|
11
|
+
date: 2023-07-26 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: claide
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: 1.0.3
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: 1.0.3
|
27
|
+
description: Based on cron, with more flexible rule configurations.
|
28
|
+
email:
|
29
|
+
- baochuquan@163.com
|
30
|
+
executables:
|
31
|
+
- taskloop
|
32
|
+
extensions: []
|
33
|
+
extra_rdoc_files: []
|
34
|
+
files:
|
35
|
+
- ".idea/.gitignore"
|
36
|
+
- ".idea/misc.xml"
|
37
|
+
- ".idea/modules.xml"
|
38
|
+
- ".idea/taskloop.iml"
|
39
|
+
- ".idea/vcs.xml"
|
40
|
+
- Gemfile
|
41
|
+
- Gemfile.lock
|
42
|
+
- README.md
|
43
|
+
- Rakefile
|
44
|
+
- exe/taskloop
|
45
|
+
- lib/taskloop.rb
|
46
|
+
- lib/taskloop/command.rb
|
47
|
+
- lib/taskloop/command/deploy.rb
|
48
|
+
- lib/taskloop/command/env.rb
|
49
|
+
- lib/taskloop/command/init.rb
|
50
|
+
- lib/taskloop/command/launch.rb
|
51
|
+
- lib/taskloop/command/list.rb
|
52
|
+
- lib/taskloop/command/log.rb
|
53
|
+
- lib/taskloop/command/run.rb
|
54
|
+
- lib/taskloop/command/shutdown.rb
|
55
|
+
- lib/taskloop/command/undeploy.rb
|
56
|
+
- lib/taskloop/dsl/dsl.rb
|
57
|
+
- lib/taskloop/extension/integer_extension.rb
|
58
|
+
- lib/taskloop/extension/string_extension.rb
|
59
|
+
- lib/taskloop/rules/after_scope_rule.rb
|
60
|
+
- lib/taskloop/rules/before_scope_rule.rb
|
61
|
+
- lib/taskloop/rules/between_scope_rule.rb
|
62
|
+
- lib/taskloop/rules/date_list_rule.rb
|
63
|
+
- lib/taskloop/rules/default_rule.rb
|
64
|
+
- lib/taskloop/rules/interval_rule.rb
|
65
|
+
- lib/taskloop/rules/loop_rule.rb
|
66
|
+
- lib/taskloop/rules/rule.rb
|
67
|
+
- lib/taskloop/rules/scope_rule.rb
|
68
|
+
- lib/taskloop/rules/specific_rule.rb
|
69
|
+
- lib/taskloop/rules/time_list_rule.rb
|
70
|
+
- lib/taskloop/task/task.rb
|
71
|
+
- lib/taskloop/task/task_data_file.rb
|
72
|
+
- lib/taskloop/task/task_error.rb
|
73
|
+
- lib/taskloop/task/task_property.rb
|
74
|
+
- lib/taskloop/utils/proj_tasklist.rb
|
75
|
+
- lib/taskloop/version.rb
|
76
|
+
- sig/taskloop.rbs
|
77
|
+
- taskloop.gemspec
|
78
|
+
homepage: https://github.com/baochuquan/taskloop
|
79
|
+
licenses: []
|
80
|
+
metadata:
|
81
|
+
homepage_uri: https://github.com/baochuquan/taskloop
|
82
|
+
source_code_uri: https://github.com/baochuquan/taskloop
|
83
|
+
changelog_uri: https://github.com/baochuquan/taskloop
|
84
|
+
post_install_message:
|
85
|
+
rdoc_options: []
|
86
|
+
require_paths:
|
87
|
+
- lib
|
88
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
89
|
+
requirements:
|
90
|
+
- - ">="
|
91
|
+
- !ruby/object:Gem::Version
|
92
|
+
version: 2.6.0
|
93
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
94
|
+
requirements:
|
95
|
+
- - ">="
|
96
|
+
- !ruby/object:Gem::Version
|
97
|
+
version: '0'
|
98
|
+
requirements: []
|
99
|
+
rubygems_version: 3.0.9
|
100
|
+
signing_key:
|
101
|
+
specification_version: 4
|
102
|
+
summary: A highly flexible and customizable scheduled task manager.
|
103
|
+
test_files: []
|