daily_reporter 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- data/bin/daily_reporter +20 -0
- data/config/settings.yml.sample +8 -0
- data/lib/daily_reporter.rb +24 -0
- data/lib/daily_reporter/mail.rb +49 -0
- data/lib/daily_reporter/settings.rb +66 -0
- data/lib/daily_reporter/task.rb +23 -0
- metadata +100 -0
data/bin/daily_reporter
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
require 'daily_reporter'
|
3
|
+
|
4
|
+
case ARGV[0]
|
5
|
+
when 'report'
|
6
|
+
DailyReporter.report
|
7
|
+
when 'task'
|
8
|
+
case ARGV[1]
|
9
|
+
when 'add'
|
10
|
+
DailyReporter.add_task ARGV[2]
|
11
|
+
when 'list'
|
12
|
+
DailyReporter.tasks_list
|
13
|
+
else
|
14
|
+
puts 'wrong usage'
|
15
|
+
end
|
16
|
+
when 'bootstrap'
|
17
|
+
DailyReporter.bootstrap
|
18
|
+
else
|
19
|
+
puts 'wrong usage'
|
20
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
module DailyReporter
|
2
|
+
SETTINGS_DIRECTORY = File.expand_path('~/.daily_reporter')
|
3
|
+
class << self
|
4
|
+
def report
|
5
|
+
Mail.send_status
|
6
|
+
end
|
7
|
+
|
8
|
+
def add_task(task)
|
9
|
+
Task.add(task)
|
10
|
+
end
|
11
|
+
|
12
|
+
def tasks_list
|
13
|
+
puts Task.status
|
14
|
+
end
|
15
|
+
|
16
|
+
def bootstrap
|
17
|
+
Settings.init
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
require 'daily_reporter/settings'
|
23
|
+
require 'daily_reporter/task'
|
24
|
+
require 'daily_reporter/mail'
|
@@ -0,0 +1,49 @@
|
|
1
|
+
require 'net/imap'
|
2
|
+
require 'net/smtp'
|
3
|
+
|
4
|
+
module DailyReporter
|
5
|
+
module Mail
|
6
|
+
class << self
|
7
|
+
def send_status
|
8
|
+
unless status = Task.status
|
9
|
+
puts 'empty status'
|
10
|
+
return
|
11
|
+
end
|
12
|
+
unless email = get_mail_address
|
13
|
+
puts 'email is absent'
|
14
|
+
return
|
15
|
+
end
|
16
|
+
|
17
|
+
username = Settings.mail.username
|
18
|
+
begin
|
19
|
+
Net::SMTP.start(Settings.mail.smtp_server, 25, Settings.mail.smtp_server, Settings.mail.username, Settings.mail.password, :plain) do |smtp|
|
20
|
+
smtp.enable_starttls
|
21
|
+
smtp.send_message compose_message(status, email), username, [email]
|
22
|
+
smtp.finish
|
23
|
+
end
|
24
|
+
Task.clear_status
|
25
|
+
rescue Exception => e
|
26
|
+
puts e
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
def get_mail_address
|
31
|
+
imap = Net::IMAP.new(Settings.mail.imap_server, port: Settings.mail.imap_port)
|
32
|
+
imap.authenticate('LOGIN', Settings.mail.username, Settings.mail.password)
|
33
|
+
imap.examine('Inbox')
|
34
|
+
id = imap.search([Settings.mail.bot_sign_container, Settings.mail.bot_sign, 'SINCE', Time.now.strftime('%-d-%b-%Y')]).last
|
35
|
+
return nil unless id
|
36
|
+
envelope = imap.fetch(id, 'ENVELOPE').first.attr['ENVELOPE']
|
37
|
+
reply_to = envelope.reply_to.first
|
38
|
+
"#{reply_to.mailbox}@#{reply_to.host}"
|
39
|
+
end
|
40
|
+
|
41
|
+
def compose_message(message, email)
|
42
|
+
from = "From: <#{Settings.mail.username}>"
|
43
|
+
to = "To: <#{email}>"
|
44
|
+
subject = "Subject: Re: #{Settings.mail.bot_sign}"
|
45
|
+
"#{from}\n#{to}\n#{subject}\n\n#{message}"
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
@@ -0,0 +1,66 @@
|
|
1
|
+
require 'ostruct'
|
2
|
+
require 'yaml'
|
3
|
+
|
4
|
+
module DailyReporter
|
5
|
+
module Settings
|
6
|
+
SETTINGS_FILE = DailyReporter::SETTINGS_DIRECTORY + '/settings.yml'
|
7
|
+
|
8
|
+
class << self
|
9
|
+
def method_missing(method)
|
10
|
+
settings.send(method)
|
11
|
+
end
|
12
|
+
|
13
|
+
def init
|
14
|
+
tmp_settings = get_settings(File.dirname(__FILE__) + '/../../config/settings.yml.sample')
|
15
|
+
|
16
|
+
tmp_settings['mail'].each_pair do |key, value|
|
17
|
+
puts "Input #{key.gsub('_', ' ').capitalize} (default: #{value})"
|
18
|
+
input = STDIN.gets.chomp
|
19
|
+
input = value if input.nil? || input.empty?
|
20
|
+
settings.mail.send("#{key}=", input)
|
21
|
+
end
|
22
|
+
save_settings
|
23
|
+
end
|
24
|
+
|
25
|
+
private
|
26
|
+
|
27
|
+
def settings
|
28
|
+
@settings ||= hashes_to_ostruct(get_settings)
|
29
|
+
end
|
30
|
+
|
31
|
+
def get_settings(settings_file = SETTINGS_FILE)
|
32
|
+
YAML.load_file(settings_file) || {'mail' => {}}
|
33
|
+
rescue Errno::ENOENT
|
34
|
+
{'mail' => {}}
|
35
|
+
end
|
36
|
+
|
37
|
+
def save_settings
|
38
|
+
begin
|
39
|
+
Dir.mkdir(SETTINGS_DIRECTORY)
|
40
|
+
rescue Errno::EEXIST
|
41
|
+
puts 'directory already exists'
|
42
|
+
end
|
43
|
+
|
44
|
+
File.open(SETTINGS_FILE, 'w') do |f|
|
45
|
+
f.write(settings.marshal_dump.to_yaml)
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
def hashes_to_ostruct(object)
|
50
|
+
return case object
|
51
|
+
when Hash
|
52
|
+
object = object.clone
|
53
|
+
object.each do |key, value|
|
54
|
+
object[key] = hashes_to_ostruct(value)
|
55
|
+
end
|
56
|
+
OpenStruct.new(object)
|
57
|
+
when Array
|
58
|
+
object = object.clone
|
59
|
+
object.map! { |i| hashes_to_ostruct(i) }
|
60
|
+
else
|
61
|
+
object
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
module DailyReporter
|
2
|
+
module Task
|
3
|
+
TASKS_FILE = DailyReporter::SETTINGS_DIRECTORY + '/tasks.txt'
|
4
|
+
class << self
|
5
|
+
def status
|
6
|
+
content = File.open(TASKS_FILE, 'a+') do |f|
|
7
|
+
f.read
|
8
|
+
end
|
9
|
+
content.empty? ? nil : content
|
10
|
+
end
|
11
|
+
|
12
|
+
def clear_status
|
13
|
+
File.open(TASKS_FILE, 'w') {}
|
14
|
+
end
|
15
|
+
|
16
|
+
def add(task)
|
17
|
+
File.open(TASKS_FILE, 'a') do |f|
|
18
|
+
f.puts task.strip
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
metadata
ADDED
@@ -0,0 +1,100 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: daily_reporter
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Nickolay Kondratenko
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2013-10-09 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: pry
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
18
|
+
requirements:
|
19
|
+
- - ! '>='
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: '0'
|
22
|
+
type: :development
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ! '>='
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: '0'
|
30
|
+
- !ruby/object:Gem::Dependency
|
31
|
+
name: rspec
|
32
|
+
requirement: !ruby/object:Gem::Requirement
|
33
|
+
none: false
|
34
|
+
requirements:
|
35
|
+
- - ! '>='
|
36
|
+
- !ruby/object:Gem::Version
|
37
|
+
version: '0'
|
38
|
+
type: :development
|
39
|
+
prerelease: false
|
40
|
+
version_requirements: !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
42
|
+
requirements:
|
43
|
+
- - ! '>='
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
version: '0'
|
46
|
+
- !ruby/object:Gem::Dependency
|
47
|
+
name: fakefs
|
48
|
+
requirement: !ruby/object:Gem::Requirement
|
49
|
+
none: false
|
50
|
+
requirements:
|
51
|
+
- - ! '>='
|
52
|
+
- !ruby/object:Gem::Version
|
53
|
+
version: '0'
|
54
|
+
type: :development
|
55
|
+
prerelease: false
|
56
|
+
version_requirements: !ruby/object:Gem::Requirement
|
57
|
+
none: false
|
58
|
+
requirements:
|
59
|
+
- - ! '>='
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
description: A tool that reports about daily tasks
|
63
|
+
email: devmarkup@gmail.com
|
64
|
+
executables:
|
65
|
+
- daily_reporter
|
66
|
+
extensions: []
|
67
|
+
extra_rdoc_files: []
|
68
|
+
files:
|
69
|
+
- config/settings.yml.sample
|
70
|
+
- lib/daily_reporter.rb
|
71
|
+
- lib/daily_reporter/mail.rb
|
72
|
+
- lib/daily_reporter/task.rb
|
73
|
+
- lib/daily_reporter/settings.rb
|
74
|
+
- bin/daily_reporter
|
75
|
+
homepage: http://rubygems.org/gems/daily_reporter
|
76
|
+
licenses:
|
77
|
+
- MIT
|
78
|
+
post_install_message: Read README before you start using daily reporter
|
79
|
+
rdoc_options: []
|
80
|
+
require_paths:
|
81
|
+
- lib
|
82
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
83
|
+
none: false
|
84
|
+
requirements:
|
85
|
+
- - ! '>='
|
86
|
+
- !ruby/object:Gem::Version
|
87
|
+
version: '0'
|
88
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
89
|
+
none: false
|
90
|
+
requirements:
|
91
|
+
- - ! '>='
|
92
|
+
- !ruby/object:Gem::Version
|
93
|
+
version: '0'
|
94
|
+
requirements: []
|
95
|
+
rubyforge_project:
|
96
|
+
rubygems_version: 1.8.25
|
97
|
+
signing_key:
|
98
|
+
specification_version: 3
|
99
|
+
summary: A tool that reports about daily tasks
|
100
|
+
test_files: []
|