blue_cross_pets 0.0.4
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.
- checksums.yaml +7 -0
- data/bin/blue_cross_pets +5 -0
- data/lib/blue_cross_pets.rb +15 -0
- data/lib/blue_cross_pets/cat.rb +63 -0
- data/lib/blue_cross_pets/cli.rb +78 -0
- data/lib/blue_cross_pets/dog.rb +63 -0
- data/lib/blue_cross_pets/pet.rb +18 -0
- data/lib/blue_cross_pets/scraper.rb +50 -0
- data/lib/blue_cross_pets/version.rb +3 -0
- metadata +143 -0
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
|
data/bin/blue_cross_pets
ADDED
@@ -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
|
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: []
|