daily_reporter 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -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,8 @@
1
+ mail:
2
+ smtp_server: 'mail.server.com'
3
+ imap_server: 'mail.server.com'
4
+ imap_port: '143'
5
+ username: 'username@server.com'
6
+ password: 'password'
7
+ bot_sign_container: 'SUBJECT'
8
+ bot_sign: 'What have you done today?'
@@ -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: []