dog-breeds 0.1.0
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/dog-breeds +9 -0
- data/config/environment.rb +7 -0
- data/lib/dog_breeds.rb +4 -0
- data/lib/dog_breeds/cli.rb +123 -0
- data/lib/dog_breeds/dog.rb +49 -0
- data/lib/dog_breeds/scrape.rb +20 -0
- metadata +120 -0
checksums.yaml
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
---
|
|
2
|
+
SHA1:
|
|
3
|
+
metadata.gz: 5bf4b3756bf5ea53616bc18bd8e4b96ae1b02a30
|
|
4
|
+
data.tar.gz: ae6d860e68fbdc3c3dd217dccdb6b03d3a14a6f4
|
|
5
|
+
SHA512:
|
|
6
|
+
metadata.gz: 06fe300f8e5632c7c906c25e9f912c3c27a5aeaf830406b3bf62788d5516c76bce91418dd5ffeb606f934dbed5a65d11fa3ca806a4a649ed14c4fcc687337087
|
|
7
|
+
data.tar.gz: 58c78e767226d4b3f4fe26a1099a1813314e639859178a42c184b3a3b11e431417f963021d2b4e469fd9fe760a7a4fd940c3f1f1d373be19f09d1e67a43e2340
|
data/bin/dog-breeds
ADDED
data/lib/dog_breeds.rb
ADDED
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
class DogBreeds::CLI
|
|
2
|
+
|
|
3
|
+
attr_accessor :letter, :dog_name, :dog_list, :dog_details, :dog_name_search
|
|
4
|
+
|
|
5
|
+
def call
|
|
6
|
+
puts "Welcome to the dog breeds list, viewer, and comparison tool"
|
|
7
|
+
start
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
def start
|
|
11
|
+
puts ""
|
|
12
|
+
choose_letter
|
|
13
|
+
|
|
14
|
+
@dog_list = DogBreeds::Scrape.new.get_dogs_by_letter(@letter)
|
|
15
|
+
|
|
16
|
+
@dog_list.size > 0 ? display_dog_list(@dog_list) : no_list
|
|
17
|
+
|
|
18
|
+
puts ""
|
|
19
|
+
choose_dog
|
|
20
|
+
|
|
21
|
+
@dog_details = DogBreeds::Scrape.new.get_dog_by_name(@dog_name_search)
|
|
22
|
+
|
|
23
|
+
if @dog_details.size > 0
|
|
24
|
+
@dog_name = @dog_name_search
|
|
25
|
+
dog = DogBreeds::Dog.create_new_from_details(@dog_name, @dog_details)
|
|
26
|
+
else
|
|
27
|
+
view_again?
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
if @dog_details.size > 0
|
|
31
|
+
display_dog_details(dog)
|
|
32
|
+
else
|
|
33
|
+
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
puts ""
|
|
37
|
+
view_again?
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
def choose_letter
|
|
41
|
+
puts "Select a letter between A to Z for a list of dogs"
|
|
42
|
+
input = gets.strip
|
|
43
|
+
# input = 'j'
|
|
44
|
+
input.match(/^[a-zA-Z]{1}$/i) ? @letter = input.upcase : choose_letter
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
def choose_dog
|
|
48
|
+
puts "Select a number to see details for that dog"
|
|
49
|
+
input = gets.strip
|
|
50
|
+
# input = "3"
|
|
51
|
+
input.match(/^([1-9]|[12][0-9])$/) && input.to_i < @dog_list.count + 1 ? @dog_name_search = @dog_list[input.to_i - 1].downcase.split(" ").join("-") : choose_dog
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
def display_dog_list(list)
|
|
55
|
+
puts "------------ Dog name begins with #{@letter} ------------"
|
|
56
|
+
list.each_with_index do |dog_name, index|
|
|
57
|
+
puts "#{index.to_i + 1}. #{dog_name}"
|
|
58
|
+
end
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
def display_dog_details(dog)
|
|
62
|
+
puts "------------ Details for #{dog.name} ------------"
|
|
63
|
+
|
|
64
|
+
# display dog details
|
|
65
|
+
puts "Name: #{dog.name}"
|
|
66
|
+
puts "Personality: #{dog.personality}"
|
|
67
|
+
puts "Energy Level: #{dog.energy}"
|
|
68
|
+
puts "Good with Children: #{dog.with_children}"
|
|
69
|
+
puts "Good with other dogs: #{dog.with_dogs}"
|
|
70
|
+
puts "Shedding: #{dog.shedding}"
|
|
71
|
+
puts "Grooming: #{dog.grooming}"
|
|
72
|
+
puts "Trainability: #{dog.trainability}"
|
|
73
|
+
puts "Barking Level: #{dog.barking}"
|
|
74
|
+
puts ""
|
|
75
|
+
puts "---------------- Stats ---------------"
|
|
76
|
+
puts "Height Male: #{dog.height_male}"
|
|
77
|
+
puts "Height Female: #{dog.height_female}"
|
|
78
|
+
puts "Weight Male: #{dog.weight_male}"
|
|
79
|
+
puts "Weight Female: #{dog.weight_female}"
|
|
80
|
+
puts "Life Expectancy: #{dog.life}"
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
def no_detail
|
|
84
|
+
puts "This dog does not have any information"
|
|
85
|
+
reset
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
def no_list
|
|
89
|
+
puts "There are no dogs for #{@letter.upcase}. Choose again"
|
|
90
|
+
reset
|
|
91
|
+
end
|
|
92
|
+
|
|
93
|
+
def view_again?
|
|
94
|
+
puts "Do you want to view another dog? Enter Y or N"
|
|
95
|
+
input = gets.strip.downcase
|
|
96
|
+
# input = "n"
|
|
97
|
+
if input == "y"
|
|
98
|
+
reset
|
|
99
|
+
elsif input == "n"
|
|
100
|
+
exit
|
|
101
|
+
else
|
|
102
|
+
view_again?
|
|
103
|
+
end
|
|
104
|
+
end
|
|
105
|
+
|
|
106
|
+
def reset
|
|
107
|
+
@letter = ""
|
|
108
|
+
@dog_name = ""
|
|
109
|
+
@dog_name_search = ""
|
|
110
|
+
@dog_list = []
|
|
111
|
+
@dog_details = []
|
|
112
|
+
|
|
113
|
+
start
|
|
114
|
+
end
|
|
115
|
+
|
|
116
|
+
def exit
|
|
117
|
+
puts "Have a nice day"
|
|
118
|
+
# DogBreeds::Dog.all.each do |dog|
|
|
119
|
+
# puts dog.name
|
|
120
|
+
# end
|
|
121
|
+
end
|
|
122
|
+
|
|
123
|
+
end
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
class DogBreeds::Dog
|
|
2
|
+
attr_accessor :name, :personality, :energy, :with_children, :with_dogs, :shedding, :grooming, :trainability, :height_male, :height_female, :weight_male, :weight_female, :life, :barking
|
|
3
|
+
|
|
4
|
+
@@all = []
|
|
5
|
+
|
|
6
|
+
def self.all
|
|
7
|
+
@@all
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
# def initialize(attributes)
|
|
11
|
+
# attributes.each {|key, value| self.send(("#{key}="), value)}
|
|
12
|
+
# end
|
|
13
|
+
|
|
14
|
+
def self.create_new_from_details(name, details)
|
|
15
|
+
n = name.split("-").each { |w| w.capitalize! }.join(" ")
|
|
16
|
+
p = details[0]
|
|
17
|
+
e = details[1]
|
|
18
|
+
wc = details[2]
|
|
19
|
+
wd = details[3]
|
|
20
|
+
s = details[4]
|
|
21
|
+
g = details[5]
|
|
22
|
+
t = details[6]
|
|
23
|
+
hm = details[7].split(",").count == 2 ? details[7].split(",")[0] : details[7]
|
|
24
|
+
hf = details[7].split(",").count == 2 ? details[7].split(",")[0] : details[7]
|
|
25
|
+
wm = details[8].split(",").count == 2 ? details[8].split(",")[1] : details[8]
|
|
26
|
+
wf = details[8].split(",").count == 2 ? details[8].split(",")[1] : details[8]
|
|
27
|
+
l = details[9]
|
|
28
|
+
b = details[10]
|
|
29
|
+
self.new(n, p, e, wc, wd, s, g, t, hm, hf, wm, wf, l, b)
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
def initialize(name, personality = nil, energy = nil, with_children = nil, with_dogs = nil, shedding = nil, grooming = nil, trainability = nil, height_male = nil, height_female = nil, weight_male = nil, weight_female = nil, life = nil, barking = nil)
|
|
33
|
+
@name = name
|
|
34
|
+
@personality = personality
|
|
35
|
+
@energy = energy
|
|
36
|
+
@with_children = with_children
|
|
37
|
+
@with_dogs = with_dogs
|
|
38
|
+
@shedding = shedding
|
|
39
|
+
@grooming = grooming
|
|
40
|
+
@trainability = trainability
|
|
41
|
+
@height_male = height_male
|
|
42
|
+
@height_female = height_female
|
|
43
|
+
@weight_male = weight_male
|
|
44
|
+
@weight_female = weight_female
|
|
45
|
+
@life = life
|
|
46
|
+
@barking = barking
|
|
47
|
+
@@all << self
|
|
48
|
+
end
|
|
49
|
+
end
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
class DogBreeds::Scrape
|
|
2
|
+
URL = "http://www.akc.org/dog-breeds"
|
|
3
|
+
|
|
4
|
+
def get_dogs_by_letter(letter)
|
|
5
|
+
result = get_html("?letter=#{letter}", "az_search")
|
|
6
|
+
result.collect { |dog| dog.css('.scale-contents h2 a').text }[0..-2]
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
def get_dog_by_name(name) # returns an array of the individual dog traits
|
|
10
|
+
result = get_html("#{name}", "name_search")
|
|
11
|
+
result.size > 0 ? result.collect { |detail| detail.text.split(":")[1].strip } : []
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
private
|
|
15
|
+
|
|
16
|
+
def get_html(arg, type) # returns an array of dog names by latter (with last element removed, which is a node with no data)
|
|
17
|
+
search = type == "az_search" ? "div.event-contain .event" : "div.breed-details__main li"
|
|
18
|
+
Nokogiri::HTML(open("#{URL}/#{arg}")).css(search)
|
|
19
|
+
end
|
|
20
|
+
end
|
metadata
ADDED
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
|
2
|
+
name: dog-breeds
|
|
3
|
+
version: !ruby/object:Gem::Version
|
|
4
|
+
version: 0.1.0
|
|
5
|
+
platform: ruby
|
|
6
|
+
authors:
|
|
7
|
+
- Robert Laws
|
|
8
|
+
autorequire:
|
|
9
|
+
bindir: bin
|
|
10
|
+
cert_chain: []
|
|
11
|
+
date: 2017-09-23 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: '1.10'
|
|
20
|
+
type: :development
|
|
21
|
+
prerelease: false
|
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
23
|
+
requirements:
|
|
24
|
+
- - "~>"
|
|
25
|
+
- !ruby/object:Gem::Version
|
|
26
|
+
version: '1.10'
|
|
27
|
+
- !ruby/object:Gem::Dependency
|
|
28
|
+
name: rake
|
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
|
30
|
+
requirements:
|
|
31
|
+
- - "~>"
|
|
32
|
+
- !ruby/object:Gem::Version
|
|
33
|
+
version: '10.0'
|
|
34
|
+
type: :development
|
|
35
|
+
prerelease: false
|
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
37
|
+
requirements:
|
|
38
|
+
- - "~>"
|
|
39
|
+
- !ruby/object:Gem::Version
|
|
40
|
+
version: '10.0'
|
|
41
|
+
- !ruby/object:Gem::Dependency
|
|
42
|
+
name: rspec
|
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
|
44
|
+
requirements:
|
|
45
|
+
- - ">="
|
|
46
|
+
- !ruby/object:Gem::Version
|
|
47
|
+
version: '0'
|
|
48
|
+
type: :development
|
|
49
|
+
prerelease: false
|
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
51
|
+
requirements:
|
|
52
|
+
- - ">="
|
|
53
|
+
- !ruby/object:Gem::Version
|
|
54
|
+
version: '0'
|
|
55
|
+
- !ruby/object:Gem::Dependency
|
|
56
|
+
name: nokogiri
|
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
|
58
|
+
requirements:
|
|
59
|
+
- - ">="
|
|
60
|
+
- !ruby/object:Gem::Version
|
|
61
|
+
version: '0'
|
|
62
|
+
type: :development
|
|
63
|
+
prerelease: false
|
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
65
|
+
requirements:
|
|
66
|
+
- - ">="
|
|
67
|
+
- !ruby/object:Gem::Version
|
|
68
|
+
version: '0'
|
|
69
|
+
- !ruby/object:Gem::Dependency
|
|
70
|
+
name: pry
|
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
|
72
|
+
requirements:
|
|
73
|
+
- - ">="
|
|
74
|
+
- !ruby/object:Gem::Version
|
|
75
|
+
version: '0'
|
|
76
|
+
type: :development
|
|
77
|
+
prerelease: false
|
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
79
|
+
requirements:
|
|
80
|
+
- - ">="
|
|
81
|
+
- !ruby/object:Gem::Version
|
|
82
|
+
version: '0'
|
|
83
|
+
description: Find names of dog breeds and read detailed information about each breed.
|
|
84
|
+
email: roblaws@me.com
|
|
85
|
+
executables:
|
|
86
|
+
- dog-breeds
|
|
87
|
+
extensions: []
|
|
88
|
+
extra_rdoc_files: []
|
|
89
|
+
files:
|
|
90
|
+
- bin/dog-breeds
|
|
91
|
+
- config/environment.rb
|
|
92
|
+
- lib/dog_breeds.rb
|
|
93
|
+
- lib/dog_breeds/cli.rb
|
|
94
|
+
- lib/dog_breeds/dog.rb
|
|
95
|
+
- lib/dog_breeds/scrape.rb
|
|
96
|
+
homepage: http://rubygems.org/gems/dog-breeds
|
|
97
|
+
licenses:
|
|
98
|
+
- MIT
|
|
99
|
+
metadata: {}
|
|
100
|
+
post_install_message:
|
|
101
|
+
rdoc_options: []
|
|
102
|
+
require_paths:
|
|
103
|
+
- lib
|
|
104
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
|
105
|
+
requirements:
|
|
106
|
+
- - ">="
|
|
107
|
+
- !ruby/object:Gem::Version
|
|
108
|
+
version: '0'
|
|
109
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
110
|
+
requirements:
|
|
111
|
+
- - ">="
|
|
112
|
+
- !ruby/object:Gem::Version
|
|
113
|
+
version: '0'
|
|
114
|
+
requirements: []
|
|
115
|
+
rubyforge_project:
|
|
116
|
+
rubygems_version: 2.5.1
|
|
117
|
+
signing_key:
|
|
118
|
+
specification_version: 4
|
|
119
|
+
summary: Explore Dog Breeds
|
|
120
|
+
test_files: []
|