lazylead 0.4.2 → 0.6.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (67) hide show
  1. checksums.yaml +4 -4
  2. data/.docs/accuracy.md +2 -2
  3. data/.docs/duedate_expired.md +3 -3
  4. data/.docs/propagate_down.md +3 -3
  5. data/.gitattributes +1 -0
  6. data/.github/dependabot.yml +6 -0
  7. data/Rakefile +6 -3
  8. data/bin/lazylead +7 -5
  9. data/lazylead.gemspec +5 -3
  10. data/lib/lazylead/cli/app.rb +5 -2
  11. data/lib/lazylead/exchange.rb +15 -9
  12. data/lib/lazylead/log.rb +2 -1
  13. data/lib/lazylead/model.rb +35 -1
  14. data/lib/lazylead/opts.rb +13 -0
  15. data/lib/lazylead/postman.rb +13 -7
  16. data/lib/lazylead/schedule.rb +16 -15
  17. data/lib/lazylead/smtp.rb +3 -1
  18. data/lib/lazylead/system/jira.rb +65 -4
  19. data/lib/lazylead/task/accuracy/accuracy.rb +13 -8
  20. data/lib/lazylead/task/accuracy/affected_build.rb +2 -6
  21. data/lib/lazylead/task/accuracy/attachment.rb +44 -0
  22. data/lib/lazylead/task/accuracy/environment.rb +39 -0
  23. data/lib/lazylead/task/accuracy/logs.rb +42 -0
  24. data/lib/lazylead/task/accuracy/records.rb +45 -0
  25. data/lib/lazylead/task/accuracy/requirement.rb +9 -0
  26. data/lib/lazylead/task/accuracy/servers.rb +50 -0
  27. data/lib/lazylead/task/accuracy/stacktrace.rb +103 -0
  28. data/lib/lazylead/task/accuracy/testcase.rb +91 -0
  29. data/lib/lazylead/task/accuracy/wiki.rb +41 -0
  30. data/lib/lazylead/task/assignment.rb +96 -0
  31. data/lib/lazylead/task/echo.rb +18 -0
  32. data/lib/lazylead/task/fix_version.rb +13 -2
  33. data/lib/lazylead/task/svn/diff.rb +76 -0
  34. data/lib/lazylead/task/svn/grep.rb +111 -0
  35. data/lib/lazylead/task/svn/touch.rb +101 -0
  36. data/lib/lazylead/version.rb +1 -1
  37. data/lib/messages/illegal_assignee_change.erb +123 -0
  38. data/lib/messages/illegal_fixversion_change.erb +2 -0
  39. data/lib/messages/svn_diff.erb +110 -0
  40. data/lib/messages/svn_diff_attachment.erb +117 -0
  41. data/lib/messages/svn_grep.erb +114 -0
  42. data/lib/messages/svn_touch.erb +1 -1
  43. data/license.txt +1 -1
  44. data/readme.md +5 -5
  45. data/test/lazylead/cli/app_test.rb +11 -11
  46. data/test/lazylead/system/jira_test.rb +41 -4
  47. data/test/lazylead/task/accuracy/accuracy_test.rb +1 -1
  48. data/test/lazylead/task/accuracy/affected_build_test.rb +2 -2
  49. data/test/lazylead/task/accuracy/attachment_test.rb +50 -0
  50. data/test/lazylead/task/accuracy/environment_test.rb +42 -0
  51. data/test/lazylead/task/accuracy/logs_test.rb +138 -0
  52. data/test/lazylead/task/accuracy/records_test.rb +60 -0
  53. data/test/lazylead/task/accuracy/score_test.rb +46 -0
  54. data/test/lazylead/task/accuracy/servers_test.rb +66 -0
  55. data/test/lazylead/task/accuracy/stacktrace_test.rb +340 -0
  56. data/test/lazylead/task/accuracy/testcase_test.rb +225 -0
  57. data/test/lazylead/task/accuracy/wiki_test.rb +40 -0
  58. data/test/lazylead/task/{touch_test.rb → assignment_test.rb} +17 -27
  59. data/test/lazylead/task/svn/diff_test.rb +97 -0
  60. data/test/lazylead/task/svn/grep_test.rb +61 -0
  61. data/test/lazylead/task/svn/touch_test.rb +61 -0
  62. data/test/test.rb +25 -0
  63. data/upgrades/sqlite/001-install-main-lazylead-tables.sql +1 -5
  64. data/upgrades/sqlite/999.testdata.sql +12 -17
  65. metadata +88 -21
  66. data/.travis.yml +0 -16
  67. data/lib/lazylead/task/touch.rb +0 -102
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 4834917c8eacf27d7514a99f4a8eb9f2c9dd7a19735c3ae9653105ecf8cd7463
4
- data.tar.gz: f7d5c5f19e7be4c11de364a27099382b78d748ee091ed0c2c6de47d5b95b21bb
3
+ metadata.gz: 50916d6916b46d8ea4c92fc6c4a02b75d6f9e35bbaad260057dd61bb0e25b650
4
+ data.tar.gz: d536e0d99c760a853d3a24f47d2b1a8fbece654790af65ec02fe7c3bf69af085
5
5
  SHA512:
6
- metadata.gz: 29bd5bdaed8330d9de652ab9d11126a1af79a84acc08b415db14f3a389592ac08e2c0ce1c35bd6733302aca808571a3f65d68183ceba20a7847cbb8e766eb921
7
- data.tar.gz: b80e43c020c05b8b26d3745916934e737f2b7176515ff82fa40f901cd7a8e8a7eb81c2cc016bb845289f22b38eb65854e1c59080f58be6ae584f1f40f5a95e5e
6
+ metadata.gz: da6131b9e02115b3b61c70c3a38665f563f4ff7d37f20b0939073f11c05549c061403e9fa1711897b26917b88f324e89dd42c64128a27b72b6ebbf0b134e1d20
7
+ data.tar.gz: bcc6287781baced0f0c0e0d4506fc1fa18439c98ff66a9254704620b537e9eb448daabdef646aa145ddf2d744c2f07f805ef717612bba0e4b86901be8ef33a85
@@ -66,7 +66,7 @@ For simplicity, we are using [docker-compose](https://docs.docker.com/compose/):
66
66
  values (1,'{"type":"Lazylead::Jira", "username":"${jira_user}", "password":"${jira_password}", "site":"${jira_url}", "context_path":""}');
67
67
  insert into tasks (name, cron, enabled, id, system, team_id, action, properties)
68
68
  values ('Post ticket score and accuracy to the tickets',
69
- '0 8 * * 1-5',
69
+ 'cron:0 8 * * 1-5',
70
70
  'true',
71
71
  1, 1, 1,
72
72
  'Lazylead::Task::Accuracy',
@@ -82,7 +82,7 @@ For simplicity, we are using [docker-compose](https://docs.docker.com/compose/):
82
82
  }
83
83
  ');
84
84
  ```
85
- Yes, for task scheduling we are using [cron](https://crontab.guru).
85
+ Yes, for task scheduling we are using [cron](https://crontab.guru) here, but you may use other scheduling types from [rufus-scheduler](https://github.com/jmettraux/rufus-scheduler).
86
86
 
87
87
  4. Once you changed `./ll.db`, please restart the container using `docker-compose -f .github/tasks.yml restart`
88
88
  ```bash
@@ -68,16 +68,16 @@ For simplicity, we are using [docker-compose](https://docs.docker.com/compose/):
68
68
  values (1, 'Dream team with lazylead', '{}');
69
69
  insert into systems(id, properties)
70
70
  values (1,'{"type":"Lazylead::Jira", "username":"${jira_user}", "password":"${jira_password}", "site":"${jira_url}", "context_path":""}');
71
- insert into tasks (name, cron, enabled, id, system, team_id, action, properties)
71
+ insert into tasks (name, schedule, enabled, id, system, team_id, action, properties)
72
72
  values ('Expired due dates',
73
- '0 8 * * 1-5',
73
+ 'cron:0 8 * * 1-5',
74
74
  'true',
75
75
  1, 1, 1,
76
76
  'Lazylead::Task::AssigneeAlert',
77
77
  '{"sql":"filter=222", "cc":"<youremail.com>", "subject":"[LL] Expired due dates", "template":"lib/messages/due_date_expired.erb", "postman":"Lazylead::Exchange"}');
78
78
 
79
79
  ```
80
- Yes, for task scheduling we are using [cron](https://crontab.guru).
80
+ Yes, for task scheduling we are using [cron](https://crontab.guru) here, but you may use other scheduling types from [rufus-scheduler](https://github.com/jmettraux/rufus-scheduler).
81
81
 
82
82
  4. Once you changed `./ll.db`, please restart the container using `docker-compose -f .github/tasks.yml restart`
83
83
  ```bash
@@ -58,16 +58,16 @@ For simplicity, we are using [docker-compose](https://docs.docker.com/compose/):
58
58
  values (1, 'Dream team with lazylead', '{}');
59
59
  insert into systems(id, properties)
60
60
  values (1,'{"type":"Lazylead::Jira", "username":"${jira_user}", "password":"${jira_password}", "site":"${jira_url}", "context_path":""}');
61
- insert into tasks (name, cron, enabled, id, system, team_id, action, properties)
61
+ insert into tasks (name, schedule, enabled, id, system, team_id, action, properties)
62
62
  values ('Propagate customfield_1 (External ID) to sub-tasks',
63
- '0 8 * * 1-5',
63
+ 'cron:0 8 * * 1-5',
64
64
  'true',
65
65
  1, 1, 1,
66
66
  'Lazylead::Task::PropagateDown',
67
67
  '{"jql":"filter=222", "propagate":"customfield_1"}');
68
68
 
69
69
  ```
70
- Yes, for task scheduling we are using [cron](https://crontab.guru).
70
+ Yes, for task scheduling we are using [cron](https://crontab.guru) here, but you may use other scheduling types from [rufus-scheduler](https://github.com/jmettraux/rufus-scheduler).
71
71
 
72
72
  4. Once you changed `./ll.db`, please restart the container using `docker-compose -f .github/tasks.yml restart`
73
73
  ```bash
@@ -7,3 +7,4 @@
7
7
  *.xml ident
8
8
  *.png binary
9
9
  *.pdf binary
10
+ *.db binary
@@ -0,0 +1,6 @@
1
+ version: 2
2
+ updates:
3
+ - package-ecosystem: "bundler"
4
+ directory: "/"
5
+ schedule:
6
+ interval: "daily"
data/Rakefile CHANGED
@@ -26,7 +26,7 @@ require "rubygems"
26
26
  require "rake"
27
27
  require "date"
28
28
  require "rdoc"
29
- require "rainbow"
29
+ require "colorize"
30
30
  require "rake/clean"
31
31
 
32
32
  # @todo #/DEV Investigate the possibility of using migrations from active_record
@@ -112,9 +112,10 @@ task :sqlint do
112
112
  total += violations.count { |lint| lint.type == :error }
113
113
  end
114
114
  if total.positive?
115
- abort "#{Rainbow(total).red} SQL violations found."
115
+ abort "#{total.colorize(:red)} SQL violations found."
116
116
  else
117
- puts "#{src.size} files inspected, #{Rainbow('no offenses').green} detected"
117
+ puts "#{src.size} files inspected, #{'no offenses'.colorize(:green)} " \
118
+ "detected"
118
119
  end
119
120
  end
120
121
 
@@ -127,4 +128,6 @@ task :docker do
127
128
  system "docker-compose -f .docker/docker-compose.yml build "\
128
129
  " --build-arg release_tags='latest 1.0'"\
129
130
  " --build-arg version=1.0"
131
+ system "docker-compose -f .docker/docker-compose.yml rm --force -s lazylead"
132
+ system "docker-compose -f .docker/docker-compose.yml up"
130
133
  end
@@ -29,7 +29,7 @@ STDOUT.sync = true
29
29
 
30
30
  require "slop"
31
31
  require "sqlite3"
32
- require "rainbow"
32
+ require "colorize"
33
33
  require "logging"
34
34
  require "backtrace"
35
35
  require "memory_profiler"
@@ -77,12 +77,13 @@ Available options:"
77
77
  exit
78
78
  end
79
79
  end
80
- log.debug("Version: #{Lazylead::VERSION}")
81
- log.debug("Memory footprint at start is #{Lazylead::Allocated.new}")
80
+ log.debug "Version: #{Lazylead::VERSION.colorize(:green)}"
81
+ log.debug "Memory footprint at start is " \
82
+ "#{Lazylead::Allocated.new.to_s.colorize(:light_blue)}."
82
83
  cmd = lambda do
83
84
  Lazylead::CLI::App.new(
84
85
  log,
85
- Lazylead::Schedule.new(log),
86
+ Lazylead::Schedule.new(log: log),
86
87
  Lazylead::Smtp.new(
87
88
  log, Lazylead::Salt.new("smtp_salt"),
88
89
  smtp_host: ENV["smtp_host"],
@@ -103,5 +104,6 @@ if opts["memory-dump"]
103
104
  else
104
105
  code = cmd.call
105
106
  end
106
- log.debug("Memory footprint at the end is #{Lazylead::Allocated.new}")
107
+ log.debug "Memory footprint at the end is " \
108
+ "#{Lazylead::Allocated.new.to_s.colorize(:light_blue)}."
107
109
  exit(code) unless code.zero?
@@ -32,7 +32,7 @@ Gem::Specification.new do |s|
32
32
  s.rubygems_version = "2.2"
33
33
  s.required_ruby_version = ">=2.6.5"
34
34
  s.name = "lazylead"
35
- s.version = "0.4.2"
35
+ s.version = "0.6.0"
36
36
  s.license = "MIT"
37
37
  s.summary = "Eliminate the annoying work within bug-trackers."
38
38
  s.description = "Ticketing systems (Github, Jira, etc.) are strongly
@@ -45,7 +45,7 @@ tasks instead of solving technical problems."
45
45
  s.authors = ["Yurii Dubinka"]
46
46
  s.email = "yurii.dubinka@gmail.com"
47
47
  s.homepage = "http://github.com/dgroup/lazylead"
48
- s.post_install_message = "Thanks for installing Lazylead v0.4.2!
48
+ s.post_install_message = "Thanks for installing Lazylead v0.6.0!
49
49
  Read our blog posts: https://lazylead.org
50
50
  Stay in touch with the community in Telegram: https://t.me/lazylead
51
51
  Follow us on Twitter: https://twitter.com/lazylead
@@ -57,6 +57,7 @@ tasks instead of solving technical problems."
57
57
  s.extra_rdoc_files = %w[readme.md license.txt]
58
58
  s.add_runtime_dependency "activerecord", "6.0.3"
59
59
  s.add_runtime_dependency "backtrace", "0.3"
60
+ s.add_runtime_dependency "colorize", "0.8.1"
60
61
  s.add_runtime_dependency "faraday", "1.0.1"
61
62
  s.add_runtime_dependency "get_process_mem", "0.2.5"
62
63
  s.add_runtime_dependency "jira-ruby", "1.7.1"
@@ -65,12 +66,12 @@ tasks instead of solving technical problems."
65
66
  s.add_runtime_dependency "mail", "2.7.1"
66
67
  s.add_runtime_dependency "memory_profiler", "0.9.13"
67
68
  s.add_runtime_dependency "openssl", "2.1.2"
68
- s.add_runtime_dependency "rainbow", "3.0.0"
69
69
  s.add_runtime_dependency "require_all", "3.0.0"
70
70
  s.add_runtime_dependency "rufus-scheduler", "3.6.0"
71
71
  s.add_runtime_dependency "slop", "4.4"
72
72
  s.add_runtime_dependency "sqlite3", "1.4.2"
73
73
  s.add_runtime_dependency "tilt", "2.0.10"
74
+ s.add_runtime_dependency "tmpdir", "0.1.0"
74
75
  s.add_runtime_dependency "tzinfo", "1.1"
75
76
  s.add_runtime_dependency "tzinfo-data", "1.2019.3"
76
77
  s.add_runtime_dependency "vcs4sql", "0.1.0"
@@ -82,6 +83,7 @@ tasks instead of solving technical problems."
82
83
  s.add_development_dependency "minitest-fail-fast", "0.1.0"
83
84
  s.add_development_dependency "minitest-hooks", "1.5.0"
84
85
  s.add_development_dependency "minitest-reporters", "1.3.6"
86
+ s.add_development_dependency "net-ping", "2.0.8"
85
87
  s.add_development_dependency "rake", "12.3.3"
86
88
  s.add_development_dependency "random-port", "0.3.1"
87
89
  s.add_development_dependency "rdoc", "6.1.1"
@@ -22,6 +22,7 @@
22
22
  # ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE
23
23
  # OR OTHER DEALINGS IN THE SOFTWARE.
24
24
 
25
+ require "colorize"
25
26
  require "vcs4sql/sqlite/migration"
26
27
  require_relative "../smtp"
27
28
  require_relative "../schedule"
@@ -58,9 +59,11 @@ module Lazylead
58
59
  def apply_vcs_migration(opts)
59
60
  @db = File.expand_path(opts[:home]) + "/" + opts[:sqlite]
60
61
  vcs = File.expand_path(opts[:home]) + "/" + opts[:vcs4sql]
61
- @log.debug "Database: '#{@db}', sql migration dir: '#{vcs}'"
62
+ @log.debug "Database: '#{@db.colorize(:light_blue)}', "\
63
+ "sql migration dir: '#{vcs.colorize(:light_blue)}'"
62
64
  Vcs4sql::Sqlite::Migration.new(@db).upgrade vcs, opts[:testdata]
63
- @log.debug "Migration applied to #{@db} from #{vcs}"
65
+ @log.debug "Migration applied to '#{@db.colorize(:light_blue)}' from " \
66
+ "'#{vcs.colorize(:light_blue)}'"
64
67
  end
65
68
 
66
69
  def enable_active_record(opts)
@@ -54,19 +54,25 @@ module Lazylead
54
54
  def send(opts)
55
55
  to = opts["to"] || opts[:to]
56
56
  to = [to] unless to.is_a? Array
57
- html = make_body(opts)
58
- msg = {
59
- subject: opts["subject"],
60
- body: html,
61
- body_type: "HTML",
62
- to_recipients: to
63
- }
57
+ if to.reject { |e| e.nil? || e.blank? }.empty?
58
+ @log.warn "Email can't be sent to '#{to}, more: '#{opts}'"
59
+ return
60
+ end
61
+ msg = make_msg(to, opts)
64
62
  msg.update(cc_recipients: opts["cc"]) if opts.key? "cc"
65
63
  add_attachments(msg, opts)
66
64
  cli.send_message msg
67
65
  close_attachments msg
68
- @log.debug "Email was generated from #{opts} and send by #{__FILE__}. " \
69
- "Here is the body: #{html}"
66
+ @log.debug "#{__FILE__} sent '#{opts['subject']}' to '#{to}'."
67
+ end
68
+
69
+ def make_msg(to, opts)
70
+ {
71
+ subject: opts["subject"],
72
+ body: make_body(opts),
73
+ body_type: "HTML",
74
+ to_recipients: to
75
+ }
70
76
  end
71
77
 
72
78
  def add_attachments(msg, opts)
@@ -23,6 +23,7 @@
23
23
  # OR OTHER DEALINGS IN THE SOFTWARE.
24
24
 
25
25
  require "logging"
26
+ require "colorize"
26
27
  require "forwardable"
27
28
 
28
29
  module Lazylead
@@ -68,7 +69,7 @@ module Lazylead
68
69
  Logging.appenders.stdout(
69
70
  "stdout",
70
71
  layout: Logging.layouts.pattern(
71
- pattern: "[%d] %-5l [%X{tid}] %m\n",
72
+ pattern: "[%d] %-5l #{'[%X{tid}]'.colorize(:light_green)} %m\n",
72
73
  color_scheme: "bright"
73
74
  )
74
75
  )
@@ -94,6 +94,7 @@ module Lazylead
94
94
  belongs_to :team, foreign_key: "team_id"
95
95
  belongs_to :system, foreign_key: "system"
96
96
 
97
+ # Execute task
97
98
  def exec
98
99
  sys = system.connect
99
100
  opts = props
@@ -101,6 +102,25 @@ module Lazylead
101
102
  action.constantize.new.run(sys, postman, opts)
102
103
  end
103
104
 
105
+ # Scheduling type.
106
+ # Current implementation is based on 'rufus-scheduler' gem and supports
107
+ # the following types: 'cron', 'interval', 'in', 'at', 'every'
108
+ def type
109
+ trigger.first
110
+ end
111
+
112
+ # Scheduling unit.
113
+ # Current implementation is based on 'rufus-scheduler' gem thus each
114
+ # scheduling type has own arguments:
115
+ # 1. Scheduling type 'cron' has 'unit' = '00 09 * * *'
116
+ # 2. Scheduling type 'interval' has 'unit' = '2h'
117
+ # 3. Scheduling type 'every' has 'unit' = '3h'
118
+ # 4. Scheduling type 'in' has 'unit' = '10d'
119
+ # 5. Scheduling type 'at' has 'unit' = '2014/12/24 2000'
120
+ def unit
121
+ trigger.last
122
+ end
123
+
104
124
  def detect_cc(sys)
105
125
  opts = props
106
126
  opts["cc"] = CC.new.detect(opts["cc"], sys)
@@ -125,13 +145,27 @@ module Lazylead
125
145
  Postman.new
126
146
  end
127
147
  end
148
+
149
+ private
150
+
151
+ # Parse scheduling #type and #unit
152
+ def trigger
153
+ @trigger ||= begin
154
+ trg = schedule.split(":")
155
+ unless trg.size == 2
156
+ raise "ll-007: illegal schedule format '#{schedule}'"
157
+ end
158
+ trg.map(&:strip).map(&:chomp)
159
+ end
160
+ end
128
161
  end
129
162
 
130
163
  # A task with extended logging
131
164
  # @see Lazylead::ORM::Task
132
165
  class VerboseTask
133
166
  extend Forwardable
134
- def_delegators :@orig, :id, :name, :team, :to_s, :inspect, :props
167
+ def_delegators :@orig, :id, :name, :team, :to_s, :inspect, :props, :type,
168
+ :unit
135
169
 
136
170
  def initialize(orig, log = Log.new)
137
171
  @orig = orig
@@ -23,6 +23,7 @@
23
23
  # OR OTHER DEALINGS IN THE SOFTWARE.
24
24
 
25
25
  require "forwardable"
26
+ require_relative "salt"
26
27
 
27
28
  module Lazylead
28
29
  #
@@ -41,6 +42,7 @@ module Lazylead
41
42
 
42
43
  # Split text value by delimiter, trim all spaces and reject blank items
43
44
  def slice(key, delim)
45
+ return [] unless to_h.key? key
44
46
  to_h[key].split(delim).map(&:chomp).map(&:strip).reject(&:blank?)
45
47
  end
46
48
 
@@ -64,5 +66,16 @@ module Lazylead
64
66
  def jira_fields
65
67
  to_h.fetch("fields", "").split(",").map(&:to_sym)
66
68
  end
69
+
70
+ # Decrypt particular option using cryptography salt
71
+ # @param key option to be decrypted
72
+ # @param sid the name of the salt to be used for the description
73
+ # @see Lazylead::Salt
74
+ def decrypt(key, sid)
75
+ text = to_h[key]
76
+ return text if text.blank? || text.nil?
77
+ return Salt.new(sid).decrypt(text) if ENV.key? sid
78
+ text
79
+ end
67
80
  end
68
81
  end
@@ -53,26 +53,32 @@ module Lazylead
53
53
  # Send an email.
54
54
  # :opts :: the mail configuration like to, from, cc, subject, template.
55
55
  def send(opts)
56
- html = make_body(opts)
56
+ mail = make_email(opts)
57
+ mail.deliver
58
+ @log.debug "#{__FILE__} sent '#{mail.subject}' to '#{mail.to}'."
59
+ end
60
+
61
+ # Construct an email based on input arguments
62
+ def make_email(opts)
57
63
  mail = Mail.new
58
64
  mail.to opts[:to] || opts["to"]
59
65
  mail.from opts["from"]
60
66
  mail.cc opts["cc"] if opts.key? "cc"
61
67
  mail.subject opts["subject"]
68
+ html = make_body(opts)
62
69
  mail.html_part do
63
70
  content_type "text/html; charset=UTF-8"
64
71
  body html
65
72
  end
66
73
  add_attachments mail, opts
67
- mail.deliver
68
- @log.debug "Email was generated from #{opts} and send by #{__FILE__}. " \
69
- "Here is the body: #{html}"
74
+ mail
70
75
  end
71
76
 
72
77
  def add_attachments(mail, opts)
73
- return unless opts.key? "attachments"
74
- opts["attachments"].select { |a| File.file? a }
75
- .each { |a| mail.add_file a }
78
+ return unless opts.key?("attachments") || opts.key?(:attachments)
79
+ attach = opts["attachments"] || opts[:attachments]
80
+ return if attach.nil?
81
+ attach.select { |a| File.file? a }.each { |a| mail.add_file a }
76
82
  end
77
83
  end
78
84
  end
@@ -34,23 +34,18 @@ module Lazylead
34
34
  # Copyright:: Copyright (c) 2019-2020 Yurii Dubinka
35
35
  # License:: MIT
36
36
  class Schedule
37
- # @todo #/DEV New scheduling types like 'at', 'once' is required.
38
- # The minimum time period for cron is 1 minute and it's not suitable for
39
- # unit testing, thus its better to introduce new types which allows to
40
- # schedule some task once or at particular time period like in next 200ms).
41
- # For cron expressions we should define separate test suite which will test
42
- # in parallel without blocking main CI process.
43
- def initialize(log = Log.new, cling = true)
37
+ def initialize(log: Log.new, cling: true, trigger: Rufus::Scheduler.new)
44
38
  @log = log
45
39
  @cling = cling
46
- @trigger = Rufus::Scheduler.new
40
+ @trigger = trigger
47
41
  end
48
42
 
49
- # @todo #/DEV error code is required for reach 'raise' statement within the
50
- # application.
43
+ # @todo #/DEV error code is required for each 'raise' statement within the
44
+ # application. Align the naming of existing one, the error code should be
45
+ # like ll-xxx.
51
46
  def register(task)
52
47
  raise "ll-002: task can't be a null" if task.nil?
53
- @trigger.cron task.cron do
48
+ @trigger.method(task.type).call(task.unit) do
54
49
  ActiveRecord::Base.connection_pool.with_connection do
55
50
  ORM::VerboseTask.new(task, @log).exec
56
51
  end
@@ -60,7 +55,9 @@ module Lazylead
60
55
 
61
56
  # @todo #/DEV inspect the current execution status. This method should
62
57
  # support several format for output, by default is `json`.
63
- def ps; end
58
+ def ps
59
+ @log.debug "#{self}#ps"
60
+ end
64
61
 
65
62
  def join
66
63
  @trigger.join if @cling
@@ -80,11 +77,15 @@ module Lazylead
80
77
  end
81
78
 
82
79
  def register(task)
83
- @log.debug("Task registered: #{task}")
80
+ @log.debug "Task registered: #{task}"
84
81
  end
85
82
 
86
- def ps; end
83
+ def ps
84
+ @log.debug "#{self}#ps"
85
+ end
87
86
 
88
- def join; end
87
+ def join
88
+ @log.debug "#{self}#join"
89
+ end
89
90
  end
90
91
  end