hackernews_ruby 0.0.1 → 0.0.2
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 +4 -4
- data/.gitignore +1 -0
- data/.rspec +2 -0
- data/.travis.yml +9 -0
- data/README.md +87 -1
- data/Rakefile +5 -0
- data/hackernews_ruby.gemspec +12 -1
- data/lib/hackernews_ruby/client.rb +62 -0
- data/lib/hackernews_ruby/request.rb +22 -0
- data/lib/hackernews_ruby/version.rb +1 -1
- data/lib/hackernews_ruby.rb +24 -1
- data/spec/cassettes/get_comment.yml +68 -0
- data/spec/cassettes/get_story.yml +35 -0
- data/spec/cassettes/get_user.yml +65 -0
- data/spec/cassettes/top_stories.yml +68 -0
- data/spec/hackernews_ruby/client_spec.rb +60 -0
- data/spec/hackernews_ruby_spec.rb +31 -0
- data/spec/spec_helper.rb +28 -0
- metadata +164 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e7a6ce6c4ed75ca0e664a8e2b61d7611bf9032f4
|
4
|
+
data.tar.gz: 46426e649c903e0db544d803c5c9cc9f8b41432c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 44b3901881c8e62efe709f7f43eaaa6a56c66a1d25495844402c946a65067c6eb2f9e238f64d8f08cd0e010533668e89f8d6b11dfe7901cbf2833980f1e8a200
|
7
|
+
data.tar.gz: ba7e5f702cdb3a4f18e72cd3050589571f5a6e5d2e1f822d137a7f456efce35c0d719413984cdc7da45629a69665d17d996211dd4ff0127a2377751207700c56
|
data/.gitignore
CHANGED
data/.rspec
ADDED
data/.travis.yml
ADDED
data/README.md
CHANGED
@@ -1,5 +1,7 @@
|
|
1
1
|
# HackernewsRuby
|
2
2
|
|
3
|
+
[](https://coveralls.io/r/allcentury/hackernews_ruby?branch=master)
|
4
|
+
|
3
5
|
A wrapper for the new Hacker News API.
|
4
6
|
|
5
7
|
## Installation
|
@@ -20,7 +22,91 @@ Or install it yourself as:
|
|
20
22
|
|
21
23
|
## Usage
|
22
24
|
|
23
|
-
|
25
|
+
Instantiate a client like so:
|
26
|
+
|
27
|
+
```ruby
|
28
|
+
client = HackernewsRuby::Client.new
|
29
|
+
```
|
30
|
+
|
31
|
+
## Items
|
32
|
+
|
33
|
+
Items have the following fields:
|
34
|
+
|
35
|
+
[Outlined here form HN](https://github.com/HackerNews/API/blob/master/README.md#items)
|
36
|
+
|
37
|
+
Field | Description
|
38
|
+
------|------------
|
39
|
+
id | The item's unique id. Required.
|
40
|
+
deleted | `true` if the item is deleted.
|
41
|
+
type | The type of item. One of "job", "story", "comment", "poll", or "pollopt".
|
42
|
+
by | The username of the item's author.
|
43
|
+
time | Creation date of the item, in [Unix Time](http://en.wikipedia.org/wiki/Unix_time).
|
44
|
+
text | The comment, Ask HN, or poll text. HTML.
|
45
|
+
dead | `true` if the item is dead.
|
46
|
+
parent | The item's parent. For comments, either another comment or the relevant story. For pollopts, the relevant poll.
|
47
|
+
kids | The ids of the item's comments, in ranked display order.
|
48
|
+
url | The URL of the story.
|
49
|
+
score | The story's score, or the votes for a pollopt.
|
50
|
+
title | The title of the story or poll.
|
51
|
+
parts | A list of related pollopts, in display order.
|
52
|
+
|
53
|
+
To get an item simply do:
|
54
|
+
|
55
|
+
```ruby
|
56
|
+
client.get_item(834129)
|
57
|
+
```
|
58
|
+
This will get any item available on the API by ID such as stories, comments, polls and jobs.
|
59
|
+
|
60
|
+
Say you wanted the **title** of a story:
|
61
|
+
|
62
|
+
```ruby
|
63
|
+
story = client.get_item(8863) #story_id
|
64
|
+
story.title
|
65
|
+
=> "My YC app: Dropbox - Throw away your USB drive"
|
66
|
+
```
|
67
|
+
|
68
|
+
## Users
|
69
|
+
|
70
|
+
Users have the following fields:
|
71
|
+
|
72
|
+
[Outlined here from HN](https://github.com/HackerNews/API/blob/master/README.md#user://github.com/HackerNews/API/blob/master/README.md#users)
|
73
|
+
|
74
|
+
Field | Description
|
75
|
+
------|------------
|
76
|
+
id | The user's unique username. Case-sensitive. Required.
|
77
|
+
delay | Delay in minutes between a comment's creation and its visibility to other users.
|
78
|
+
created | Creation date of the user, in [Unix Time](http://en.wikipedia.org/wiki/Unix_time).
|
79
|
+
karma | The user's karma.
|
80
|
+
about | The user's optional self-description. HTML.
|
81
|
+
submitted | List of the user's stories, polls and comments.
|
82
|
+
|
83
|
+
Say you wanted to fetch a particular **user**:
|
84
|
+
|
85
|
+
```ruby
|
86
|
+
user = client.get_user('jl') #userid is case sensitive
|
87
|
+
user.about
|
88
|
+
=> "This is a test"
|
89
|
+
```
|
90
|
+
|
91
|
+
## Live Data
|
92
|
+
|
93
|
+
To fetch the top 100 stories:
|
94
|
+
|
95
|
+
```ruby
|
96
|
+
stories = client.top_stories
|
97
|
+
```
|
98
|
+
|
99
|
+
This will return an array of ID's. To get each story after that, just use the get_item method like this:
|
100
|
+
|
101
|
+
```ruby
|
102
|
+
stories = client.top_stories
|
103
|
+
stories.each do |story|
|
104
|
+
puts story.title
|
105
|
+
puts story.score
|
106
|
+
puts story.url
|
107
|
+
end
|
108
|
+
```
|
109
|
+
|
24
110
|
|
25
111
|
## Contributing
|
26
112
|
|
data/Rakefile
CHANGED
data/hackernews_ruby.gemspec
CHANGED
@@ -18,6 +18,17 @@ Gem::Specification.new do |spec|
|
|
18
18
|
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
19
19
|
spec.require_paths = ["lib"]
|
20
20
|
|
21
|
-
spec.
|
21
|
+
spec.add_dependency 'faraday_middleware'
|
22
|
+
spec.add_dependency 'multi_json'
|
23
|
+
spec.add_dependency 'activesupport'
|
24
|
+
spec.add_dependency 'hashie'
|
25
|
+
|
26
|
+
spec.add_development_dependency "bundler"
|
22
27
|
spec.add_development_dependency "rake", "~> 10.0"
|
28
|
+
spec.add_development_dependency "rspec"
|
29
|
+
spec.add_development_dependency "pry"
|
30
|
+
spec.add_development_dependency "vcr"
|
31
|
+
spec.add_development_dependency "shoulda"
|
32
|
+
spec.add_development_dependency "webmock"
|
33
|
+
spec.add_development_dependency "coveralls"
|
23
34
|
end
|
@@ -0,0 +1,62 @@
|
|
1
|
+
require 'forwardable'
|
2
|
+
require 'hackernews_ruby/request'
|
3
|
+
|
4
|
+
module HackernewsRuby
|
5
|
+
class Client
|
6
|
+
extend Forwardable
|
7
|
+
|
8
|
+
include Request
|
9
|
+
attr_accessor :api_url, :api_version
|
10
|
+
|
11
|
+
|
12
|
+
def initialize(options={})
|
13
|
+
@api_url = options[:api_url].nil? ? HackernewsRuby.api_url : options[:api_url]
|
14
|
+
@api_version = options[:api_version].nil? ? HackernewsRuby.api_version : options[:api_version]
|
15
|
+
|
16
|
+
reload_config
|
17
|
+
end
|
18
|
+
|
19
|
+
def connection
|
20
|
+
params = {}
|
21
|
+
@connection = Faraday.new(url: @api_url, params: params,
|
22
|
+
headers: default_headers,
|
23
|
+
ssl: { verify: true } ) do |faraday|
|
24
|
+
faraday.use FaradayMiddleware::Mashify
|
25
|
+
faraday.use FaradayMiddleware::ParseJson, content_type: /\bjson$/
|
26
|
+
faraday.use FaradayMiddleware::FollowRedirects
|
27
|
+
faraday.adapter Faraday.default_adapter
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
def get_item(id, params={})
|
32
|
+
url = "/#{HackernewsRuby.api_version}/item/#{id}.json"
|
33
|
+
get(url, params)
|
34
|
+
end
|
35
|
+
|
36
|
+
def get_user(id, params={})
|
37
|
+
url = "/#{HackernewsRuby.api_version}/user/#{id}.json"
|
38
|
+
get(url, params)
|
39
|
+
end
|
40
|
+
|
41
|
+
def top_stories(params={})
|
42
|
+
url ="/#{HackernewsRuby.api_version}/topstories.json?"
|
43
|
+
get(url, params)
|
44
|
+
end
|
45
|
+
|
46
|
+
|
47
|
+
private
|
48
|
+
|
49
|
+
def default_headers
|
50
|
+
{
|
51
|
+
accept: 'application/json',
|
52
|
+
content_type: 'application/json',
|
53
|
+
user_agent: "Ruby Gem vy HackerNews_Ruby #{HackernewsRuby::VERSION}"
|
54
|
+
}
|
55
|
+
end
|
56
|
+
|
57
|
+
def reload_config
|
58
|
+
HackernewsRuby.api_url = api_url
|
59
|
+
HackernewsRuby.api_version = api_version
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
require 'active_support/core_ext'
|
2
|
+
require 'multi_json'
|
3
|
+
|
4
|
+
module HackernewsRuby
|
5
|
+
module Request
|
6
|
+
|
7
|
+
def get(path, options)
|
8
|
+
request(:get, path, options)
|
9
|
+
end
|
10
|
+
|
11
|
+
def request(method, path, options)
|
12
|
+
response = connection.send(method) do |request|
|
13
|
+
case method
|
14
|
+
when :get
|
15
|
+
request.url(path, options)
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
response.body
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
data/lib/hackernews_ruby.rb
CHANGED
@@ -1,5 +1,28 @@
|
|
1
1
|
require "hackernews_ruby/version"
|
2
|
+
require "faraday"
|
3
|
+
require "faraday_middleware"
|
4
|
+
require "hackernews_ruby/client"
|
5
|
+
require "hackernews_ruby/version"
|
6
|
+
|
7
|
+
directory = File.expand_path(File.dirname(__FILE__))
|
2
8
|
|
3
9
|
module HackernewsRuby
|
4
|
-
|
10
|
+
class << self
|
11
|
+
attr_accessor :api_url, :api_version
|
12
|
+
|
13
|
+
## configure default
|
14
|
+
def configure
|
15
|
+
load_defaults
|
16
|
+
yield self
|
17
|
+
true
|
18
|
+
end
|
19
|
+
|
20
|
+
private
|
21
|
+
|
22
|
+
def load_defaults
|
23
|
+
self.api_url ||= 'https://hacker-news.firebaseio.com'
|
24
|
+
self.api_version ||= 'v0'
|
25
|
+
end
|
26
|
+
|
27
|
+
end
|
5
28
|
end
|
@@ -0,0 +1,68 @@
|
|
1
|
+
---
|
2
|
+
http_interactions:
|
3
|
+
- request:
|
4
|
+
method: get
|
5
|
+
uri: https://hacker-news.firebaseio.com/v0/item/2921983.json
|
6
|
+
body:
|
7
|
+
encoding: US-ASCII
|
8
|
+
string: ''
|
9
|
+
headers:
|
10
|
+
Accept:
|
11
|
+
- application/json
|
12
|
+
Content-Type:
|
13
|
+
- application/json
|
14
|
+
User-Agent:
|
15
|
+
- Ruby Gem vy HackerNews_Ruby 0.0.1
|
16
|
+
Accept-Encoding:
|
17
|
+
- gzip;q=1.0,deflate;q=0.6,identity;q=0.3
|
18
|
+
response:
|
19
|
+
status:
|
20
|
+
code: 200
|
21
|
+
message: OK
|
22
|
+
headers:
|
23
|
+
Content-Length:
|
24
|
+
- '291'
|
25
|
+
Content-Type:
|
26
|
+
- application/json; charset=utf-8
|
27
|
+
Cache-Control:
|
28
|
+
- no-cache
|
29
|
+
body:
|
30
|
+
encoding: UTF-8
|
31
|
+
string: '{"by":"norvig","id":2921983,"kids":[2922097,2922429,2924562,2922709,2922573,2922140,2922141],"parent":2921506,"text":"Aw
|
32
|
+
shucks, guys ... you make me blush with your compliments.<p>Tell you what,
|
33
|
+
Ill make a deal: I''ll keep writing if you keep reading. K?","time":1314211127,"type":"comment"}'
|
34
|
+
http_version:
|
35
|
+
recorded_at: Wed, 08 Oct 2014 14:57:04 GMT
|
36
|
+
- request:
|
37
|
+
method: get
|
38
|
+
uri: https://hacker-news.firebaseio.com/v0/item/126809.json
|
39
|
+
body:
|
40
|
+
encoding: US-ASCII
|
41
|
+
string: ''
|
42
|
+
headers:
|
43
|
+
Accept:
|
44
|
+
- application/json
|
45
|
+
Content-Type:
|
46
|
+
- application/json
|
47
|
+
User-Agent:
|
48
|
+
- Ruby Gem vy HackerNews_Ruby 0.0.1
|
49
|
+
Accept-Encoding:
|
50
|
+
- gzip;q=1.0,deflate;q=0.6,identity;q=0.3
|
51
|
+
response:
|
52
|
+
status:
|
53
|
+
code: 200
|
54
|
+
message: OK
|
55
|
+
headers:
|
56
|
+
Content-Length:
|
57
|
+
- '368'
|
58
|
+
Content-Type:
|
59
|
+
- application/json; charset=utf-8
|
60
|
+
Cache-Control:
|
61
|
+
- no-cache
|
62
|
+
body:
|
63
|
+
encoding: UTF-8
|
64
|
+
string: '{"by":"pg","id":126809,"kids":[126822,126823,126993,126824,126934,127411,126888,127681,126818,126816,126854,127095,126861,127313,127299,126859,126852,126882,126832,127072,127217,126889,127535,126917,126875],"parts":[126810,126811,126812],"score":46,"text":"","time":1204403652,"title":"Poll:
|
65
|
+
What would happen if News.YC had explicit support for polls?","type":"poll"}'
|
66
|
+
http_version:
|
67
|
+
recorded_at: Wed, 08 Oct 2014 15:02:11 GMT
|
68
|
+
recorded_with: VCR 2.8.0
|
@@ -0,0 +1,35 @@
|
|
1
|
+
---
|
2
|
+
http_interactions:
|
3
|
+
- request:
|
4
|
+
method: get
|
5
|
+
uri: https://hacker-news.firebaseio.com/v0/item/8863.json
|
6
|
+
body:
|
7
|
+
encoding: US-ASCII
|
8
|
+
string: ''
|
9
|
+
headers:
|
10
|
+
Accept:
|
11
|
+
- application/json
|
12
|
+
Content-Type:
|
13
|
+
- application/json
|
14
|
+
User-Agent:
|
15
|
+
- Ruby Gem vy HackerNews_Ruby 0.0.1
|
16
|
+
Accept-Encoding:
|
17
|
+
- gzip;q=1.0,deflate;q=0.6,identity;q=0.3
|
18
|
+
response:
|
19
|
+
status:
|
20
|
+
code: 200
|
21
|
+
message: OK
|
22
|
+
headers:
|
23
|
+
Content-Length:
|
24
|
+
- '358'
|
25
|
+
Content-Type:
|
26
|
+
- application/json; charset=utf-8
|
27
|
+
Cache-Control:
|
28
|
+
- no-cache
|
29
|
+
body:
|
30
|
+
encoding: UTF-8
|
31
|
+
string: '{"by":"dhouston","id":8863,"kids":[8952,9224,8917,8884,8887,8943,8869,8958,9005,9671,8940,9067,8908,9055,8865,8881,8872,8873,8955,10403,8903,8928,9125,8998,8901,8902,8907,8894,8878,8870,8980,8934,8876],"score":111,"time":1175714200,"title":"My
|
32
|
+
YC app: Dropbox - Throw away your USB drive","type":"story","url":"http://www.getdropbox.com/u/2/screencast.html"}'
|
33
|
+
http_version:
|
34
|
+
recorded_at: Wed, 08 Oct 2014 14:27:41 GMT
|
35
|
+
recorded_with: VCR 2.8.0
|
@@ -0,0 +1,65 @@
|
|
1
|
+
---
|
2
|
+
http_interactions:
|
3
|
+
- request:
|
4
|
+
method: get
|
5
|
+
uri: https://hacker-news.firebaseio.com/v0/item/jl.json
|
6
|
+
body:
|
7
|
+
encoding: US-ASCII
|
8
|
+
string: ''
|
9
|
+
headers:
|
10
|
+
Accept:
|
11
|
+
- application/json
|
12
|
+
Content-Type:
|
13
|
+
- application/json
|
14
|
+
User-Agent:
|
15
|
+
- Ruby Gem vy HackerNews_Ruby 0.0.1
|
16
|
+
Accept-Encoding:
|
17
|
+
- gzip;q=1.0,deflate;q=0.6,identity;q=0.3
|
18
|
+
response:
|
19
|
+
status:
|
20
|
+
code: 200
|
21
|
+
message: OK
|
22
|
+
headers:
|
23
|
+
Content-Length:
|
24
|
+
- '4'
|
25
|
+
Content-Type:
|
26
|
+
- application/json; charset=utf-8
|
27
|
+
Cache-Control:
|
28
|
+
- no-cache
|
29
|
+
body:
|
30
|
+
encoding: UTF-8
|
31
|
+
string: 'null'
|
32
|
+
http_version:
|
33
|
+
recorded_at: Wed, 08 Oct 2014 17:58:09 GMT
|
34
|
+
- request:
|
35
|
+
method: get
|
36
|
+
uri: https://hacker-news.firebaseio.com/v0/user/jl.json
|
37
|
+
body:
|
38
|
+
encoding: US-ASCII
|
39
|
+
string: ''
|
40
|
+
headers:
|
41
|
+
Accept:
|
42
|
+
- application/json
|
43
|
+
Content-Type:
|
44
|
+
- application/json
|
45
|
+
User-Agent:
|
46
|
+
- Ruby Gem vy HackerNews_Ruby 0.0.1
|
47
|
+
Accept-Encoding:
|
48
|
+
- gzip;q=1.0,deflate;q=0.6,identity;q=0.3
|
49
|
+
response:
|
50
|
+
status:
|
51
|
+
code: 200
|
52
|
+
message: OK
|
53
|
+
headers:
|
54
|
+
Content-Length:
|
55
|
+
- '1926'
|
56
|
+
Content-Type:
|
57
|
+
- application/json; charset=utf-8
|
58
|
+
Cache-Control:
|
59
|
+
- no-cache
|
60
|
+
body:
|
61
|
+
encoding: UTF-8
|
62
|
+
string: '{"about":"This is a test","created":1173923446,"delay":0,"id":"jl","karma":2937,"submitted":[8265435,8168423,8090946,8090326,7699907,7637962,7596179,7596163,7594569,7562135,7562111,7494708,7494171,7488093,7444860,7327817,7280290,7278694,7097557,7097546,7097254,7052857,7039484,6987273,6649999,6649706,6629560,6609127,6327951,6225810,6111999,5580079,5112008,4907948,4901821,4700469,4678919,3779193,3711380,3701405,3627981,3473004,3473000,3457006,3422158,3136701,2943046,2794646,2482737,2425640,2411925,2408077,2407992,2407940,2278689,2220295,2144918,2144852,1875323,1875295,1857397,1839737,1809010,1788048,1780681,1721745,1676227,1654023,1651449,1641019,1631985,1618759,1522978,1499641,1441290,1440993,1436440,1430510,1430208,1385525,1384917,1370453,1346118,1309968,1305415,1305037,1276771,1270981,1233287,1211456,1210688,1210682,1194189,1193914,1191653,1190766,1190319,1189925,1188455,1188177,1185884,1165649,1164314,1160048,1159156,1158865,1150900,1115326,933897,924482,923918,922804,922280,922168,920332,919803,917871,912867,910426,902506,891171,807902,806254,796618,786286,764412,764325,642566,642564,587821,575744,547504,532055,521067,492164,491979,383935,383933,383930,383927,375462,263479,258389,250751,245140,243472,237445,229393,226797,225536,225483,225426,221084,213940,213342,211238,210099,210007,209913,209908,209904,209903,170904,165850,161566,158388,158305,158294,156235,151097,148566,146948,136968,134656,133455,129765,126740,122101,122100,120867,120492,115999,114492,114304,111730,110980,110451,108420,107165,105150,104735,103188,103187,99902,99282,99122,98972,98417,98416,98231,96007,96005,95623,95487,95475,95471,95467,95326,95322,94952,94681,94679,94678,94420,94419,94393,94149,94008,93490,93489,92944,92247,91713,90162,90091,89844,89678,89498,86953,86109,85244,85195,85194,85193,85192,84955,84629,83902,82918,76393,68677,61565,60542,47745,47744,41098,39153,38678,37741,33469,12897,6746,5252,4752,4586,4289]}'
|
63
|
+
http_version:
|
64
|
+
recorded_at: Wed, 08 Oct 2014 17:58:40 GMT
|
65
|
+
recorded_with: VCR 2.8.0
|
@@ -0,0 +1,68 @@
|
|
1
|
+
---
|
2
|
+
http_interactions:
|
3
|
+
- request:
|
4
|
+
method: get
|
5
|
+
uri: https://hacker-news.firebaseio.com/v0/top_stories.json
|
6
|
+
body:
|
7
|
+
encoding: US-ASCII
|
8
|
+
string: ''
|
9
|
+
headers:
|
10
|
+
Accept:
|
11
|
+
- application/json
|
12
|
+
Content-Type:
|
13
|
+
- application/json
|
14
|
+
User-Agent:
|
15
|
+
- Ruby Gem vy HackerNews_Ruby 0.0.1
|
16
|
+
Accept-Encoding:
|
17
|
+
- gzip;q=1.0,deflate;q=0.6,identity;q=0.3
|
18
|
+
response:
|
19
|
+
status:
|
20
|
+
code: 401
|
21
|
+
message: Unauthorized
|
22
|
+
headers:
|
23
|
+
Content-Length:
|
24
|
+
- '36'
|
25
|
+
Content-Type:
|
26
|
+
- application/json; charset=utf-8
|
27
|
+
Cache-Control:
|
28
|
+
- no-cache
|
29
|
+
body:
|
30
|
+
encoding: UTF-8
|
31
|
+
string: |
|
32
|
+
{
|
33
|
+
"error" : "Permission denied"
|
34
|
+
}
|
35
|
+
http_version:
|
36
|
+
recorded_at: Wed, 08 Oct 2014 18:32:49 GMT
|
37
|
+
- request:
|
38
|
+
method: get
|
39
|
+
uri: https://hacker-news.firebaseio.com/v0/topstories.json
|
40
|
+
body:
|
41
|
+
encoding: US-ASCII
|
42
|
+
string: ''
|
43
|
+
headers:
|
44
|
+
Accept:
|
45
|
+
- application/json
|
46
|
+
Content-Type:
|
47
|
+
- application/json
|
48
|
+
User-Agent:
|
49
|
+
- Ruby Gem vy HackerNews_Ruby 0.0.1
|
50
|
+
Accept-Encoding:
|
51
|
+
- gzip;q=1.0,deflate;q=0.6,identity;q=0.3
|
52
|
+
response:
|
53
|
+
status:
|
54
|
+
code: 200
|
55
|
+
message: OK
|
56
|
+
headers:
|
57
|
+
Content-Length:
|
58
|
+
- '801'
|
59
|
+
Content-Type:
|
60
|
+
- application/json; charset=utf-8
|
61
|
+
Cache-Control:
|
62
|
+
- no-cache
|
63
|
+
body:
|
64
|
+
encoding: UTF-8
|
65
|
+
string: "[8427086,8426984,8427468,8427757,8426148,8428007,8427484,8428182,8428418,8422599,8427174,8427676,8428231,8426349,8428159,8426561,8427036,8424696,8426558,8422087,8426411,8427924,8426764,8422928,8425246,8426104,8426803,8425575,8422581,8425209,8423825,8424502,8427114,8420274,8426937,8427903,8424165,8425799,8425501,8428067,8422051,8428446,8424391,8425463,8426617,8425797,8422408,8426548,8428149,8420902,8428257,8427843,8426232,8422546,8424333,8427186,8416393,8428078,8427944,8423633,8421656,8428488,8426300,8427483,8419658,8421594,8417062,8420309,8423936,8428289,8424907,8428261,8419222,8416693,8422695,8428163,8427577,8426816,8424320,8425663,8427192,8427401,8427764,8426900,8426985,8426365,8423007,8421866,8426809,8425385,8427873,8427633,8421518,8424438,8410519,8400778,8415595,8424264,8418464,8418085]"
|
66
|
+
http_version:
|
67
|
+
recorded_at: Wed, 08 Oct 2014 18:35:07 GMT
|
68
|
+
recorded_with: VCR 2.8.0
|
@@ -0,0 +1,60 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe HackernewsRuby::Client do
|
4
|
+
let(:client) { HackernewsRuby::Client.new }
|
5
|
+
|
6
|
+
it 'creates a Faraday::Connection' do
|
7
|
+
expect(client.connection).to be_kind_of Faraday::Connection
|
8
|
+
end
|
9
|
+
it '#get_item story' do
|
10
|
+
VCR.use_cassette('get_story') do
|
11
|
+
story = client.get_item(8863)
|
12
|
+
|
13
|
+
expect(story).to_not be_nil
|
14
|
+
expect(story.id).to eq 8863
|
15
|
+
expect(story.type).to eq "story"
|
16
|
+
expect(story.kids).to be_kind_of Array
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
it '#get_item comment' do
|
21
|
+
VCR.use_cassette('get_comment') do
|
22
|
+
comment = client.get_item(2921983)
|
23
|
+
|
24
|
+
expect(comment).to_not be_nil
|
25
|
+
expect(comment.id).to eq 2921983
|
26
|
+
expect(comment.type).to eq "comment"
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
it '#get_item poll' do
|
31
|
+
|
32
|
+
VCR.use_cassette('get_comment') do
|
33
|
+
poll = client.get_item(126809)
|
34
|
+
|
35
|
+
expect(poll).to_not be_nil
|
36
|
+
expect(poll.id).to eq 126809
|
37
|
+
expect(poll.type).to eq "poll"
|
38
|
+
expect(poll.score).to_not be_nil
|
39
|
+
expect(poll.parts).to be_kind_of Array
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
it '#get_user' do
|
44
|
+
VCR.use_cassette('get_user') do
|
45
|
+
user = client.get_user('jl')
|
46
|
+
|
47
|
+
expect(user.about).to eq "This is a test"
|
48
|
+
expect(user.created).to eq 1173923446
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
it "#top_storeis" do
|
53
|
+
VCR.use_cassette('top_stories') do
|
54
|
+
tstories = client.top_stories
|
55
|
+
|
56
|
+
expect(tstories).to be_kind_of Array
|
57
|
+
expect(tstories.all? { |id| id.is_a? Fixnum} ).to eq true
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe HackernewsRuby do
|
4
|
+
let(:client) { HackernewsRuby::Client.new }
|
5
|
+
|
6
|
+
context 'configure defaults' do
|
7
|
+
it 'uses default API URL' do
|
8
|
+
expect(client.api_url).to eq "https://hacker-news.firebaseio.com"
|
9
|
+
end
|
10
|
+
|
11
|
+
it 'uses default API version' do
|
12
|
+
expect(client.api_version).to eq "v0"
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
context 'custom configuration' do
|
17
|
+
let(:custom_client) do
|
18
|
+
HackernewsRuby::Client.new(api_url: "https://hackernews.ycomb.com",
|
19
|
+
api_version: "v1")
|
20
|
+
end
|
21
|
+
|
22
|
+
it "::Client API_URL config" do
|
23
|
+
expect(custom_client.api_url).to eq "https://hackernews.ycomb.com"
|
24
|
+
end
|
25
|
+
|
26
|
+
it "::Client API_VERSION config" do
|
27
|
+
expect(custom_client.api_version).to eq "v1"
|
28
|
+
end
|
29
|
+
|
30
|
+
end
|
31
|
+
end
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,28 @@
|
|
1
|
+
require 'bundler/setup'
|
2
|
+
Bundler.setup
|
3
|
+
require 'coveralls'
|
4
|
+
Coveralls.wear!
|
5
|
+
|
6
|
+
require 'vcr'
|
7
|
+
require 'pry'
|
8
|
+
require 'hackernews_ruby'
|
9
|
+
|
10
|
+
VCR.configure do |c|
|
11
|
+
c.cassette_library_dir = 'spec/cassettes'
|
12
|
+
c.hook_into :webmock
|
13
|
+
c.allow_http_connections_when_no_cassette = true
|
14
|
+
c.ignore_localhost = true
|
15
|
+
c.default_cassette_options = {
|
16
|
+
record: :new_episodes,
|
17
|
+
re_record_interval: 7.days
|
18
|
+
}
|
19
|
+
end
|
20
|
+
|
21
|
+
RSpec.configure do |c|
|
22
|
+
|
23
|
+
HackernewsRuby.configure do |config|
|
24
|
+
config.api_url = "https://hacker-news.firebaseio.com"
|
25
|
+
config.api_version = "v0"
|
26
|
+
end
|
27
|
+
|
28
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: hackernews_ruby
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Anthony Ross
|
@@ -10,20 +10,76 @@ bindir: bin
|
|
10
10
|
cert_chain: []
|
11
11
|
date: 2014-10-08 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: faraday_middleware
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ">="
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '0'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ">="
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: multi_json
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ">="
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: activesupport
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - ">="
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0'
|
48
|
+
type: :runtime
|
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: hashie
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - ">="
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
type: :runtime
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - ">="
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0'
|
13
69
|
- !ruby/object:Gem::Dependency
|
14
70
|
name: bundler
|
15
71
|
requirement: !ruby/object:Gem::Requirement
|
16
72
|
requirements:
|
17
|
-
- - "
|
73
|
+
- - ">="
|
18
74
|
- !ruby/object:Gem::Version
|
19
|
-
version: '
|
75
|
+
version: '0'
|
20
76
|
type: :development
|
21
77
|
prerelease: false
|
22
78
|
version_requirements: !ruby/object:Gem::Requirement
|
23
79
|
requirements:
|
24
|
-
- - "
|
80
|
+
- - ">="
|
25
81
|
- !ruby/object:Gem::Version
|
26
|
-
version: '
|
82
|
+
version: '0'
|
27
83
|
- !ruby/object:Gem::Dependency
|
28
84
|
name: rake
|
29
85
|
requirement: !ruby/object:Gem::Requirement
|
@@ -38,6 +94,90 @@ dependencies:
|
|
38
94
|
- - "~>"
|
39
95
|
- !ruby/object:Gem::Version
|
40
96
|
version: '10.0'
|
97
|
+
- !ruby/object:Gem::Dependency
|
98
|
+
name: rspec
|
99
|
+
requirement: !ruby/object:Gem::Requirement
|
100
|
+
requirements:
|
101
|
+
- - ">="
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
version: '0'
|
104
|
+
type: :development
|
105
|
+
prerelease: false
|
106
|
+
version_requirements: !ruby/object:Gem::Requirement
|
107
|
+
requirements:
|
108
|
+
- - ">="
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: '0'
|
111
|
+
- !ruby/object:Gem::Dependency
|
112
|
+
name: pry
|
113
|
+
requirement: !ruby/object:Gem::Requirement
|
114
|
+
requirements:
|
115
|
+
- - ">="
|
116
|
+
- !ruby/object:Gem::Version
|
117
|
+
version: '0'
|
118
|
+
type: :development
|
119
|
+
prerelease: false
|
120
|
+
version_requirements: !ruby/object:Gem::Requirement
|
121
|
+
requirements:
|
122
|
+
- - ">="
|
123
|
+
- !ruby/object:Gem::Version
|
124
|
+
version: '0'
|
125
|
+
- !ruby/object:Gem::Dependency
|
126
|
+
name: vcr
|
127
|
+
requirement: !ruby/object:Gem::Requirement
|
128
|
+
requirements:
|
129
|
+
- - ">="
|
130
|
+
- !ruby/object:Gem::Version
|
131
|
+
version: '0'
|
132
|
+
type: :development
|
133
|
+
prerelease: false
|
134
|
+
version_requirements: !ruby/object:Gem::Requirement
|
135
|
+
requirements:
|
136
|
+
- - ">="
|
137
|
+
- !ruby/object:Gem::Version
|
138
|
+
version: '0'
|
139
|
+
- !ruby/object:Gem::Dependency
|
140
|
+
name: shoulda
|
141
|
+
requirement: !ruby/object:Gem::Requirement
|
142
|
+
requirements:
|
143
|
+
- - ">="
|
144
|
+
- !ruby/object:Gem::Version
|
145
|
+
version: '0'
|
146
|
+
type: :development
|
147
|
+
prerelease: false
|
148
|
+
version_requirements: !ruby/object:Gem::Requirement
|
149
|
+
requirements:
|
150
|
+
- - ">="
|
151
|
+
- !ruby/object:Gem::Version
|
152
|
+
version: '0'
|
153
|
+
- !ruby/object:Gem::Dependency
|
154
|
+
name: webmock
|
155
|
+
requirement: !ruby/object:Gem::Requirement
|
156
|
+
requirements:
|
157
|
+
- - ">="
|
158
|
+
- !ruby/object:Gem::Version
|
159
|
+
version: '0'
|
160
|
+
type: :development
|
161
|
+
prerelease: false
|
162
|
+
version_requirements: !ruby/object:Gem::Requirement
|
163
|
+
requirements:
|
164
|
+
- - ">="
|
165
|
+
- !ruby/object:Gem::Version
|
166
|
+
version: '0'
|
167
|
+
- !ruby/object:Gem::Dependency
|
168
|
+
name: coveralls
|
169
|
+
requirement: !ruby/object:Gem::Requirement
|
170
|
+
requirements:
|
171
|
+
- - ">="
|
172
|
+
- !ruby/object:Gem::Version
|
173
|
+
version: '0'
|
174
|
+
type: :development
|
175
|
+
prerelease: false
|
176
|
+
version_requirements: !ruby/object:Gem::Requirement
|
177
|
+
requirements:
|
178
|
+
- - ">="
|
179
|
+
- !ruby/object:Gem::Version
|
180
|
+
version: '0'
|
41
181
|
description: A ruby wrapper for the new Hacker News API
|
42
182
|
email:
|
43
183
|
- anthony.s.ross@gmail.com
|
@@ -46,13 +186,24 @@ extensions: []
|
|
46
186
|
extra_rdoc_files: []
|
47
187
|
files:
|
48
188
|
- ".gitignore"
|
189
|
+
- ".rspec"
|
190
|
+
- ".travis.yml"
|
49
191
|
- Gemfile
|
50
192
|
- LICENSE.txt
|
51
193
|
- README.md
|
52
194
|
- Rakefile
|
53
195
|
- hackernews_ruby.gemspec
|
54
196
|
- lib/hackernews_ruby.rb
|
197
|
+
- lib/hackernews_ruby/client.rb
|
198
|
+
- lib/hackernews_ruby/request.rb
|
55
199
|
- lib/hackernews_ruby/version.rb
|
200
|
+
- spec/cassettes/get_comment.yml
|
201
|
+
- spec/cassettes/get_story.yml
|
202
|
+
- spec/cassettes/get_user.yml
|
203
|
+
- spec/cassettes/top_stories.yml
|
204
|
+
- spec/hackernews_ruby/client_spec.rb
|
205
|
+
- spec/hackernews_ruby_spec.rb
|
206
|
+
- spec/spec_helper.rb
|
56
207
|
homepage: ''
|
57
208
|
licenses:
|
58
209
|
- MIT
|
@@ -77,4 +228,11 @@ rubygems_version: 2.2.2
|
|
77
228
|
signing_key:
|
78
229
|
specification_version: 4
|
79
230
|
summary: A wrapper for the Hacker News API
|
80
|
-
test_files:
|
231
|
+
test_files:
|
232
|
+
- spec/cassettes/get_comment.yml
|
233
|
+
- spec/cassettes/get_story.yml
|
234
|
+
- spec/cassettes/get_user.yml
|
235
|
+
- spec/cassettes/top_stories.yml
|
236
|
+
- spec/hackernews_ruby/client_spec.rb
|
237
|
+
- spec/hackernews_ruby_spec.rb
|
238
|
+
- spec/spec_helper.rb
|