From: Eric Hodel Date: 2005-03-08T07:18:23+09:00 Subject: Re: [Job] Ruby Developers in Tokyo, Japan --Apple-Mail-70-930182910 Content-Transfer-Encoding: 7bit Content-Type: text/plain; charset=US-ASCII; format=flowed On 07 Mar 2005, at 06:53, Zev Blut wrote: > #!/usr/bin/env ruby > > # Warning this is a job announcement! > # Run it/Read it if you are interested. > # Lack of comments and robust input handling are intentional. > > class Company > attr_accessor :name, :location, :web_site, :description > attr_accessor :available_jobs > > def initialize(name = nil, location = nil, web_site = nil) > self.name = name > self.location = location > self.web_site = web_site > self.available_jobs = Array.new > end > > def ask_for_interview?(job_applicant) > available_jobs.each do |ajob| > return true if ajob.meets_requirements?(job_applicant) > end > false > end > > def describe > puts "Company : #{name}" > puts "Location : #{location}" > puts "Web site : #{web_site}" > puts "","Brief description :" > puts description, "" > end I like this better, much cleaner than puts with ',', which I don't see very often. Also, you could pass this array around everywhere, then join the whole thing up at the end for printing (so you could, say, HTML format it or something). def describe desc = [] desc << "Company : #{name}" desc << "Location : #{location}" desc << "Web site : #{web_site}" desc << "" << "Brief description :" << description << "" puts desc.join('\n') end > def announce_job_availability(good_match, not_so_good_match) > return if available_jobs.empty? > describe > puts "Available jobs:" > available_jobs.each_with_index do |job, idx| > puts "", "#{idx + 1} ) #{job.name}", job.description, "" > end > > job_applicant = ask_for_job_applicant_information > return if job_applicant.nil? > > if ask_for_interview?( job_applicant ) > puts good_match > else > puts not_so_good_match > end > end > > def ask_for_job_applicant_information > job_applicant = nil > puts "Would you like to apply for a job? Y/N" > res = gets.chomp > if res =~ /Y/i > msg = "Great! Please follow the prompts to input your profile" > msg<< " to see if there if a job matches." > puts msg, "" > job_applicant = JobApplicant.new_from_interactive_shell > else > puts "Well thanks for reading/running the program! Good Bye!" > end > job_applicant > end > > end > > class Job > attr_accessor :name, :description, :requirements, :threshold > def initialize(name = nil, description = nil, > threshold = 100, requirements = [] ) > self.name = name > self.description = description > self.requirements = requirements > self.threshold = threshold > end > > def meets_requirements?(job_applicant) > points = 0 > requirements.each do |req| > points += req.check_requirement(job_applicant) > end > points >= threshold > end > > end > > class JobApplicant > attr_accessor :name, :resume, :location > attr_accessor :spoken_languages, :computer_languages_skills > def initialize > self.spoken_languages = Array.new > self.computer_languages_skills = Array.new > end > > def JobApplicant.new_from_interactive_shell > applicant = JobApplicant.new > puts "What is your name?" > applicant.name = gets.chomp > puts "Where do you live? (City, Country)" > applicant.location = gets.chomp > note = " [One entry per line. Press CTRL-D to stop input] " > puts "What languages do you speak?", note > applicant.spoken_languages = readlines.map { |d| d.chomp } > cq1 = "What computer languages are you proficient in?" > cq2 = "And what other computer skills do you have?" > puts cq1, cq2, note > applicant.computer_languages_skills = readlines.map {|d| d.chomp } > puts "" > applicant > end > > end > > class Requirement > > def initialize(points = 1, &proc) > @points = points > if proc > @requirement_calc = proc > else > @requirement_calc = Proc.new { |x| true } > end > end > > def check_requirement(job_applicant) > points = 0 > if @requirement_calc.call(job_applicant) > points = @points > end > points > end def check_requirement(applicant) if @requirement_calc.call applicant then return @points else return 0 end end Is clearer. If you like minimal-number-of-lines, then: def check_requirement(applicant) @requirement_calc.call(applicant) ? @points : 0 end > end > > loose_find = lambda do |data, reg_match| > data.find { |v| v =~ match } > end loose_find = lambda do |data, reg_match| data.find { |v| v =~ reg_match } end > reqs = Array.new > reqs<< Requirement.new(25) do |ja| > ja.spoken_languages.include?("English") > end Too wordy. class Requirements < Array def add(points, &block) req = Requirement.new(25, &block) super(req) end end reqs = Requirements.new reqs.add 25 { |ja| ja.spoken_languages.include? 'English' } reqs.add 25 { |ja| ja.spoken_languages.include? 'Japanese' } [...] > developer.requirements = reqs > developer.threshold = 125 > > ubit.available_jobs<< developer > > good_match =< Your profile looks promising! > If you are interested in working with us, > please send your resume to Zev Blut at rubyzbibd@ubit.com > EOF > > nsgm =< Sorry, at the moment we are in need of people who meet our specific > needs. But if you feel that you can meet them then go ahead and send > your resume to Zev Blut at rubyzbibd@ubit.com > EOF > > ubit.announce_job_availability(good_match,nsgm) > -- Eric Hodel - drbrain@segment7.net - http://segment7.net FEC2 57F1 D465 EB15 5D6E 7C11 332A 551C 796C 9F04 --Apple-Mail-70-930182910 content-type: application/pgp-signature; x-mac-type=70674453; name=PGP.sig content-description: This is a digitally signed message part content-disposition: inline; filename=PGP.sig content-transfer-encoding: 7bit -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.2.4 (Darwin) iD8DBQFCLNMeMypVHHlsnwQRAnKhAJ9SmEQDJc40QT6cfhfJEqqKAb7bgwCeKCF8 X8Z46HqNn2Hl6JLbp8sWt30= =qQMT -----END PGP SIGNATURE----- --Apple-Mail-70-930182910--