neonredd 0.0.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.
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