hack3rnews 0.0.0

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: 5dc1c348fab112a324ae441e4310a69484572aa3a8500fe3bbef7075e713b331
4
+ data.tar.gz: daca0d8d89d6548ee506688168f2fd60eb76e14a98abe226712e41e673e8a104
5
+ SHA512:
6
+ metadata.gz: 38fe1eafd2327457ffcd5d6637a779c9efc6c47445d478e688f4b034c0c3340046a36236b0968eafab2b4b5917dd9da2211ca685b335a2e9e8ba23f75c414087
7
+ data.tar.gz: 9684b38fd27da616932b4c7fa8777c9e37c5264d4540c80840bdd8ca4fe1335c468bb9b802f305ac7d64abcbb40d92da691d5cc01797913ee95589171911b237
data/README.md ADDED
@@ -0,0 +1,11 @@
1
+ # Hackernews-gem
2
+ Ruby gem for consume Hackernews API
3
+
4
+ Information for the API: [HackerNewsAPI](https://github.com/HackerNews/API)
5
+
6
+ ## Requirements:
7
+ * Get the last 20 new stories with all the information
8
+ * Get the last 20 top stories with all the information
9
+ * Get the last 10 stories for a specific user (you will need to know his/her username)
10
+ * Get all the comments of a specific story
11
+ * Get the last 20 hihghest-rated score job stories
data/lib/hack3rnews.rb ADDED
@@ -0,0 +1,76 @@
1
+ require 'rest-client'
2
+ require 'json'
3
+
4
+ class HackerNew
5
+ URL = 'https://hacker-news.firebaseio.com/v0/'.freeze
6
+ JSON_FORMAT = '/.json?print=pretty'.freeze
7
+
8
+ class << self
9
+ def new_stories(num = 5)
10
+ capture_stories('newstories', num)
11
+ end
12
+
13
+ def top_stories(num = 5)
14
+ capture_stories('topstories', num)
15
+ end
16
+
17
+ def user_stories(user, num = 5)
18
+ capture_item_kids('user', num: num, item_id: user, kind: 'submitted')
19
+ end
20
+
21
+ def story_comments(story)
22
+ capture_item_kids('item', item_id: story, kind: 'kids')
23
+ end
24
+
25
+ def top_job_stories(num = 5)
26
+ job_scores = []
27
+ request_bunch('jobstories').each do |job_id|
28
+ job_scores << request_item('item', job_id)
29
+ end
30
+ job_scores.sort_by! { |hsh| hsh["score"] }
31
+ job_scores.last(num).reverse
32
+ end
33
+
34
+ private
35
+ def capture_item_kids(type, opt = {})
36
+ kids = []
37
+ item = request_item(type, opt[:item_id])
38
+ kid_ids = capture_ids(item, opt)
39
+ while kid_id = kid_ids.shift
40
+ kids << request_item('item', kid_id)
41
+ end
42
+ kids
43
+ end
44
+
45
+ def capture_ids(item, opt)
46
+ num = opt[:num]
47
+ return (item[opt[:kind]].first(num) || [nil]) if num
48
+ item[opt[:kind]] || [nil]
49
+ end
50
+
51
+ def capture_stories(type, num)
52
+ stories = []
53
+ storie_ids = request_bunch(type, num)
54
+ while story_id = storie_ids.shift
55
+ stories << request_item('item', story_id)
56
+ end
57
+ stories
58
+ end
59
+
60
+ def request(url)
61
+ response = RestClient.get(url)
62
+ JSON.parse(response)
63
+ end
64
+
65
+ def request_item(type, id)
66
+ url = URL + type + '/' + id.to_s + JSON_FORMAT
67
+ request(url)
68
+ end
69
+
70
+ def request_bunch(type, num = nil)
71
+ url = URL + type + JSON_FORMAT
72
+ response = request(url)
73
+ num ? response.first(num) : response
74
+ end
75
+ end
76
+ end
@@ -0,0 +1,52 @@
1
+ require_relative '../lib/hack3rnews'
2
+
3
+ RSpec.describe HackerNew do
4
+ describe '.new_stories' do
5
+ it 'returns the 5 newest sotries by default' do
6
+ expect(HackerNew.new_stories.count).to eq(5)
7
+ end
8
+
9
+ it 'returns just the 2 newest stories' do
10
+ expect(HackerNew.new_stories(2).count).to eq(2)
11
+ end
12
+ end
13
+
14
+ describe '.top_stories' do
15
+ it 'returns the top 5 stories of the moment' do
16
+ expect(HackerNew.top_stories.count).to eq(5)
17
+ end
18
+
19
+ it 'returns the top 3 stories of the moment' do
20
+ expect(HackerNew.top_stories(3).count).to eq(3)
21
+ end
22
+ end
23
+
24
+ describe '.user_stories' do
25
+ user = 'stanislavb'
26
+ it 'returns the last 5 stories of a user' do
27
+ expect(HackerNew.user_stories(user).count).to eq(5)
28
+ end
29
+
30
+ it 'returns the last 3 stories of a user' do
31
+ expect(HackerNew.user_stories(user, 3).count).to eq(3)
32
+ end
33
+ end
34
+
35
+ describe '.story_comments' do
36
+ it 'returns all the comments of a given story' do
37
+ story = 26096340
38
+
39
+ expect(HackerNew.story_comments(story).count).to be > 10
40
+ end
41
+ end
42
+
43
+ describe '.top_job_stories' do
44
+ it 'returns the 5 most ranked job stories' do
45
+ expect(HackerNew.top_job_stories.count).to eq(5)
46
+ end
47
+
48
+ it 'returns the 4 most ranked job stories' do
49
+ expect(HackerNew.top_job_stories(4).count).to eq(4)
50
+ end
51
+ end
52
+ end
metadata ADDED
@@ -0,0 +1,73 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: hack3rnews
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.0
5
+ platform: ruby
6
+ authors:
7
+ - Alvaro Padilla
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2021-02-10 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: rest-client
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '2.1'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '2.1'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rspec
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '3.0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '3.0'
41
+ description: Consume heckernews content through the use of their API
42
+ email: varoboss.ap@gmail.com
43
+ executables: []
44
+ extensions: []
45
+ extra_rdoc_files: []
46
+ files:
47
+ - README.md
48
+ - lib/hack3rnews.rb
49
+ - spec/hack3rnews_spec.rb
50
+ homepage: https://github.com/ese-varo
51
+ licenses:
52
+ - MIT
53
+ metadata: {}
54
+ post_install_message:
55
+ rdoc_options: []
56
+ require_paths:
57
+ - lib
58
+ required_ruby_version: !ruby/object:Gem::Requirement
59
+ requirements:
60
+ - - ">="
61
+ - !ruby/object:Gem::Version
62
+ version: '0'
63
+ required_rubygems_version: !ruby/object:Gem::Requirement
64
+ requirements:
65
+ - - ">="
66
+ - !ruby/object:Gem::Version
67
+ version: '0'
68
+ requirements: []
69
+ rubygems_version: 3.2.3
70
+ signing_key:
71
+ specification_version: 4
72
+ summary: Consume hackernews content (stories, comments, etc)
73
+ test_files: []