taskloop 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
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: []