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.
Files changed (45) hide show
  1. checksums.yaml +7 -0
  2. data/.idea/.gitignore +8 -0
  3. data/.idea/misc.xml +4 -0
  4. data/.idea/modules.xml +8 -0
  5. data/.idea/taskloop.iml +51 -0
  6. data/.idea/vcs.xml +6 -0
  7. data/Gemfile +9 -0
  8. data/Gemfile.lock +36 -0
  9. data/README.md +31 -0
  10. data/Rakefile +4 -0
  11. data/exe/taskloop +16 -0
  12. data/lib/taskloop/command/deploy.rb +136 -0
  13. data/lib/taskloop/command/env.rb +134 -0
  14. data/lib/taskloop/command/init.rb +42 -0
  15. data/lib/taskloop/command/launch.rb +67 -0
  16. data/lib/taskloop/command/list.rb +59 -0
  17. data/lib/taskloop/command/log.rb +104 -0
  18. data/lib/taskloop/command/run.rb +106 -0
  19. data/lib/taskloop/command/shutdown.rb +49 -0
  20. data/lib/taskloop/command/undeploy.rb +46 -0
  21. data/lib/taskloop/command.rb +168 -0
  22. data/lib/taskloop/dsl/dsl.rb +63 -0
  23. data/lib/taskloop/extension/integer_extension.rb +25 -0
  24. data/lib/taskloop/extension/string_extension.rb +18 -0
  25. data/lib/taskloop/rules/after_scope_rule.rb +91 -0
  26. data/lib/taskloop/rules/before_scope_rule.rb +90 -0
  27. data/lib/taskloop/rules/between_scope_rule.rb +130 -0
  28. data/lib/taskloop/rules/date_list_rule.rb +47 -0
  29. data/lib/taskloop/rules/default_rule.rb +19 -0
  30. data/lib/taskloop/rules/interval_rule.rb +26 -0
  31. data/lib/taskloop/rules/loop_rule.rb +25 -0
  32. data/lib/taskloop/rules/rule.rb +34 -0
  33. data/lib/taskloop/rules/scope_rule.rb +22 -0
  34. data/lib/taskloop/rules/specific_rule.rb +64 -0
  35. data/lib/taskloop/rules/time_list_rule.rb +49 -0
  36. data/lib/taskloop/task/task.rb +244 -0
  37. data/lib/taskloop/task/task_data_file.rb +46 -0
  38. data/lib/taskloop/task/task_error.rb +17 -0
  39. data/lib/taskloop/task/task_property.rb +294 -0
  40. data/lib/taskloop/utils/proj_tasklist.rb +145 -0
  41. data/lib/taskloop/version.rb +5 -0
  42. data/lib/taskloop.rb +9 -0
  43. data/sig/taskloop.rbs +4 -0
  44. data/taskloop.gemspec +37 -0
  45. 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
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ module TaskLoop
4
+ VERSION = "0.1.0"
5
+ end
data/lib/taskloop.rb ADDED
@@ -0,0 +1,9 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "taskloop/version"
4
+
5
+ module TaskLoop
6
+ class Error < StandardError; end
7
+ # Your code goes here...
8
+ autoload :Command, 'taskloop/command'
9
+ end
data/sig/taskloop.rbs ADDED
@@ -0,0 +1,4 @@
1
+ module Taskloop
2
+ VERSION: String
3
+ # See the writing guide of rbs: https://github.com/ruby/rbs#guides
4
+ end
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: []