hunting_season 0.0.1 → 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,15 +1,15 @@
1
1
  ---
2
2
  !binary "U0hBMQ==":
3
3
  metadata.gz: !binary |-
4
- MzU2NmRjYzJmYzY5NzhjZDMzMmEyMjFlYTEzMTdiYjVlYzcwZWZjYw==
4
+ OTQ5MzhkZTE2MGE3MzI3ODFmMzBjYmVlNjNiNmQwN2U4NTQxMTRhMw==
5
5
  data.tar.gz: !binary |-
6
- ZmNkYjBjNWUyMTk4ODQ5NjA1YmE0ZTNmNWY2MjYzMGY3YTk0ZWJkNg==
6
+ OTc1NTFhOGQ1OTUwMjI2YzRhYmVmMzAxMDExMzRkNzJjYzJlNzhhNA==
7
7
  SHA512:
8
8
  metadata.gz: !binary |-
9
- YjUyMmMwNDU1OTEzMGYzNWYwNzM4MGY2ZDQ1ZjlhMzBlYzRiMmI2MTRlOTVm
10
- Y2MxYzc4YjBmMDEzMTJmOTViN2IwMTZlYmRlOTAyNjg5M2M2YjJlNTZiN2E4
11
- NTBmMzc5M2NmYjQwNTYwNWNkNjE4YjhkNzUzZGUwMGViNWJkMGU=
9
+ ZjI1OWI4Y2ZmNWNjMDBlMjNmODNkZDQ4MDM3MzQzZTIxYTIwNGM5NmI0MzM4
10
+ ODkyNzRkMDY1OTcwNTM0MmNlZjYzNTExMGJiM2I3NGEwMTIwNmU1YmE5MmE1
11
+ YWI3Y2E4OWMwOWM5ZGEzYzNjMzhhY2M1MDMwN2NkNzc1NTljNjQ=
12
12
  data.tar.gz: !binary |-
13
- OWZjY2FlNzQxNDMzNjA5ZjEyMWFhZWE4ODVjZjg1MmYwODQxNjlmZjMzMmQz
14
- YjU2YjYxN2MzZWY4YzA0NzNjMGVhMzJkNGQwNjNkZGQ4MWQ2OTA5MTM1ODIz
15
- YzhlNDgwZTUwNDQwMTA2ZGJkZjAwNmVkMGQ5YTIzOGQxMDVhZjI=
13
+ MjcxYjc5YjZmYjBjYTc2NDUxZDc2MjQ0ZjlmNmQxZDAyMDc0ZTJmNDc2MGIy
14
+ YmM2MDA2MzU5NGVmMjNiNjVjMzU5OThhMTVlMzA5NjNjZjE0MTlkYmNhZTUy
15
+ ZjFjNDQyMWM4Y2JiNGQwZGJhNDhmNDgxYTIxOTIyYzMwNWFiODk=
data/LICENSE ADDED
@@ -0,0 +1,22 @@
1
+ The MIT License (MIT)
2
+
3
+ Copyright (c) 2014 Mike Jarema
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
22
+
data/README.md ADDED
@@ -0,0 +1,34 @@
1
+ # hunting_season [![Build Status](https://secure.travis-ci.org/mikejarema/hunting_season.png)](http://travis-ci.org/mikejarema/hunting_season)
2
+
3
+ Ruby gem for interacting with the official [Product Hunt API](https://api.producthunt.com/v1/docs).
4
+
5
+
6
+ ## Authentication
7
+
8
+ Currently only supports a single token, passed to `ProductHunt::API.new(token)`. This mainly supports the use case of using the _Developer Token_ which can be created in the API Dashboard.
9
+
10
+
11
+ ## Supported Endpoints
12
+
13
+ * [posts#show - Get details of a post](https://api.producthunt.com/v1/docs/posts/posts_show_get_details_of_a_post)
14
+ * [votes#index - See all votes for a post](https://api.producthunt.com/v1/docs/postvotes/votes_index_see_all_votes_for_a_post)
15
+ * [users#show - Get details of a user](https://api.producthunt.com/v1/docs/users/users_show_get_details_of_a_user)
16
+
17
+
18
+ ### In Progress
19
+
20
+ * [comments#index - Fetch all comments of a post](https://api.producthunt.com/v1/docs/comments/comments_index_fetch_all_comments_of_a_post)
21
+
22
+
23
+ ## Examples
24
+
25
+ For now, see `product_hunt_spec.rb` for examples covering each of the supported endpoints.
26
+
27
+
28
+ ## Miscellany
29
+
30
+ Legal: see LICENSE
31
+
32
+ Quick shout out to [Katchphraze](http://on.rdio.com/1zEb5cA) for unintentionally naming this gem 7 years later :headphones:
33
+
34
+ Copyright (c) 2014 Mike Jarema
data/VERSION ADDED
@@ -0,0 +1 @@
1
+ 0.0.2
@@ -1 +1,6 @@
1
1
  require 'product_hunt/api'
2
+
3
+ require 'product_hunt/api/user'
4
+ require 'product_hunt/api/post'
5
+ require 'product_hunt/api/vote'
6
+ require 'product_hunt/api/comment'
@@ -1,3 +1,5 @@
1
+ # TODO: factor out a base class btw User and Post
2
+
1
3
  require 'httparty'
2
4
  require 'uri'
3
5
 
@@ -18,56 +20,20 @@ module ProductHunt
18
20
  def posts(options_or_id_or_nil = nil)
19
21
  if options_or_id_or_nil.is_a?(Fixnum)
20
22
  post = Post.new(self, options_or_id_or_nil)
23
+ elsif options_or_id_or_nil.nil?
24
+ Post.where(self, {})
25
+ elsif options_or_id_or_nil.is_a?(Hash)
26
+ Post.where(self, options_or_id_or_nil)
21
27
  else
22
28
  raise InvalidArgumentError.new("#{options_or_id_or_nil} is not supported by ProductHunt::API#posts")
23
29
  end
24
30
  end
25
31
 
26
- class Post
27
- def initialize(api, id)
28
- @api = api
29
- @id = id
30
- @attributes = nil
31
- self
32
- end
33
-
34
- def [](key)
35
- if @attributes.nil?
36
- fetch_self
37
- end
38
- @attributes[key]
39
- end
40
-
41
- def votes(options = {})
42
- if @id
43
- fetch_votes(options).map{|i| Vote.new(@api, i)}
44
- else
45
- raise InvalidCallError.new("Cannot call ProductHunt::Post#votes on an unsaved or uninitialized Post")
46
- end
47
- end
48
-
49
- private
50
-
51
- def fetch_self
52
- @attributes = @api.class.get("/posts/#{@id}", @api.config)["post"]
53
- end
54
-
55
- def fetch_votes(params)
56
- path = "/posts/#{@id}/votes"
57
- if params.is_a?(Enumerable)
58
- path += "?" + URI.encode_www_form(params)
59
- end
60
- @api.class.get(path, @api.config)["votes"]
61
- end
62
- end
63
-
64
- class Vote
65
- def initialize(api, attributes)
66
- @attributes = attributes
67
- end
68
-
69
- def [](key)
70
- @attributes[key]
32
+ def users(id)
33
+ if id.is_a?(Fixnum) || id.is_a?(String)
34
+ post = User.new(self, id)
35
+ else
36
+ raise InvalidArgumentError.new("#{id} is not supported by ProductHunt::API#users")
71
37
  end
72
38
  end
73
39
 
@@ -0,0 +1,13 @@
1
+ module ProductHunt
2
+
3
+ class API::Comment
4
+ def initialize(api, attributes)
5
+ @attributes = attributes
6
+ end
7
+
8
+ def [](key)
9
+ @attributes[key]
10
+ end
11
+ end
12
+
13
+ end
@@ -0,0 +1,86 @@
1
+ module ProductHunt
2
+ class API::Post
3
+
4
+ def initialize(api, id_or_attributes)
5
+ @api = api
6
+
7
+ if id_or_attributes.is_a?(Hash)
8
+ @id = id_or_attributes["id"]
9
+ @attributes = id_or_attributes
10
+ else
11
+ @id = id_or_attributes
12
+ @attributes = nil
13
+ end
14
+
15
+ self
16
+ end
17
+
18
+ def [](key)
19
+ if @attributes.nil?
20
+ fetch_self
21
+ end
22
+ @attributes[key]
23
+ end
24
+
25
+ def votes(options = {})
26
+ if @id
27
+ fetch_votes(options).map{|i| API::Vote.new(@api, i)}
28
+ else
29
+ raise InvalidCallError.new("Cannot call ProductHunt::Post#votes on an unsaved or uninitialized Post")
30
+ end
31
+ end
32
+
33
+ def comments(options = {})
34
+ if @id
35
+ fetch_comments(options).map{|i| API::Comment.new(@api, i)}
36
+ else
37
+ raise InvalidCallError.new("Cannot call ProductHunt::Post#votes on an unsaved or uninitialized Post")
38
+ end
39
+ end
40
+
41
+ def created_at
42
+ Time.parse(self["created_at"])
43
+ end
44
+
45
+ def day
46
+ Time.parse(self["day"]).to_date
47
+ end
48
+
49
+ # Class Methods
50
+
51
+ def self.where(api, options)
52
+ self.fetch_posts(api, options).map{|i| API::Post.new(api, i)}
53
+ end
54
+
55
+ private
56
+
57
+ def fetch_self
58
+ @attributes = @api.class.get("/posts/#{@id}", @api.config)["post"]
59
+ end
60
+
61
+ def self.fetch_posts(api, params)
62
+ path = "/posts"
63
+ if params.is_a?(Enumerable)
64
+ path += "?" + URI.encode_www_form(params)
65
+ end
66
+ api.class.get(path, api.config)["posts"]
67
+ end
68
+
69
+ def fetch_votes(params)
70
+ path = "/posts/#{@id}/votes"
71
+ if params.is_a?(Enumerable)
72
+ path += "?" + URI.encode_www_form(params)
73
+ end
74
+ @api.class.get(path, @api.config)["votes"]
75
+ end
76
+
77
+ def fetch_comments(params)
78
+ path = "/posts/#{@id}/comments"
79
+ if params.is_a?(Enumerable)
80
+ path += "?" + URI.encode_www_form(params)
81
+ end
82
+ @api.class.get(path, @api.config)["comments"]
83
+ end
84
+
85
+ end
86
+ end
@@ -0,0 +1,24 @@
1
+ module ProductHunt
2
+ class API::User
3
+ def initialize(api, id_or_username)
4
+ @api = api
5
+ @id_or_username = id_or_username
6
+ @attributes = nil
7
+ self
8
+ end
9
+
10
+ def [](key)
11
+ if @attributes.nil?
12
+ fetch_self
13
+ end
14
+ @attributes[key]
15
+ end
16
+
17
+ private
18
+
19
+ def fetch_self
20
+ @attributes = @api.class.get("/users/#{@id_or_username}", @api.config)["user"]
21
+ end
22
+
23
+ end
24
+ end
@@ -0,0 +1,15 @@
1
+ module ProductHunt
2
+
3
+ class API::Vote
4
+
5
+ def initialize(api, attributes)
6
+ @attributes = attributes
7
+ end
8
+
9
+ def [](key)
10
+ @attributes[key]
11
+ end
12
+
13
+ end
14
+
15
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: hunting_season
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.0.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Mike Jarema
@@ -44,25 +44,44 @@ dependencies:
44
44
  requirements:
45
45
  - - ~>
46
46
  - !ruby/object:Gem::Version
47
- version: '3'
47
+ version: '2'
48
48
  type: :development
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
52
  - - ~>
53
53
  - !ruby/object:Gem::Version
54
- version: '3'
55
- description: This gem is a work-in-progress which allows for calls to both the posts#show
56
- and votes#index endpoints.
54
+ version: '2'
55
+ - !ruby/object:Gem::Dependency
56
+ name: rspec-todo
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
+ description: This gem is a work-in-progress which allows for calls to some of the
70
+ offical API's endpoints (see README).
57
71
  email: mike@jarema.com
58
72
  executables: []
59
73
  extensions: []
60
74
  extra_rdoc_files: []
61
75
  files:
76
+ - LICENSE
77
+ - README.md
78
+ - VERSION
62
79
  - lib/hunting_season.rb
63
80
  - lib/product_hunt/api.rb
64
- - spec/product_hunt_spec.rb
65
- - spec/spec_helper.rb
81
+ - lib/product_hunt/api/comment.rb
82
+ - lib/product_hunt/api/post.rb
83
+ - lib/product_hunt/api/user.rb
84
+ - lib/product_hunt/api/vote.rb
66
85
  homepage: http://rubygems.org/gems/hunting_season
67
86
  licenses:
68
87
  - MIT
@@ -1,37 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe ProductHunt do
4
-
5
- before(:each) do
6
- @api = ProductHunt::API.new(ENV['TOKEN'] || 'my-token')
7
- end
8
-
9
- describe 'API::Post' do
10
-
11
- before(:each) do
12
- @post = @api.posts(3372)
13
- end
14
-
15
- it 'implements posts#show and yields the name of the post' do
16
- @post['name'].should == 'namevine'
17
- end
18
-
19
- it 'implements votes#index and yields the first voter' do
20
- vote = @post.votes.first
21
-
22
- vote.should be_a(ProductHunt::API::Vote)
23
- vote['user']['username'].should == '1korda'
24
- end
25
-
26
- it 'implements votes#index with pagination' do
27
- votes = @post.votes(per_page: 1)
28
- votes.size.should be(1)
29
-
30
- votes = @post.votes(per_page: 1, older: votes.first['id'])
31
- votes.size.should be(1)
32
- votes.first['user']['username'].should == 'mikejarema'
33
- end
34
-
35
- end
36
-
37
- end
data/spec/spec_helper.rb DELETED
@@ -1,8 +0,0 @@
1
- require 'bundler/setup'
2
- Bundler.setup
3
-
4
- require 'hunting_season' # and any other gems you need
5
-
6
- RSpec.configure do |config|
7
- # some (optional) config here
8
- end