daily_reporter 0.0.1
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.
- 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: []
|