cyrus-code-challenge 0.2.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 00a906ea15a9418e3b362053b23b05b5543b1ce4
4
+ data.tar.gz: bf4024ec6c4b9da07658485ccf0ca552a9856ae4
5
+ SHA512:
6
+ metadata.gz: b7cba27ac2f2193759a8ca045b7754b3ee2af476f4e96ad5aa55d4577473a6a377fc0ddabb5ae0d21bd67fd9992a5029e25decf0cf45c2b089b9365eb75d6fdd
7
+ data.tar.gz: c3ce74c1ac6706c57c630fdbf1f6a163305f0899a838143cbd60988b53412b3e4db0eb558973a547c84718c2c1d2b7f04f3819fa797750a66bfaeb3e2282d6ac
data/bin/console ADDED
@@ -0,0 +1,6 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require_relative "../lib/cyrus-code-challenge"
4
+ require "irb"
5
+
6
+ IRB.start
@@ -0,0 +1,4 @@
1
+ #!/usr/bin/env ruby
2
+ require_relative '../lib/cyrus-code-challenge.rb'
3
+
4
+ CyrusCodeChallenge::CLI.new
data/bin/test-output ADDED
@@ -0,0 +1,5 @@
1
+ #!/usr/bin/env ruby
2
+ require_relative '../lib/cyrus-code-challenge.rb'
3
+
4
+ ContactsCreator.call
5
+ Printer.new.print_all
data/data/comma.txt ADDED
@@ -0,0 +1,3 @@
1
+ Abercrombie, Neil, Male, Tan, 2/13/1943
2
+ Bishop, Timothy, Male, Yellow, 4/23/1967
3
+ Kelly, Sue, Female, Pink, 7/12/1959
data/data/pipe.txt ADDED
@@ -0,0 +1,3 @@
1
+ Smith | Steve | D | M | Red | 3-3-1985
2
+ Bonk | Radek | S | M | Green | 6-3-1975
3
+ Bouillon | Francis | G | M | Blue | 6-3-1975
data/data/space.txt ADDED
@@ -0,0 +1,3 @@
1
+ Kournikova Anna F F 6-3-1975 Red
2
+ Hingis Martina M F 4-2-1979 Green
3
+ Seles Monica H F 12-2-1973 Black
data/env.rb ADDED
@@ -0,0 +1 @@
1
+ ENV['PASSWORD']='haribol108'
@@ -0,0 +1,11 @@
1
+ require_relative '../env'
2
+ require_relative './cyrus-code-challenge/version'
3
+ require_relative './cyrus-code-challenge/cli-helpers'
4
+ require_relative './cyrus-code-challenge/cli'
5
+ require_relative './cyrus-code-challenge/sorter'
6
+ require_relative './cyrus-code-challenge/printer'
7
+ require_relative './cyrus-code-challenge/contacts-creator'
8
+ require_relative './cyrus-code-challenge/contacts'
9
+ require_relative './cyrus-code-challenge/formatter'
10
+ require_relative './cyrus-code-challenge/parser'
11
+ require_relative './cyrus-code-challenge/email-sender'
@@ -0,0 +1,17 @@
1
+ module CLIHelpers
2
+
3
+ def animate
4
+ sleep 0.01
5
+ end
6
+
7
+ def clear
8
+ print "\e[2J\e[f"
9
+ end
10
+
11
+ def colorize(text, color_code)
12
+ "\e[#{color_code}m#{text}\e[0m"
13
+ end
14
+
15
+ def red(text); colorize(text, 31); end
16
+ def green(text); colorize(text, 32); end
17
+ end
@@ -0,0 +1,88 @@
1
+ class CyrusCodeChallenge::CLI
2
+ include CLIHelpers
3
+
4
+ def initialize
5
+ ContactsCreator.call
6
+ @printer = Printer.new
7
+ greeting
8
+ end
9
+
10
+ def greeting
11
+ array = "\nWelcome to Brennen's Cyrus Code Challenge Solution!\n".split("")
12
+ array.each{|x| print green(x);animate}
13
+ sleep 0.6
14
+ show_options
15
+ end
16
+
17
+ def show_options
18
+ array = "Please choose an option:".split("")
19
+ array.each{|x| print x;animate};sleep 0.6
20
+ array =
21
+ %{\n
22
+ 1. Print Output 1
23
+ 2. Print Output 2
24
+ 3. Print Output 3
25
+ 4. Print Entire Solution
26
+ 5. Email Entire Solution
27
+ }.split("")
28
+
29
+ array.each{|x| print x;animate}
30
+ serve_user
31
+ end
32
+
33
+ def serve_user
34
+ respond_to_input
35
+ puts green("\nWould you like to make another selection? (y/n)")
36
+ offer_another_selection
37
+ end
38
+
39
+ def offer_another_selection
40
+ input = gets.strip
41
+ case input
42
+ when "y", "Y"
43
+ show_options
44
+ when "n", "N", "exit", "quit"
45
+ abort("\nBye for now!")
46
+ else
47
+ puts red('Please choose a valid selection:')
48
+ offer_another_selection
49
+ end
50
+ end
51
+
52
+ def respond_to_input
53
+ input = gets.strip
54
+ case input
55
+ when "1"
56
+ clear;print "------------------------------------------\n"
57
+ @printer.output_1
58
+ print "------------------------------------------"
59
+ when "2"
60
+ clear;print "------------------------------------------\n"
61
+ @printer.output_2
62
+ print "------------------------------------------"
63
+ when "3"
64
+ clear;print "------------------------------------------\n"
65
+ @printer.output_3
66
+ print "------------------------------------------"
67
+ when "4"
68
+ clear;print "------------------------------------------\n"
69
+ @printer.print_all
70
+ print "------------------------------------------"
71
+ when "5"
72
+ puts "Who should I send this email to?"
73
+ receiver = gets.strip
74
+ until receiver =~ /.+@.+\..+/i
75
+ puts "Please enter valid email address:"
76
+ receiver = gets.strip
77
+ end
78
+ email_sender = EmailSender.new(@printer.email_all, receiver)
79
+ email_sender.send_email
80
+ clear;print "Your email was successfully sent to:\n#{receiver}\n"
81
+ when "exit", "quit", "end", "q"
82
+ abort("\nBye for now!")
83
+ else
84
+ puts red('Please choose a valid selection:')
85
+ respond_to_input
86
+ end
87
+ end
88
+ end
@@ -0,0 +1,12 @@
1
+ class ContactsCreator
2
+
3
+ def self.call
4
+ input_files = File.expand_path("../../data/", File.dirname(__FILE__))
5
+ Dir.glob("#{input_files}/*.txt") do |txt_file|
6
+ contacts_info = Parser.new(txt_file).parse
7
+ contacts_info.each do |contact|
8
+ Contacts.new(contact[0], contact[1], contact[2], contact[3], contact[4])
9
+ end
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,20 @@
1
+ require 'date'
2
+
3
+ class Contacts
4
+ attr_accessor :last_name, :first_name, :gender, :favorite_color, :birth_date
5
+
6
+ @@all = []
7
+
8
+ def self.all
9
+ @@all
10
+ end
11
+
12
+ def initialize(last_name, first_name, gender, favorite_color, birth_date)
13
+ @last_name = last_name
14
+ @first_name = first_name
15
+ @gender = gender
16
+ @favorite_color = favorite_color
17
+ @birth_date = Date.strptime(birth_date, '%m/%d/%Y')
18
+ @@all << self
19
+ end
20
+ end
@@ -0,0 +1,48 @@
1
+ require 'mail'
2
+
3
+ class EmailSender
4
+ attr_reader :outputs, :receiver
5
+
6
+ def initialize(outputs, receiver)
7
+ @outputs = outputs
8
+ @receiver = receiver
9
+ end
10
+
11
+ def formatted_email
12
+ email_message = ""
13
+ outputs.each_with_index do |output, i|
14
+ email_message << "<br>Output #{i+1}:<br>"
15
+ output.each do |contact_info|
16
+ email_message << contact_info + "<br>"
17
+ end
18
+ end
19
+ email_message
20
+ end
21
+
22
+ def send_email(content = formatted_email, receiver = @receiver)
23
+ options = {
24
+ :address => "smtp.gmail.com",
25
+ :port => 587,
26
+ :domain => 'gmail.com',
27
+ :user_name => 'brennenawana108ny@gmail.com',
28
+ :password => ENV['PASSWORD'],
29
+ :authentication => 'plain',
30
+ :enable_starttls_auto => true
31
+ }
32
+
33
+ Mail.defaults do
34
+ delivery_method :smtp, options
35
+ end
36
+
37
+ Mail.deliver do
38
+ to "#{receiver}"
39
+ from 'brennenawana108ny@gmail.com'
40
+ subject 'Cyrus Code Challenge: Solution'
41
+ html_part do
42
+ content_type 'text/html; charset=UTF-8'
43
+ body "<p>#{content}</p>"
44
+ end
45
+ end
46
+ end
47
+
48
+ end
@@ -0,0 +1,35 @@
1
+ module Formatter
2
+
3
+ def normalize(content)
4
+ dashed = content.gsub(/[-]/, "/")
5
+ contact = dashed.gsub(/[,]|[|]/, "").split(" ")
6
+ delete_middle_name(contact)
7
+ switch_dates(contact)
8
+ spell_gender(contact)
9
+ contact
10
+ end
11
+
12
+ private
13
+
14
+ def delete_middle_name(content)
15
+ if content.length == 6
16
+ content.delete_at(2)
17
+ end
18
+ end
19
+
20
+ def switch_dates(content)
21
+ if content[3].include?("/")
22
+ content[3], content[4] = content[4], content[3]
23
+ end
24
+ end
25
+
26
+ def spell_gender(contact)
27
+ if contact[2] == "M"
28
+ contact[2] = "Male"
29
+ elsif contact[2] == "F"
30
+ contact[2] = "Female"
31
+ else
32
+ contact
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,15 @@
1
+ class Parser
2
+ include Formatter
3
+
4
+ def initialize(file_path)
5
+ @file_path = file_path
6
+ end
7
+
8
+ def parse
9
+ file = File.open(@file_path)
10
+ contents = file.read
11
+ array = contents.split("\n").map do |content|
12
+ normalize(content)
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,60 @@
1
+ require 'pry'
2
+ class Printer
3
+ include Sorter
4
+
5
+ def print_all
6
+ output_1; output_2; output_3
7
+ end
8
+
9
+ def output_1
10
+ puts "", "Output 1:"
11
+ contacts = sorted_by_ascending_gender_and_last_name
12
+ contacts.each do |contact|
13
+ puts "#{contact.last_name} #{contact.first_name} #{contact.gender} #{contact.birth_date.strftime("%-m/%-d/%Y")} #{contact.favorite_color}"
14
+ end; puts""
15
+ end
16
+
17
+ def output_2
18
+ puts "Output 2:"
19
+ contacts = sorted_by_ascending_birthdate_and_last_name
20
+ contacts.each do |contact|
21
+ puts "#{contact.last_name} #{contact.first_name} #{contact.gender} #{contact.birth_date.strftime("%-m/%-d/%Y")} #{contact.favorite_color}"
22
+ end; puts""
23
+ end
24
+
25
+ def output_3
26
+ puts "Output 3:"
27
+ contacts = sorted_by_last_name_descending
28
+ contacts.each do |contact|
29
+ puts "#{contact.last_name} #{contact.first_name} #{contact.gender} #{contact.birth_date.strftime("%-m/%-d/%Y")} #{contact.favorite_color}"
30
+ end; puts""
31
+ end
32
+
33
+ def email_output_1
34
+ contacts = sorted_by_ascending_gender_and_last_name
35
+ contacts.map do |contact|
36
+ "#{contact.last_name} #{contact.first_name} #{contact.gender} #{contact.birth_date.strftime("%-m/%-d/%Y")} #{contact.favorite_color}"
37
+ end
38
+ end
39
+
40
+ def email_output_2
41
+ contacts = sorted_by_ascending_birthdate_and_last_name
42
+ contacts.map do |contact|
43
+ "#{contact.last_name} #{contact.first_name} #{contact.gender} #{contact.birth_date.strftime("%-m/%-d/%Y")} #{contact.favorite_color}"
44
+ end
45
+ end
46
+
47
+ def email_output_3
48
+ contacts = sorted_by_last_name_descending
49
+ contacts.map do |contact|
50
+ "#{contact.last_name} #{contact.first_name} #{contact.gender} #{contact.birth_date.strftime("%-m/%-d/%Y")} #{contact.favorite_color}"
51
+ end
52
+ end
53
+
54
+ def email_all
55
+ [email_output_1, email_output_2, email_output_3]
56
+ end
57
+
58
+
59
+
60
+ end
@@ -0,0 +1,14 @@
1
+ module Sorter
2
+
3
+ def sorted_by_ascending_gender_and_last_name
4
+ Contacts.all.sort_by{|contact| [contact.gender, contact.last_name]}
5
+ end
6
+
7
+ def sorted_by_ascending_birthdate_and_last_name
8
+ Contacts.all.sort_by{|contact| [contact.birth_date, contact.last_name]}
9
+ end
10
+
11
+ def sorted_by_last_name_descending
12
+ Contacts.all.sort{|a,b| b.last_name <=> a.last_name}
13
+ end
14
+ end
@@ -0,0 +1,3 @@
1
+ module CyrusCodeChallenge
2
+ VERSION = "0.2.1"
3
+ end
metadata ADDED
@@ -0,0 +1,64 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: cyrus-code-challenge
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.2.1
5
+ platform: ruby
6
+ authors:
7
+ - Brennen Awana
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2016-08-04 00:00:00.000000000 Z
12
+ dependencies: []
13
+ description:
14
+ email: brennenawana108ny@gmail.com
15
+ executables:
16
+ - cyrus-code-challenge
17
+ extensions: []
18
+ extra_rdoc_files: []
19
+ files:
20
+ - bin/console
21
+ - bin/cyrus-code-challenge
22
+ - bin/test-output
23
+ - data/comma.txt
24
+ - data/pipe.txt
25
+ - data/space.txt
26
+ - env.rb
27
+ - lib/cyrus-code-challenge.rb
28
+ - lib/cyrus-code-challenge/cli-helpers.rb
29
+ - lib/cyrus-code-challenge/cli.rb
30
+ - lib/cyrus-code-challenge/contacts-creator.rb
31
+ - lib/cyrus-code-challenge/contacts.rb
32
+ - lib/cyrus-code-challenge/email-sender.rb
33
+ - lib/cyrus-code-challenge/formatter.rb
34
+ - lib/cyrus-code-challenge/parser.rb
35
+ - lib/cyrus-code-challenge/printer.rb
36
+ - lib/cyrus-code-challenge/sorter.rb
37
+ - lib/cyrus-code-challenge/version.rb
38
+ homepage: https://github.com/the-widget/code-challenge
39
+ licenses:
40
+ - MIT
41
+ metadata: {}
42
+ post_install_message:
43
+ rdoc_options: []
44
+ require_paths:
45
+ - lib
46
+ - data/input_files
47
+ - lib/cyrus-code-challenge
48
+ required_ruby_version: !ruby/object:Gem::Requirement
49
+ requirements:
50
+ - - ">="
51
+ - !ruby/object:Gem::Version
52
+ version: '0'
53
+ required_rubygems_version: !ruby/object:Gem::Requirement
54
+ requirements:
55
+ - - ">="
56
+ - !ruby/object:Gem::Version
57
+ version: '0'
58
+ requirements: []
59
+ rubyforge_project:
60
+ rubygems_version: 2.5.1
61
+ signing_key:
62
+ specification_version: 4
63
+ summary: My solution for the cyrus-code-challenge, packaged into a CLI gem.
64
+ test_files: []