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