reddit-base 0.2.1

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 ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 5cb71e8fcd16075836f4a9582b134c91825bdf96
4
+ data.tar.gz: 387602c1ada73880d1d8515045c75b55edc366e3
5
+ SHA512:
6
+ metadata.gz: 1a252a3aa26a572e8a841a432d64f6b236f4c70de7b2707202b54ceb3d5133014388de6218d58e30b5462308ddfdb123bf16b5c35c8f90578f64342b4984a33a
7
+ data.tar.gz: 32b2579fcff87770557e8cf29ef21420db290a63f0601eaf91d5f15dba45ab2403e5458df4dfba54e006ed52d8a91d464638d55deea7985ff4795b2ac0b0799e
data/.gitignore ADDED
@@ -0,0 +1,18 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .pryrc
6
+ .yardoc
7
+ Gemfile.lock
8
+ InstalledFiles
9
+ _yardoc
10
+ coverage
11
+ doc/
12
+ lib/bundler/man
13
+ pkg
14
+ rdoc
15
+ spec/reports
16
+ test/tmp
17
+ test/version_tmp
18
+ tmp
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in reddit-base.gemspec
4
+ gemspec
data/LICENSE.txt ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2014 Daniel O'Brien
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,71 @@
1
+ Reddit Base
2
+ ===========
3
+
4
+ A minimal reddit API client for Ruby.
5
+
6
+ Motivation
7
+ ----------
8
+
9
+ Managing major versions of an API client can be tricky, especially when the
10
+ API us unversioned, inconsistent and outside of your control.
11
+
12
+ This client library aims to provide minimal support for the reddit API,
13
+ reducing the need for frequent breaking changes and to act as the backbone
14
+ for more other higher-level API clients.
15
+
16
+ Installation
17
+ ------------
18
+
19
+ Via Rubygems:
20
+
21
+ gem install reddit-base
22
+
23
+ Or in your Gemfile with Bundler:
24
+
25
+ gem reddit-base
26
+
27
+ Basic Usage
28
+ -------------
29
+
30
+ Retrieving a particular endpoint:
31
+
32
+ require 'reddit/base'
33
+
34
+ client = Reddit::Base::Client.new(user: USERNAME, password: PASSWORD)
35
+ client.get('/r/AskReddit')
36
+
37
+ The above will return a `Faraday::Response` instance with JSON data in the
38
+ `body` attribute.
39
+
40
+ What it Does
41
+ ------------
42
+
43
+ * Authentication.
44
+ * Rate limiting.
45
+ * Modhash handling (reddit's CSRF protection).
46
+ * JSON coersion.
47
+ * Forwarding..
48
+ * Multipart POST.
49
+ * Reddit error wrapping.
50
+
51
+ What it Doesn't
52
+ ---------------
53
+
54
+ * Parsing of Reddit "Things" and "Kinds."
55
+ * Parsing of common attributes like dates and times.
56
+ * HTML entity decoding (beware of "body" and "selftext").
57
+
58
+ Recommended Reading
59
+ -------------------
60
+
61
+ * reddit API documentation: http://www.reddit.com/dev/api
62
+ * reddit API wiki: https://github.com/reddit/reddit/wiki/API
63
+ * reddit project on Github: https://github.com/reddit/reddit
64
+
65
+ Contributors
66
+ ------------
67
+
68
+ * Maintainer: [Daniel O'Brien](http://github.com/dobs)
69
+
70
+ This project is copyright 2014 by its contributors, refer to LICENSE file for
71
+ licensing information.
data/Rakefile ADDED
@@ -0,0 +1 @@
1
+ require "bundler/gem_tasks"
@@ -0,0 +1,14 @@
1
+ require 'faraday'
2
+ require 'faraday_middleware'
3
+ require 'faraday_middleware/reddit'
4
+ require 'json'
5
+
6
+ require 'reddit/base/version'
7
+ require 'reddit/base/basic_client'
8
+ require 'reddit/base/client'
9
+ require 'reddit/base/helpers'
10
+
11
+ module Reddit
12
+ module Base
13
+ end
14
+ end
@@ -0,0 +1,34 @@
1
+ module Reddit
2
+ module Base
3
+ # Basic client that doesn't make assumptions regarding response type.
4
+ #
5
+ # The reddit API isn't always consistent with its response types so may
6
+ # return HTML even when JSON is requested. Error pages are a common and
7
+ # unavoidable example.
8
+ class BasicClient
9
+ extend Forwardable
10
+
11
+ DEFAULT_OPTIONS = {
12
+ url: 'http://www.reddit.com',
13
+ headers: {'User-Agent' => "reddit-base, a reddit client for ruby by /u/dobs (v#{VERSION})"}
14
+ }.freeze
15
+
16
+ attr_reader :connection, :options
17
+
18
+ def_delegators :connection, :get, :post, :params, :headers
19
+
20
+ def initialize(options)
21
+ @options = DEFAULT_OPTIONS.merge(options)
22
+ @connection = Faraday.new(url: @options[:url], headers: @options[:headers]) do |builder|
23
+ builder.request :multipart
24
+ builder.request :url_encoded
25
+ builder.request :reddit_authentication, @options
26
+ builder.response :follow_redirects
27
+ builder.use :reddit_rate_limit
28
+ builder.use :reddit_modhash
29
+ builder.adapter Faraday.default_adapter
30
+ end
31
+ end
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,26 @@
1
+ module Reddit
2
+ module Base
3
+ # Client that does everything BasicClient does but also attempts to
4
+ # coerce and parse JSON.
5
+ class Client < BasicClient
6
+ def initialize(options)
7
+ super(options)
8
+
9
+ connection.builder.insert_before FaradayMiddleware::FollowRedirects, FaradayMiddleware::ParseJson
10
+ connection.builder.insert_before FaradayMiddleware::Reddit::RateLimit, FaradayMiddleware::Reddit::ForceJson
11
+ end
12
+
13
+ def get(*args, **options)
14
+ body = connection.get(*args, *options).body
15
+ body = Reddit::Base::Helpers.simplify body if options[:simplify]
16
+ body
17
+ end
18
+
19
+ def post(*args, **options)
20
+ body = connection.post(*args, *options).body
21
+ body = Reddit::Base::Helpers.simplify body if options[:simplify]
22
+ body
23
+ end
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,22 @@
1
+ module Reddit
2
+ module Base
3
+ module Helpers
4
+ def self.simplify(json)
5
+ return json unless json.is_a? Hash
6
+
7
+ if json['data']
8
+ json['data']['kind'] = json['kind'] if json['data'].is_a? Hash
9
+ json = simplify json['data']
10
+ elsif json['children']
11
+ json['children'] = json['children'].map { |child| simplify child }
12
+ else
13
+ json.keys.each do |key|
14
+ json[key] = simplify json[key]
15
+ end
16
+ end
17
+
18
+ json
19
+ end
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,5 @@
1
+ module Reddit
2
+ module Base
3
+ VERSION = '0.2.1'
4
+ end
5
+ end
@@ -0,0 +1,28 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'reddit/base/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "reddit-base"
8
+ spec.version = Reddit::Base::VERSION
9
+ spec.authors = ["Daniel O'Brien"]
10
+ spec.email = ["dan@dobs.org"]
11
+ spec.summary = %q{A minimal reddit API client for Ruby.}
12
+ spec.description = %q{A minimal reddit API client for Ruby that
13
+ simplifies concerns such authentication, rate limiting and extracting
14
+ JSON.}
15
+ spec.homepage = ""
16
+ spec.license = "MIT"
17
+ spec.required_ruby_version = '>= 2.0.0'
18
+
19
+ spec.files = `git ls-files -z`.split("\x0")
20
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
21
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
22
+ spec.require_paths = ["lib"]
23
+
24
+ spec.add_development_dependency "bundler", "~> 1.5"
25
+ spec.add_development_dependency "rake"
26
+
27
+ spec.add_dependency 'faraday_middleware-reddit', '0.2.1'
28
+ end
metadata ADDED
@@ -0,0 +1,100 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: reddit-base
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.2.1
5
+ platform: ruby
6
+ authors:
7
+ - Daniel O'Brien
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2014-04-25 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.5'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ~>
25
+ - !ruby/object:Gem::Version
26
+ version: '1.5'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rake
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - '>='
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :development
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: faraday_middleware-reddit
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - '='
46
+ - !ruby/object:Gem::Version
47
+ version: 0.2.1
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - '='
53
+ - !ruby/object:Gem::Version
54
+ version: 0.2.1
55
+ description: |-
56
+ A minimal reddit API client for Ruby that
57
+ simplifies concerns such authentication, rate limiting and extracting
58
+ JSON.
59
+ email:
60
+ - dan@dobs.org
61
+ executables: []
62
+ extensions: []
63
+ extra_rdoc_files: []
64
+ files:
65
+ - .gitignore
66
+ - Gemfile
67
+ - LICENSE.txt
68
+ - README.md
69
+ - Rakefile
70
+ - lib/reddit/base.rb
71
+ - lib/reddit/base/basic_client.rb
72
+ - lib/reddit/base/client.rb
73
+ - lib/reddit/base/helpers.rb
74
+ - lib/reddit/base/version.rb
75
+ - reddit-base.gemspec
76
+ homepage: ''
77
+ licenses:
78
+ - MIT
79
+ metadata: {}
80
+ post_install_message:
81
+ rdoc_options: []
82
+ require_paths:
83
+ - lib
84
+ required_ruby_version: !ruby/object:Gem::Requirement
85
+ requirements:
86
+ - - '>='
87
+ - !ruby/object:Gem::Version
88
+ version: 2.0.0
89
+ required_rubygems_version: !ruby/object:Gem::Requirement
90
+ requirements:
91
+ - - '>='
92
+ - !ruby/object:Gem::Version
93
+ version: '0'
94
+ requirements: []
95
+ rubyforge_project:
96
+ rubygems_version: 2.0.3
97
+ signing_key:
98
+ specification_version: 4
99
+ summary: A minimal reddit API client for Ruby.
100
+ test_files: []