neonredd 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (53) hide show
  1. checksums.yaml +7 -0
  2. data/Gemfile +4 -0
  3. data/LICENSE.md +22 -0
  4. data/README.md +1 -0
  5. data/Rakefile +5 -0
  6. data/Redd.LICENSE.md +22 -0
  7. data/RedditKit.LICENSE.md +9 -0
  8. data/lib/redd/access.rb +76 -0
  9. data/lib/redd/clients/base/account.rb +20 -0
  10. data/lib/redd/clients/base/identity.rb +22 -0
  11. data/lib/redd/clients/base/none.rb +27 -0
  12. data/lib/redd/clients/base/privatemessages.rb +33 -0
  13. data/lib/redd/clients/base/read.rb +114 -0
  14. data/lib/redd/clients/base/stream.rb +82 -0
  15. data/lib/redd/clients/base/submit.rb +19 -0
  16. data/lib/redd/clients/base/utilities.rb +143 -0
  17. data/lib/redd/clients/base/wikiread.rb +33 -0
  18. data/lib/redd/clients/base.rb +181 -0
  19. data/lib/redd/clients/installed.rb +56 -0
  20. data/lib/redd/clients/script.rb +40 -0
  21. data/lib/redd/clients/userless.rb +32 -0
  22. data/lib/redd/clients/web.rb +59 -0
  23. data/lib/redd/error.rb +151 -0
  24. data/lib/redd/objects/base.rb +39 -0
  25. data/lib/redd/objects/comment.rb +22 -0
  26. data/lib/redd/objects/labeled_multi.rb +13 -0
  27. data/lib/redd/objects/listing.rb +29 -0
  28. data/lib/redd/objects/more_comments.rb +10 -0
  29. data/lib/redd/objects/private_message.rb +28 -0
  30. data/lib/redd/objects/submission.rb +140 -0
  31. data/lib/redd/objects/subreddit.rb +329 -0
  32. data/lib/redd/objects/thing/editable.rb +22 -0
  33. data/lib/redd/objects/thing/hideable.rb +18 -0
  34. data/lib/redd/objects/thing/inboxable.rb +25 -0
  35. data/lib/redd/objects/thing/messageable.rb +38 -0
  36. data/lib/redd/objects/thing/moderatable.rb +43 -0
  37. data/lib/redd/objects/thing/refreshable.rb +14 -0
  38. data/lib/redd/objects/thing/saveable.rb +21 -0
  39. data/lib/redd/objects/thing/votable.rb +33 -0
  40. data/lib/redd/objects/thing.rb +26 -0
  41. data/lib/redd/objects/user.rb +52 -0
  42. data/lib/redd/objects/wiki_page.rb +15 -0
  43. data/lib/redd/rate_limit.rb +88 -0
  44. data/lib/redd/response/parse_json.rb +18 -0
  45. data/lib/redd/response/raise_error.rb +16 -0
  46. data/lib/redd/version.rb +4 -0
  47. data/lib/redd.rb +50 -0
  48. data/neonredd.gemspec +33 -0
  49. data/spec/redd/objects/base_spec.rb +1 -0
  50. data/spec/redd/response/raise_error_spec.rb +11 -0
  51. data/spec/redd_spec.rb +5 -0
  52. data/spec/spec_helper.rb +71 -0
  53. metadata +225 -0
@@ -0,0 +1,26 @@
1
+ require_relative 'base'
2
+
3
+ module Redd
4
+ module Objects
5
+ # A reddit thing.
6
+ # @see http://www.reddit.com/dev/api#fullnames
7
+ class Thing < Base
8
+ # Load up all the possible mixins for the thing.
9
+ Dir[File.join(File.dirname(__FILE__), 'thing', '*.rb')].each do |file|
10
+ require(file)
11
+ end
12
+
13
+ # Check for equality.
14
+ # @param other The other object.
15
+ # @return [Boolean]
16
+ def ==(other)
17
+ other.is_a?(Thing) && fullname == other.fullname
18
+ end
19
+
20
+ # @return [String] The fullname of the thing.
21
+ def fullname
22
+ self[:name] || "#{kind}_#{id}"
23
+ end
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,52 @@
1
+ require_relative 'thing'
2
+
3
+ module Redd
4
+ module Objects
5
+ # The model for a reddit user
6
+ class User < Thing
7
+ include Thing::Messageable
8
+
9
+ # @!method get_overview(**params)
10
+ # @!method get_submitted(**params)
11
+ # @!method get_comments(**params)
12
+ # @!method get_liked(**params)
13
+ # @!method get_disliked(**params)
14
+ # @!method get_hidden(**params)
15
+ # @!method get_saved(**params)
16
+ # @!method get_gilded(**params)
17
+ #
18
+ # Get the appropriate listing.
19
+ # @option params [String] :after Return results after the given
20
+ # fullname.
21
+ # @option params [String] :before Return results before the given
22
+ # fullname.
23
+ # @option params [Integer] :count The number of items already seen
24
+ # in the listing.
25
+ # @option params [1..1000] :limit The maximum number of things to
26
+ # return.
27
+ # @option params [:hot, :new, :top, :controversial] :sort The type of
28
+ # sort to use.
29
+ # @option params [:hour, :day, :week, :month, :year, :all] :t The
30
+ # time period to consider when sorting.
31
+ # @option params [:given] :show For {#get_gilded}, whether to show the
32
+ # gildings given.
33
+ # @note The option :t only applies to the top and controversial sorts.
34
+ # @return [Listing<Submission>]
35
+ %w(
36
+ overview submitted comments liked disliked hidden saved gilded
37
+ ).each do |type|
38
+ define_method :"get_#{type}" do |**params|
39
+ client.request_object(
40
+ :get, "/user/#{name}/#{type}.json", **params
41
+ )
42
+ end
43
+ end
44
+
45
+ # Get posts that the user has gilded.
46
+ # @see #get_gilded
47
+ def get_gildings_given(**params)
48
+ get_gilded(**params.merge(show: "given"))
49
+ end
50
+ end
51
+ end
52
+ end
@@ -0,0 +1,15 @@
1
+ require_relative 'thing'
2
+
3
+ module Redd
4
+ module Objects
5
+ # A submission made in a subreddit.
6
+ class WikiPage < Thing
7
+ alias_property :content, :content_md
8
+ alias_property :body, :content_md
9
+
10
+ def revision_user
11
+ @revision_by ||= client.object_from_body(revision_by)
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,88 @@
1
+ # The main Redd module.
2
+ module Redd
3
+ # The class that handles rate limiting for reddit.
4
+ #
5
+ # If you'd rather have an asynchronous or queue-based limiting, it's easy to
6
+ # write one yourself. A rate limiting class is any class that has an
7
+ # {#after_limit} method. The block returns a Faraday::Response object, so you
8
+ # can also extract the headers from the response and use those instead. To
9
+ # remove rate limiting entirely, follow the example below.
10
+ #
11
+ # @example To remove rate limiting entirely, just burst forever.
12
+ # rt = Redd::RateLimit.new
13
+ # rt.burst!(Float::INFINITY)
14
+ class RateLimit
15
+ # @!attribute [rw] gap
16
+ # @return [Integer, Float] The minimum time between requests.
17
+ attr_accessor :gap
18
+
19
+ # @!attribute [rw] burst_length
20
+ # @return [Integer] The number of requests left to burst.
21
+ attr_accessor :burst_length
22
+
23
+ # @!attribute [r] last_request
24
+ # @return [Time] The time the last request was made.
25
+ attr_reader :last_request
26
+
27
+ # @!attribute [r] used
28
+ # @!attribute [r] remaining
29
+ # @!attribute [r] reset
30
+ # @return [Integer] The data from reddit's response headers.
31
+ attr_reader :used, :remaining, :reset
32
+
33
+ # @param [Float, Integer] gap The minimum time between each request.
34
+ def initialize(gap)
35
+ # Some time ages ago, because we never made a request.
36
+ @last_request = Time.at(0)
37
+ @gap = gap
38
+ @burst_length = 0
39
+ end
40
+
41
+ # Don't sleep for the next few requests.
42
+ # @param [Integer] times The number of times to ignore limiting.
43
+ # @return [Integer] The total times rate limiting will be ignored.
44
+ def burst!(times)
45
+ @burst_length += times
46
+ end
47
+
48
+ # Sleep until 1 second has passed since the last request and perform the
49
+ # given request unless bursting.
50
+ #
51
+ # @yield [Faraday::Response] A response.
52
+ # @return [Faraday::Response] The response.
53
+ def after_limit
54
+ response = yield
55
+ update!(response)
56
+ sleep(wait_time)
57
+ response
58
+ end
59
+
60
+ private
61
+
62
+ # Update necessary info with each request.
63
+ # @param [Faraday::Response] response The response to the request made.
64
+ def update!(response)
65
+ @last_request_time = Time.now
66
+ %w(used remaining reset).each do |type|
67
+ value = response.headers["x-ratelimit-#{type}"]
68
+ instance_variable_set("@#{type}", value.to_i) unless value.nil?
69
+ end
70
+ end
71
+
72
+ # @return [Float, Integer] The number of seconds to sleep.
73
+ def wait_time
74
+ if @burst_length > 0 && @remaining > 0
75
+ # Don't sleep if we are in burst mode.
76
+ @burst_length -= 1
77
+ 0
78
+ elsif @reset.nil? || @remaining.nil?
79
+ # Just guess if no headers were given (max 1 sec after last request).
80
+ time = @last_request_time - Time.now + @gap
81
+ time > 0 ? time : 0
82
+ else
83
+ # Most cases, spread out requests over available time.
84
+ @reset.to_f / (@gap * @remaining + 1)
85
+ end
86
+ end
87
+ end
88
+ end
@@ -0,0 +1,18 @@
1
+ require 'faraday/response'
2
+ require_relative '../error'
3
+
4
+ module Redd
5
+ # The module that contains middleware that alters the Faraday response.
6
+ module Response
7
+ # Faraday Middleware that parses JSON using OJ, via MultiJson.
8
+ class ParseJson < Faraday::Response::Middleware
9
+ dependency 'multi_json'
10
+
11
+ def on_complete(env)
12
+ env[:body] = MultiJson.load(env[:body], symbolize_keys: true)
13
+ rescue MultiJson::ParseError
14
+ raise JSONError.new(env), env[:body]
15
+ end
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,16 @@
1
+ require 'faraday/response'
2
+ require_relative '../error'
3
+
4
+ module Redd
5
+ # The module that contains middleware that alters the Faraday response.
6
+ module Response
7
+ # Faraday Middleware that raises an error if there's one.
8
+ # @see Error
9
+ class RaiseError < Faraday::Response::Middleware
10
+ def on_complete(env)
11
+ error = Redd::Error.from_response(env)
12
+ fail error.new(env), env[:body] if error
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,4 @@
1
+ module Redd
2
+ # The semantic version number.
3
+ VERSION = '0.0.1'.freeze
4
+ end
data/lib/redd.rb ADDED
@@ -0,0 +1,50 @@
1
+ require_relative 'redd/version'
2
+ require_relative 'redd/clients/installed'
3
+ require_relative 'redd/clients/script'
4
+ require_relative 'redd/clients/userless'
5
+ require_relative 'redd/clients/web'
6
+
7
+ # The main Redd module.
8
+ module Redd
9
+ # @overload it(:installed, client_id, redirect_uri, **kwargs)
10
+ # Authorize a user via an installed app.
11
+ # @param [String] client_id The client ID provided by reddit.
12
+ # @param [String] redirect_uri The exact uri you provided to reddit.
13
+ # @param [Hash] kwargs The keyword arguments provided to the client.
14
+ # @return [Clients::Installed]
15
+ #
16
+ # @overload it(:script, client_id, secret, username, password, **kwargs)
17
+ # Authorize a user that you have full access to, i.e. a bot.
18
+ # @param [String] client_id The client ID provided by reddit.
19
+ # @param [String] secret The client secret provided by reddit.
20
+ # @param [String] username The username.
21
+ # @param [String] password The password of the user.
22
+ # @param [Hash] kwargs The keyword arguments provided to the client.
23
+ # @return [Clients::Script]
24
+ #
25
+ # @overload it(:userless, client_id, secret, **kwargs)
26
+ # Connect to reddit from a web-app or a script without a specific user.
27
+ # @param [String] client_id The client ID provided by reddit.
28
+ # @param [String] secret The client secret provided by reddit.
29
+ # @param [Hash] kwargs The keyword arguments provided to the client.
30
+ # @return [Clients::Userless]
31
+ #
32
+ # @overload it(:web, client_id, secret, redirect_uri, **kwargs)
33
+ # Authorize a user from a website.
34
+ # @param [String] client_id The client ID provided by reddit.
35
+ # @param [String] secret The client secret provided by reddit.
36
+ # @param [String] redirect_uri The exact uri you provided to reddit.
37
+ # @param [Hash] kwargs The keyword arguments provided to the client.
38
+ # @return [Clients::Web]
39
+ #
40
+ def self.it(type, *args, **kwargs)
41
+ types = {
42
+ installed: Clients::Installed,
43
+ script: Clients::Script,
44
+ userless: Clients::Userless,
45
+ web: Clients::Web
46
+ }
47
+
48
+ types[type].new(*args, **kwargs)
49
+ end
50
+ end
data/neonredd.gemspec ADDED
@@ -0,0 +1,33 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'redd/version'
5
+
6
+ # rubocop:disable Metrics/LineLength
7
+ Gem::Specification.new do |spec|
8
+ spec.name = 'neonredd'
9
+ spec.version = Redd::VERSION
10
+ spec.authors = ['SirNeon']
11
+ spec.email = ['sirneon618@gmail.com']
12
+ spec.summary = 'A Reddit API Wrapper for Ruby.'
13
+ spec.description = 'This is literally just Redd that can grab up to 1000 listing items.'
14
+ spec.homepage = 'https://gitlab.com/SirNeon/neonredd'
15
+ spec.license = 'MIT'
16
+ spec.required_ruby_version = '>= 2.1.0'
17
+ # rubocop:disable Style/RegexpLiteral
18
+ spec.files = `git ls-files -z`.split("\x0")
19
+ spec.executables = spec.files.grep(/^bin\//) { |f| File.basename(f) }
20
+ spec.test_files = spec.files.grep(/^(test|spec|features)\//)
21
+ spec.require_paths = ['lib']
22
+
23
+ spec.add_development_dependency 'bundler', '~> 1.10.6'
24
+ spec.add_development_dependency 'rake', '~> 10.4.2'
25
+ spec.add_development_dependency 'rspec', '~> 3.2.0'
26
+ spec.add_development_dependency 'vcr', '~> 2.9.3'
27
+ spec.add_development_dependency 'webmock', '~> 1.20.4'
28
+
29
+ spec.add_dependency 'hashie', '~> 3.4.0'
30
+ spec.add_dependency 'faraday', '~> 0.9.1'
31
+ spec.add_dependency 'multi_json', '~> 1.10.1'
32
+ spec.add_dependency 'fastimage', '~> 1.6.6'
33
+ end
@@ -0,0 +1 @@
1
+ # There's no point in testing Base, since we'd basically be testing Hashie.
@@ -0,0 +1,11 @@
1
+ RSpec.describe Redd::Response::RaiseError do
2
+ it "return nil if there's no error" do
3
+ error = subject.on_complete(
4
+ status: 200,
5
+ body: {success: true},
6
+ response_headers: {}
7
+ )
8
+
9
+ expect(error).to be(nil)
10
+ end
11
+ end
data/spec/redd_spec.rb ADDED
@@ -0,0 +1,5 @@
1
+ RSpec.describe Redd do
2
+ it "has a version number" do
3
+ expect(Redd::VERSION).to be_a(String)
4
+ end
5
+ end
@@ -0,0 +1,71 @@
1
+ $LOAD_PATH.unshift File.expand_path("../../lib", __FILE__)
2
+ require "vcr"
3
+ require "redd"
4
+
5
+ VCR.configure do |config|
6
+ config.cassette_library_dir = "spec/cassettes"
7
+ config.hook_into :webmock
8
+ config.default_cassette_options = {record: :new_episodes}
9
+ config.configure_rspec_metadata!
10
+ end
11
+
12
+ RSpec.configure do |config|
13
+ # rspec-expectations config goes here. You can use an alternate
14
+ # assertion/expectation library such as wrong or the stdlib/minitest
15
+ # assertions if you prefer.
16
+ config.expect_with :rspec do |expectations|
17
+ # This option will default to `true` in RSpec 4. It makes the `description`
18
+ # and `failure_message` of custom matchers include text for helper methods
19
+ # defined using `chain`, e.g.:
20
+ # be_bigger_than(2).and_smaller_than(4).description
21
+ # # => "be bigger than 2 and smaller than 4"
22
+ # ...rather than:
23
+ # # => "be bigger than 2"
24
+ expectations.include_chain_clauses_in_custom_matcher_descriptions = true
25
+ end
26
+
27
+ # rspec-mocks config goes here. You can use an alternate test double
28
+ # library (such as bogus or mocha) by changing the `mock_with` option here.
29
+ config.mock_with :rspec do |mocks|
30
+ # Prevents you from mocking or stubbing a method that does not exist on
31
+ # a real object. This is generally recommended, and will default to
32
+ # `true` in RSpec 4.
33
+ mocks.verify_partial_doubles = true
34
+ end
35
+
36
+ # These two settings work together to allow you to limit a spec run
37
+ # to individual examples or groups you care about by tagging them with
38
+ # `:focus` metadata. When nothing is tagged with `:focus`, all examples
39
+ # get run.
40
+ config.filter_run_including :focus
41
+ config.run_all_when_everything_filtered = true
42
+
43
+ # If we don't have the details to perform authentication, we can't do those
44
+ # tests.
45
+ if ENV["TRAVIS_SECURE_ENV_VARS"] == "false"
46
+ config.filter_run_excluding :secure
47
+ end
48
+
49
+ # Limits the available syntax to the non-monkey patched syntax that is
50
+ # recommended. For more details, see:
51
+ # - http://myronmars.to/n/dev-blog/2012/06/rspecs-new-expectation-syntax
52
+ # - http://teaisaweso.me/blog/2013/05/27/rspecs-new-message-expectation-syntax/
53
+ # - http://myronmars.to/n/dev-blog/2014/05/notable-changes-in-rspec-3#new__config_option_to_disable_rspeccore_monkey_patching
54
+ config.disable_monkey_patching!
55
+
56
+ # This setting enables warnings. It's recommended, but in some cases may
57
+ # be too noisy due to issues in dependencies.
58
+ config.warnings = true
59
+
60
+ # Run specs in random order to surface order dependencies. If you find an
61
+ # order dependency and want to debug it, you can fix the order by providing
62
+ # the seed, which is printed after each run.
63
+ # --seed 1234
64
+ config.order = :random
65
+
66
+ # Seed global randomization in this process using the `--seed` CLI option.
67
+ # Setting this allows you to use `--seed` to deterministically reproduce
68
+ # test failures related to randomization by passing the same `--seed` value
69
+ # as the one that triggered the failure.
70
+ Kernel.srand config.seed
71
+ end
metadata ADDED
@@ -0,0 +1,225 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: neonredd
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - SirNeon
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2016-02-22 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.10.6
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: 1.10.6
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.4.2
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: 10.4.2
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.2.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.2.0
55
+ - !ruby/object:Gem::Dependency
56
+ name: vcr
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: 2.9.3
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: 2.9.3
69
+ - !ruby/object:Gem::Dependency
70
+ name: webmock
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: 1.20.4
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: 1.20.4
83
+ - !ruby/object:Gem::Dependency
84
+ name: hashie
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: 3.4.0
90
+ type: :runtime
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - "~>"
95
+ - !ruby/object:Gem::Version
96
+ version: 3.4.0
97
+ - !ruby/object:Gem::Dependency
98
+ name: faraday
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - "~>"
102
+ - !ruby/object:Gem::Version
103
+ version: 0.9.1
104
+ type: :runtime
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - "~>"
109
+ - !ruby/object:Gem::Version
110
+ version: 0.9.1
111
+ - !ruby/object:Gem::Dependency
112
+ name: multi_json
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - "~>"
116
+ - !ruby/object:Gem::Version
117
+ version: 1.10.1
118
+ type: :runtime
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - "~>"
123
+ - !ruby/object:Gem::Version
124
+ version: 1.10.1
125
+ - !ruby/object:Gem::Dependency
126
+ name: fastimage
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - "~>"
130
+ - !ruby/object:Gem::Version
131
+ version: 1.6.6
132
+ type: :runtime
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - "~>"
137
+ - !ruby/object:Gem::Version
138
+ version: 1.6.6
139
+ description: This is literally just Redd that can grab up to 1000 listing items.
140
+ email:
141
+ - sirneon618@gmail.com
142
+ executables: []
143
+ extensions: []
144
+ extra_rdoc_files: []
145
+ files:
146
+ - Gemfile
147
+ - LICENSE.md
148
+ - README.md
149
+ - Rakefile
150
+ - Redd.LICENSE.md
151
+ - RedditKit.LICENSE.md
152
+ - lib/redd.rb
153
+ - lib/redd/access.rb
154
+ - lib/redd/clients/base.rb
155
+ - lib/redd/clients/base/account.rb
156
+ - lib/redd/clients/base/identity.rb
157
+ - lib/redd/clients/base/none.rb
158
+ - lib/redd/clients/base/privatemessages.rb
159
+ - lib/redd/clients/base/read.rb
160
+ - lib/redd/clients/base/stream.rb
161
+ - lib/redd/clients/base/submit.rb
162
+ - lib/redd/clients/base/utilities.rb
163
+ - lib/redd/clients/base/wikiread.rb
164
+ - lib/redd/clients/installed.rb
165
+ - lib/redd/clients/script.rb
166
+ - lib/redd/clients/userless.rb
167
+ - lib/redd/clients/web.rb
168
+ - lib/redd/error.rb
169
+ - lib/redd/objects/base.rb
170
+ - lib/redd/objects/comment.rb
171
+ - lib/redd/objects/labeled_multi.rb
172
+ - lib/redd/objects/listing.rb
173
+ - lib/redd/objects/more_comments.rb
174
+ - lib/redd/objects/private_message.rb
175
+ - lib/redd/objects/submission.rb
176
+ - lib/redd/objects/subreddit.rb
177
+ - lib/redd/objects/thing.rb
178
+ - lib/redd/objects/thing/editable.rb
179
+ - lib/redd/objects/thing/hideable.rb
180
+ - lib/redd/objects/thing/inboxable.rb
181
+ - lib/redd/objects/thing/messageable.rb
182
+ - lib/redd/objects/thing/moderatable.rb
183
+ - lib/redd/objects/thing/refreshable.rb
184
+ - lib/redd/objects/thing/saveable.rb
185
+ - lib/redd/objects/thing/votable.rb
186
+ - lib/redd/objects/user.rb
187
+ - lib/redd/objects/wiki_page.rb
188
+ - lib/redd/rate_limit.rb
189
+ - lib/redd/response/parse_json.rb
190
+ - lib/redd/response/raise_error.rb
191
+ - lib/redd/version.rb
192
+ - neonredd.gemspec
193
+ - spec/redd/objects/base_spec.rb
194
+ - spec/redd/response/raise_error_spec.rb
195
+ - spec/redd_spec.rb
196
+ - spec/spec_helper.rb
197
+ homepage: https://gitlab.com/SirNeon/neonredd
198
+ licenses:
199
+ - MIT
200
+ metadata: {}
201
+ post_install_message:
202
+ rdoc_options: []
203
+ require_paths:
204
+ - lib
205
+ required_ruby_version: !ruby/object:Gem::Requirement
206
+ requirements:
207
+ - - ">="
208
+ - !ruby/object:Gem::Version
209
+ version: 2.1.0
210
+ required_rubygems_version: !ruby/object:Gem::Requirement
211
+ requirements:
212
+ - - ">="
213
+ - !ruby/object:Gem::Version
214
+ version: '0'
215
+ requirements: []
216
+ rubyforge_project:
217
+ rubygems_version: 2.2.2
218
+ signing_key:
219
+ specification_version: 4
220
+ summary: A Reddit API Wrapper for Ruby.
221
+ test_files:
222
+ - spec/redd/objects/base_spec.rb
223
+ - spec/redd/response/raise_error_spec.rb
224
+ - spec/redd_spec.rb
225
+ - spec/spec_helper.rb