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