nytimes_cli 0.1.8

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
+ SHA1:
3
+ metadata.gz: 485c4d2f7a55939cdd8e07e1d4dfa0abb180527d
4
+ data.tar.gz: ee2ad28060dbcb739b3c3578ffbf42066768f9a3
5
+ SHA512:
6
+ metadata.gz: 66367a084ca445b35f9474dd40d25e395637078836dbf8cd6df71d7b837a9d27cc9d134f99c458d1a84551f363b76fcd036f73dc7753aa9b2ee40a3706ff3b17
7
+ data.tar.gz: 7e0e385204a68906811263591d24ad0102a37b4783dd0fe0a0b9aa95bbbb72c3fb0303f1f314a39c6aba77ae4f70e8db1251942c931341ae36d93578dd545a7c
data/bin/console ADDED
@@ -0,0 +1,14 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require "bundler/setup"
4
+ require "nytimes_cli"
5
+
6
+ # You can add fixtures and/or initialization code here to make experimenting
7
+ # with your gem easier. You can also use a different console, if you like.
8
+
9
+ # (If you use this, don't forget to add pry to your Gemfile!)
10
+ # require "pry"
11
+ # Pry.start
12
+
13
+ require "irb"
14
+ IRB.start
data/bin/nytimes_cli ADDED
@@ -0,0 +1,10 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'require_all'
4
+
5
+
6
+ require_rel '../lib'
7
+
8
+
9
+ NytimesCli::CLI.new.call
10
+
data/bin/setup ADDED
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+ IFS=$'\n\t'
4
+ set -vx
5
+
6
+ bundle install
7
+
8
+ # Do any other automated setup that you need to do here
data/lib/article.rb ADDED
@@ -0,0 +1,84 @@
1
+ class Article
2
+
3
+ attr_accessor :title, :author, :url, :story
4
+
5
+ @@articles = []
6
+
7
+
8
+ def initialize(title = nil, url = nil, author = nil, story = nil)
9
+ @title = title
10
+ @author = author
11
+ @url = url
12
+ @story = story
13
+ end
14
+
15
+
16
+ def self.create_articles_from_array(array)
17
+
18
+ array.each do |article|
19
+ title = article[:title]
20
+ url = article[:url]
21
+ a = Article.new(title, url)
22
+ @@articles << a
23
+ end
24
+ @@articles
25
+ end
26
+
27
+ def self.all
28
+ @@articles
29
+ end
30
+
31
+
32
+ def self.create_article_from_hash(hash)
33
+ a = Article.new
34
+ a.title = hash[:title]
35
+ a.url = hash[:url]
36
+ a.author = hash[:author]
37
+ string = hash[:story]
38
+ a.story = self.word_wrap(hash[:story])
39
+ a
40
+ end
41
+
42
+ def self.word_wrap(text)
43
+
44
+ paragraphs = []
45
+
46
+ paragraphs = text.split(/\n/)
47
+ finshed_text = ""
48
+
49
+ paragraphs.each do |p|
50
+ final_p = self.p_wrap(p, 78)
51
+ finshed_text << "\n" + final_p
52
+ end
53
+ finshed_text
54
+ end
55
+
56
+
57
+
58
+ #following method was taken from https://www.safaribooksonline.com/library/view/ruby-cookbook/0596523696/ch01s15.html
59
+ def self.p_wrap(s, width=78)
60
+ lines = []
61
+ line = ""
62
+ s.split(/\s+/).each do |word|
63
+ if line.size + word.size >= width
64
+ lines << line
65
+ line = word
66
+ elsif line.empty?
67
+ line = word
68
+ else
69
+ line << " " << word
70
+ end
71
+ end
72
+ lines << line if line
73
+ return lines.join "\n"
74
+ end
75
+
76
+
77
+
78
+
79
+
80
+
81
+
82
+
83
+
84
+ end
@@ -0,0 +1,163 @@
1
+ # cli controller
2
+
3
+ class NytimesCli::CLI
4
+
5
+ attr_accessor :index
6
+
7
+ def call
8
+ puts ""
9
+ puts ""
10
+ puts "Welcome to Nytimes CLI"
11
+ puts "All articles © The New York Times"
12
+ puts "http://www.nytimes.com"
13
+ puts ""
14
+ puts ""
15
+ front
16
+ puts ""
17
+ puts ""
18
+ puts "There are currently " + num_articles + " articles on the front page of nytimes.com."
19
+ puts ""
20
+ num = get_articles.length
21
+ index(num)
22
+ interface_logic
23
+
24
+ end
25
+
26
+
27
+
28
+
29
+ def get_articles_from_front_page
30
+ array = Scraper.scrape_front_page
31
+ articles = Article.create_articles_from_array(array)
32
+ articles
33
+ end
34
+
35
+ def num_articles
36
+ get_articles.length.to_s
37
+ end
38
+
39
+ def input_to_index(num)
40
+ num.to_i - 1
41
+ end
42
+
43
+ def front
44
+ print_articles(0, 9)
45
+ end
46
+
47
+
48
+ #TODO
49
+ def print_articles(first_index, last_index )
50
+ array = get_articles_from_front_page
51
+ a = array[first_index..last_index]
52
+ a.each do |article|
53
+ all_articles = get_articles
54
+ i = all_articles.index(article) + 1
55
+ puts i.to_s + ". " + article.title
56
+ end
57
+ puts ""
58
+ puts ""
59
+
60
+ end
61
+
62
+ def index(num)
63
+ @index = Navagation.new(num)
64
+ end
65
+
66
+ def get_articles
67
+ Article.all
68
+ end
69
+
70
+ def get_article_url(num)
71
+ i = input_to_index(num)
72
+ a = get_articles[i]
73
+ a.url
74
+ end
75
+
76
+ def get_article(url)
77
+ hash = Scraper.scrape_article(url)
78
+ article = Article.create_article_from_hash(hash)
79
+ end
80
+
81
+
82
+ def print_article(num)
83
+ url = get_article_url(num)
84
+ a = get_article(url)
85
+ puts ""
86
+ puts ""
87
+ puts a.title
88
+ puts ""
89
+ puts a.author
90
+ puts ""
91
+ puts a.story
92
+ puts ""
93
+ puts ""
94
+ puts "Link to nytimes.com: " + a.url
95
+ puts ""
96
+ puts ""
97
+
98
+ end
99
+
100
+ def show_manual
101
+
102
+ puts "man -> displays manual"
103
+ puts "front -> shows first ten headlines"
104
+ puts "more -> shows 10 more headlines"
105
+ puts "less -> shows previous 10 headlines"
106
+ puts "exit -> terminates program"
107
+ puts ""
108
+ puts ""
109
+ puts "All articles © The New York Times"
110
+ puts "http://www.nytimes.com"
111
+ puts ""
112
+ puts ""
113
+
114
+ end
115
+
116
+ def more
117
+ @index.more
118
+ print_articles(@index.start_index, @index.end_index)
119
+ end
120
+
121
+ def less
122
+ @index.less
123
+ print_articles(@index.start_index, @index.end_index)
124
+ end
125
+
126
+ def interface_logic
127
+ while true
128
+ puts "Enter the number you would like to read or 'man' to see a list of commands."
129
+ answer = gets.chomp
130
+ if answer.upcase == "EXIT"
131
+ puts ""
132
+ puts "Ciao. Auf Wiedersehen. Goodbye."
133
+ puts ""
134
+ puts ""
135
+ exit
136
+ elsif answer.to_i.class == Fixnum && answer.to_i != 0
137
+ print_article(answer)
138
+ elsif answer.upcase == "MAN"
139
+ show_manual
140
+ elsif answer.upcase == "MORE"
141
+ more
142
+ elsif answer.upcase == "LESS"
143
+ less
144
+ elsif answer.upcase == "FRONT"
145
+ print_articles(0, 9)
146
+ else
147
+ puts ""
148
+ puts ""
149
+ puts "That was not a valid entry. Please try again."
150
+ puts ""
151
+ puts ""
152
+ end
153
+
154
+ end
155
+
156
+ end
157
+
158
+
159
+
160
+
161
+
162
+
163
+ end
@@ -0,0 +1,32 @@
1
+ class Navagation
2
+
3
+ attr_accessor :start_index, :end_index, :articles_length
4
+
5
+ def initialize(length)
6
+ @start_index = 0
7
+ @end_index = 9
8
+ @articles_length = length
9
+ end
10
+
11
+
12
+ def more
13
+ if @end_index + 10 < @articles_length
14
+ @start_index += 10
15
+ @end_index += 10
16
+ else
17
+ @start_index = @articles_length - 9
18
+ @end_index = @articles_length
19
+ end
20
+ end
21
+
22
+ def less
23
+ if @start_index >= 10
24
+ @start_index -= 10
25
+ @end_index = @start_index + 9
26
+ else
27
+ @start_index = 0
28
+ @end_index = 9
29
+ end
30
+ end
31
+
32
+ end
@@ -0,0 +1,3 @@
1
+ module NytimesCli
2
+ VERSION = "0.1.8"
3
+ end
File without changes
data/lib/scraper.rb ADDED
@@ -0,0 +1,69 @@
1
+ require 'mechanize'
2
+
3
+ class Scraper
4
+
5
+ attr_accessor :title, :url, :author, :story
6
+
7
+ BASE_URL = "http://www.nytimes.com"
8
+
9
+ def self.scrape_front_page
10
+
11
+ agent = Mechanize.new
12
+ index = agent.get(BASE_URL)
13
+ front_page_articles = []
14
+ index.css(".story-heading").each do |story|
15
+ val = story.css("a").text
16
+ next if val.nil? || val == false || val == ""
17
+ hash = {
18
+
19
+ :title => story.css("a").text.strip,
20
+ :url => story.css('a').attribute('href').value
21
+ }
22
+
23
+ front_page_articles << hash
24
+ end
25
+
26
+ front_page_articles
27
+ end
28
+
29
+ def self.scrape_article(url)
30
+
31
+ agent = Mechanize.new
32
+ article = agent.get(url)
33
+ stories = []
34
+ story_hash = {}
35
+
36
+ title = article.search("//*[@id='headline']").text
37
+ author = article.search('.byline-author').text
38
+
39
+ story_hash[:title] = title
40
+ story_hash[:author] = author
41
+ story_hash[:url] = url
42
+
43
+ article_string = ""
44
+
45
+ article.search(".story-body *").each do |paragraph|
46
+
47
+ if !article_string.include?(paragraph.children.text)
48
+
49
+ if paragraph.name == "p" && paragraph.children.text != "Advertisement"
50
+ article_string << paragraph.children.text + "\n" + "\n"
51
+ elsif paragraph.name == "h4" && !paragraph.children.text.nil?
52
+ article_string << paragraph.children.text + "\n" + "\n"
53
+ end
54
+ end
55
+
56
+ end
57
+ story_hash[:story] = article_string
58
+
59
+ story_hash
60
+
61
+
62
+ end
63
+
64
+
65
+
66
+
67
+
68
+ end
69
+
metadata ADDED
@@ -0,0 +1,177 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: nytimes_cli
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.8
5
+ platform: ruby
6
+ authors:
7
+ - interestinall
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2016-06-08 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.12'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '1.12'
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: '3.0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '3.0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: require_all
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '1.3'
62
+ - - ">="
63
+ - !ruby/object:Gem::Version
64
+ version: 1.3.3
65
+ type: :development
66
+ prerelease: false
67
+ version_requirements: !ruby/object:Gem::Requirement
68
+ requirements:
69
+ - - "~>"
70
+ - !ruby/object:Gem::Version
71
+ version: '1.3'
72
+ - - ">="
73
+ - !ruby/object:Gem::Version
74
+ version: 1.3.3
75
+ - !ruby/object:Gem::Dependency
76
+ name: mechanize
77
+ requirement: !ruby/object:Gem::Requirement
78
+ requirements:
79
+ - - "~>"
80
+ - !ruby/object:Gem::Version
81
+ version: '2.7'
82
+ - - ">="
83
+ - !ruby/object:Gem::Version
84
+ version: 2.7.4
85
+ type: :development
86
+ prerelease: false
87
+ version_requirements: !ruby/object:Gem::Requirement
88
+ requirements:
89
+ - - "~>"
90
+ - !ruby/object:Gem::Version
91
+ version: '2.7'
92
+ - - ">="
93
+ - !ruby/object:Gem::Version
94
+ version: 2.7.4
95
+ - !ruby/object:Gem::Dependency
96
+ name: require_all
97
+ requirement: !ruby/object:Gem::Requirement
98
+ requirements:
99
+ - - "~>"
100
+ - !ruby/object:Gem::Version
101
+ version: '1.3'
102
+ - - ">="
103
+ - !ruby/object:Gem::Version
104
+ version: 1.3.3
105
+ type: :runtime
106
+ prerelease: false
107
+ version_requirements: !ruby/object:Gem::Requirement
108
+ requirements:
109
+ - - "~>"
110
+ - !ruby/object:Gem::Version
111
+ version: '1.3'
112
+ - - ">="
113
+ - !ruby/object:Gem::Version
114
+ version: 1.3.3
115
+ - !ruby/object:Gem::Dependency
116
+ name: mechanize
117
+ requirement: !ruby/object:Gem::Requirement
118
+ requirements:
119
+ - - "~>"
120
+ - !ruby/object:Gem::Version
121
+ version: '2.7'
122
+ - - ">="
123
+ - !ruby/object:Gem::Version
124
+ version: 2.7.4
125
+ type: :runtime
126
+ prerelease: false
127
+ version_requirements: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - "~>"
130
+ - !ruby/object:Gem::Version
131
+ version: '2.7'
132
+ - - ">="
133
+ - !ruby/object:Gem::Version
134
+ version: 2.7.4
135
+ description: Allows users to browse nytimes.com and read articles from the command
136
+ line.
137
+ email:
138
+ - justin.lefurjah@gmail.com
139
+ executables:
140
+ - nytimes_cli
141
+ extensions: []
142
+ extra_rdoc_files: []
143
+ files:
144
+ - bin/console
145
+ - bin/nytimes_cli
146
+ - bin/setup
147
+ - lib/article.rb
148
+ - lib/nytimes_cli.rb
149
+ - lib/nytimes_cli/cli.rb
150
+ - lib/nytimes_cli/navagation.rb
151
+ - lib/nytimes_cli/version.rb
152
+ - lib/scraper.rb
153
+ homepage: https://github.com/interestinall/nytimes_cli
154
+ licenses:
155
+ - MIT
156
+ metadata: {}
157
+ post_install_message:
158
+ rdoc_options: []
159
+ require_paths:
160
+ - lib
161
+ required_ruby_version: !ruby/object:Gem::Requirement
162
+ requirements:
163
+ - - ">="
164
+ - !ruby/object:Gem::Version
165
+ version: '0'
166
+ required_rubygems_version: !ruby/object:Gem::Requirement
167
+ requirements:
168
+ - - ">="
169
+ - !ruby/object:Gem::Version
170
+ version: '0'
171
+ requirements: []
172
+ rubyforge_project:
173
+ rubygems_version: 2.6.4
174
+ signing_key:
175
+ specification_version: 4
176
+ summary: Command line interface for nytimes.com
177
+ test_files: []