blue_cross_pets 0.0.4

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
+ SHA256:
3
+ metadata.gz: df56e425a1d81d1c1f37a73c6bba9b4c8ed4aeb60e87727f1add909d759ace4f
4
+ data.tar.gz: 75affdcf65076d2248318615a674ede0e01adb59091f754337992e16d13a59cb
5
+ SHA512:
6
+ metadata.gz: 95869a893986b51249e662c39e808277a61c33e58db03f42ca8b0ed6467d35f6ead320e6bb10c74fdac6a3e97d106e85b494a56a312c3d0b75cb1eb0acaf083e
7
+ data.tar.gz: 65066f6ebc8adcd49d7b1646945eaf1618d78d9c366ef824b78ab1396069c8da72e8cc9d8b180ac7a13c35315d59bbe5aedd55d7c5d549a239ba0b2e24b12317
@@ -0,0 +1,5 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require_relative '../lib/blue_cross_pets'
4
+
5
+ BlueCrossPets::CLI.new.call
@@ -0,0 +1,15 @@
1
+ require 'open-uri'
2
+ require 'nokogiri'
3
+ require 'pry'
4
+ require 'colorize'
5
+
6
+ module BlueCrossPets
7
+ # Your code goes here...
8
+ end
9
+
10
+ require_relative "./blue_cross_pets/version"
11
+ require_relative "./blue_cross_pets/cli"
12
+ require_relative "./blue_cross_pets/scraper"
13
+ require_relative "./blue_cross_pets/pet"
14
+ require_relative "./blue_cross_pets/dog"
15
+ require_relative "./blue_cross_pets/cat"
@@ -0,0 +1,63 @@
1
+ require_relative "./pet"
2
+
3
+ class BlueCrossPets::Cat < BlueCrossPets::Pet
4
+
5
+ @@cats = []
6
+
7
+ def initialize(pet_hash)
8
+ pet_hash.each do |attribute, value|
9
+ self.send("#{attribute}=".to_sym, value)
10
+ end
11
+
12
+ @@cats << self
13
+ end
14
+
15
+ def self.all
16
+ @@cats
17
+ end
18
+
19
+ def self.list_all
20
+ self.all.each_with_index do |cat, index|
21
+ puts "#{index + 1}. ".blue + "#{cat.name} - #{cat.breed} - #{cat.gender} - #{cat.age} - #{cat.availability}"
22
+ end
23
+ end
24
+
25
+ def self.scrape_cats
26
+
27
+ if all.length == 0
28
+ cat_array = BlueCrossPets::Scraper.scrape_index("https://www.bluecross.org.uk/rehome/cat")
29
+ create_from_index(cat_array)
30
+ list_all
31
+ elsif all.length > 0
32
+ list_all
33
+ end
34
+
35
+ end
36
+
37
+ def self.get_more_info(input)
38
+
39
+ index = input.to_i - 1
40
+ cat = all[index]
41
+
42
+ if !cat.reference
43
+ attribute_hash = BlueCrossPets::Scraper.scrape_profile(cat.profile_url)
44
+ cat.add_attributes(attribute_hash)
45
+ elsif cat.reference
46
+ end
47
+
48
+ puts "----------------------------- All about #{cat.name} -----------------------------".blue
49
+ puts "Age: ".light_white + "#{cat.age}"
50
+ puts "Gender: ".light_white + "#{cat.gender}"
51
+ puts "Availability: ".light_white + "#{cat.availability}"
52
+ puts "Breed & colour: ".light_white + "#{cat.breed_and_colour}"
53
+
54
+ if cat.can_live_with
55
+ puts "Can live with: ".light_white + "#{cat.can_live_with}"
56
+ end
57
+
58
+ puts "Bio: ".light_white + "#{cat.bio}"
59
+ puts "Animal reference number: ".light_white + "#{cat.reference}"
60
+ puts "Visit my page: ".light_white + "#{cat.profile_url}"
61
+ end
62
+
63
+ end
@@ -0,0 +1,78 @@
1
+ #CLI Controller
2
+
3
+ class BlueCrossPets::CLI
4
+
5
+ attr_accessor :current_animal
6
+
7
+ def call
8
+ puts "Woof! Welcome to the ".bold + "Blue Cross Pet Shelter!".light_white.on_blue.bold + " We heard you're interested in adopting a furry friend.".bold
9
+ choose_animal_type
10
+ goodbye
11
+ end
12
+
13
+ def choose_animal_type
14
+ puts "To learn more about our adoptable dogs, type '" + "dogs".light_white + "'. To learn more about our adoptable cats, type '" + "cats".light_white + "'. To exit, type '" + "exit".light_white + "'."
15
+ input = gets.strip.downcase
16
+ case input
17
+ when "dogs"
18
+ @current_animal = "dog"
19
+ puts "----------------------------- Our dogs: -----------------------------".blue
20
+ BlueCrossPets::Dog.scrape_dogs
21
+ choose_animal
22
+ when "cats"
23
+ @current_animal = "cat"
24
+ puts "----------------------------- Our cats: -----------------------------".blue
25
+ BlueCrossPets::Cat.scrape_cats
26
+ choose_animal
27
+ when "exit"
28
+ else
29
+ puts "Sorry, we didn't understand that!".red
30
+ choose_animal_type
31
+ end
32
+ end
33
+
34
+ def number?(input)
35
+ input = input.to_s unless input.is_a? String
36
+ !!(/\A[+-]?\d+\z/.match(input))
37
+ end
38
+
39
+ def choose_animal
40
+ puts "Please enter the number of the pet you'd like more info on, or type '" + "menu".light_white + "' to choose a different animal, or '" + "exit".light_white + "' to exit."
41
+ input = gets.strip.downcase
42
+
43
+ if number?(input) == true
44
+ if @current_animal == "dog" && input.to_i.between?(1, BlueCrossPets::Dog.all.length)
45
+ puts "Paw-fect choice!".light_white
46
+ BlueCrossPets::Dog.get_more_info(input)
47
+ elsif @current_animal == "cat" && input.to_i.between?(1, BlueCrossPets::Cat.all.length)
48
+ puts "Paw-fect choice!".light_white
49
+ BlueCrossPets::Cat.get_more_info(input)
50
+ else
51
+ puts "Sorry, we didn't understand that!".red
52
+ end
53
+ choose_animal
54
+ else
55
+ case input
56
+ when "menu"
57
+ choose_animal_type
58
+ when "exit"
59
+ else
60
+ puts "Sorry, we didn't understand that!".red
61
+ choose_animal
62
+ end
63
+ end
64
+ end
65
+
66
+ def goodbye
67
+ puts "Thanks for stopping by! Have a great day!".blue.bold
68
+ text = <<-TEXT
69
+ h h
70
+ h(")(")h
71
+ ("),--.(")
72
+ :" ";
73
+ `.____,'
74
+ TEXT
75
+ puts text.light_white
76
+ end
77
+
78
+ end
@@ -0,0 +1,63 @@
1
+ require_relative "./pet"
2
+
3
+ class BlueCrossPets::Dog < BlueCrossPets::Pet
4
+
5
+ @@dogs = []
6
+
7
+ def initialize(pet_hash)
8
+ pet_hash.each do |attribute, value|
9
+ self.send("#{attribute}=".to_sym, value)
10
+ end
11
+
12
+ @@dogs << self
13
+ end
14
+
15
+ def self.all
16
+ @@dogs
17
+ end
18
+
19
+ def self.list_all
20
+ self.all.each_with_index do |dog, index|
21
+ puts "#{index + 1}. ".blue + "#{dog.name} - #{dog.breed} - #{dog.gender} - #{dog.age} - #{dog.availability}"
22
+ end
23
+ end
24
+
25
+ def self.scrape_dogs
26
+
27
+ if all.length == 0
28
+ dog_array = BlueCrossPets::Scraper.scrape_index("https://www.bluecross.org.uk/rehome/dog")
29
+ create_from_index(dog_array)
30
+ list_all
31
+ elsif all.length > 0
32
+ list_all
33
+ end
34
+
35
+ end
36
+
37
+ def self.get_more_info(input)
38
+
39
+ index = input.to_i - 1
40
+ dog = all[index]
41
+
42
+ if !dog.reference
43
+ attribute_hash = BlueCrossPets::Scraper.scrape_profile(dog.profile_url)
44
+ dog.add_attributes(attribute_hash)
45
+ elsif dog.reference
46
+ end
47
+
48
+ puts "----------------------------- All about #{dog.name} -----------------------------".blue
49
+ puts "Age: ".light_white + "#{dog.age}"
50
+ puts "Gender: ".light_white + "#{dog.gender}"
51
+ puts "Availability: ".light_white + "#{dog.availability}"
52
+ puts "Breed & colour: ".light_white + "#{dog.breed_and_colour}"
53
+
54
+ if dog.can_live_with
55
+ puts "Can live with: ".light_white + "#{dog.can_live_with}"
56
+ end
57
+
58
+ puts "Bio: ".light_white + "#{dog.bio}"
59
+ puts "Animal reference number: ".light_white + "#{dog.reference}"
60
+ puts "Visit my page: ".light_white + "#{dog.profile_url}"
61
+ end
62
+
63
+ end
@@ -0,0 +1,18 @@
1
+ class BlueCrossPets::Pet
2
+
3
+ attr_accessor :name, :breed, :gender, :age, :availability, :profile_url, :bio, :breed_and_colour, :can_live_with, :reference
4
+
5
+ def self.create_from_index(pet_array)
6
+ pet_array.each do |pet_hash|
7
+ self.new(pet_hash)
8
+ end
9
+ end
10
+
11
+ def add_attributes(attribute_hash)
12
+ attribute_hash.each do |attribute, value|
13
+ self.send("#{attribute}=".to_sym, value)
14
+ end
15
+ self
16
+ end
17
+
18
+ end
@@ -0,0 +1,50 @@
1
+ class BlueCrossPets::Scraper
2
+
3
+ def self.scrape_index(index_url)
4
+ html = open(index_url)
5
+
6
+ pet_index = Nokogiri::HTML(html)
7
+ pets = []
8
+
9
+ profile_url =
10
+
11
+ pet_index.css("a.item__link").each do |pet_info|
12
+ name = pet_info.css("h3.item__title").text
13
+ breed = pet_info.css("ul.item__body li")[0].text
14
+ gender = pet_info.css("ul.item__body li")[1].text
15
+ age = pet_info.css("ul.item__body li")[2].text.gsub("\n", "").gsub("\t", "").strip
16
+ profile_url = "https://www.bluecross.org.uk" + pet_info.attribute("href").value
17
+
18
+ if pet_info.css("div.banner").length > 0
19
+ availability = "Reserved"
20
+ elsif pet_info.css("div.banner").length == 0
21
+ availability = "Available"
22
+ end
23
+
24
+ pets << {name: name, breed: breed, gender: gender, age: age, profile_url: profile_url, availability: availability}
25
+ end
26
+
27
+ pets
28
+ end
29
+
30
+ def self.scrape_profile(profile_url)
31
+ pet_profile = Nokogiri::HTML(open(profile_url))
32
+
33
+ attributes_hash = {}
34
+
35
+ if pet_profile.css("div.column-main p").length > 0
36
+ attributes_hash[:bio] = pet_profile.css("div.column-main p").text
37
+ end
38
+
39
+ pet_profile.css("div.column-aside").each do |attribute|
40
+ attributes_hash[:breed_and_colour] = attribute.css("li.pet-details_species").text.split(" - ")[1].strip
41
+ attributes_hash[:reference] = attribute.css("li.pet-details_reference").text.gsub("\n", "").split(":")[1].strip
42
+ if attribute.css("li.pet-details_info").length > 0
43
+ attributes_hash[:can_live_with] = attribute.css("li.pet-details_info").text.gsub("\n", "").split(":")[1].strip
44
+ end
45
+ end
46
+
47
+ attributes_hash
48
+ end
49
+
50
+ end
@@ -0,0 +1,3 @@
1
+ module BlueCrossPets
2
+ VERSION = "0.0.4"
3
+ end
metadata ADDED
@@ -0,0 +1,143 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: blue_cross_pets
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.4
5
+ platform: ruby
6
+ authors:
7
+ - "'Jessica Gomes-Ng'"
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2020-04-18 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: bundler
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '2.0'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '2.0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rake
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '12.3'
34
+ - - ">="
35
+ - !ruby/object:Gem::Version
36
+ version: 12.3.3
37
+ type: :development
38
+ prerelease: false
39
+ version_requirements: !ruby/object:Gem::Requirement
40
+ requirements:
41
+ - - "~>"
42
+ - !ruby/object:Gem::Version
43
+ version: '12.3'
44
+ - - ">="
45
+ - !ruby/object:Gem::Version
46
+ version: 12.3.3
47
+ - !ruby/object:Gem::Dependency
48
+ name: pry
49
+ requirement: !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - "~>"
52
+ - !ruby/object:Gem::Version
53
+ version: 0.13.1
54
+ type: :development
55
+ prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ requirements:
58
+ - - "~>"
59
+ - !ruby/object:Gem::Version
60
+ version: 0.13.1
61
+ - !ruby/object:Gem::Dependency
62
+ name: rspec
63
+ requirement: !ruby/object:Gem::Requirement
64
+ requirements:
65
+ - - "~>"
66
+ - !ruby/object:Gem::Version
67
+ version: 3.9.0
68
+ type: :development
69
+ prerelease: false
70
+ version_requirements: !ruby/object:Gem::Requirement
71
+ requirements:
72
+ - - "~>"
73
+ - !ruby/object:Gem::Version
74
+ version: 3.9.0
75
+ - !ruby/object:Gem::Dependency
76
+ name: nokogiri
77
+ requirement: !ruby/object:Gem::Requirement
78
+ requirements:
79
+ - - "~>"
80
+ - !ruby/object:Gem::Version
81
+ version: 1.10.9
82
+ type: :runtime
83
+ prerelease: false
84
+ version_requirements: !ruby/object:Gem::Requirement
85
+ requirements:
86
+ - - "~>"
87
+ - !ruby/object:Gem::Version
88
+ version: 1.10.9
89
+ - !ruby/object:Gem::Dependency
90
+ name: colorize
91
+ requirement: !ruby/object:Gem::Requirement
92
+ requirements:
93
+ - - "~>"
94
+ - !ruby/object:Gem::Version
95
+ version: 0.8.1
96
+ type: :runtime
97
+ prerelease: false
98
+ version_requirements: !ruby/object:Gem::Requirement
99
+ requirements:
100
+ - - "~>"
101
+ - !ruby/object:Gem::Version
102
+ version: 0.8.1
103
+ description: Displays all the available dogs/cats listed on the Blue Cross UK website.
104
+ This is my first gem, so please feel free to add suggestions.
105
+ email:
106
+ - "'jgnpeluso@gmail.com'"
107
+ executables:
108
+ - blue_cross_pets
109
+ extensions: []
110
+ extra_rdoc_files: []
111
+ files:
112
+ - bin/blue_cross_pets
113
+ - lib/blue_cross_pets.rb
114
+ - lib/blue_cross_pets/cat.rb
115
+ - lib/blue_cross_pets/cli.rb
116
+ - lib/blue_cross_pets/dog.rb
117
+ - lib/blue_cross_pets/pet.rb
118
+ - lib/blue_cross_pets/scraper.rb
119
+ - lib/blue_cross_pets/version.rb
120
+ homepage: https://github.com/jessicagomesng/blue_cross_pets
121
+ licenses:
122
+ - MIT
123
+ metadata: {}
124
+ post_install_message:
125
+ rdoc_options: []
126
+ require_paths:
127
+ - lib
128
+ required_ruby_version: !ruby/object:Gem::Requirement
129
+ requirements:
130
+ - - ">="
131
+ - !ruby/object:Gem::Version
132
+ version: '0'
133
+ required_rubygems_version: !ruby/object:Gem::Requirement
134
+ requirements:
135
+ - - ">="
136
+ - !ruby/object:Gem::Version
137
+ version: '0'
138
+ requirements: []
139
+ rubygems_version: 3.0.3
140
+ signing_key:
141
+ specification_version: 4
142
+ summary: CLI that display Blue Cross UK adoptable dogs/cats
143
+ test_files: []