greentext 0.1.0 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +1 -0
- data/README.md +48 -13
- data/greentext.gemspec +4 -3
- data/lib/greentext.rb +25 -0
- data/lib/greentext/base.rb +57 -0
- data/lib/greentext/board.rb +12 -0
- data/lib/greentext/client.rb +53 -0
- data/lib/greentext/client/board.rb +27 -0
- data/lib/greentext/client/post.rb +27 -0
- data/lib/greentext/dirty.rb +9 -23
- data/lib/greentext/post.rb +66 -0
- data/spec/board_spec.rb +23 -0
- data/spec/client_spec.rb +7 -0
- data/spec/post_spec.rb +1 -0
- data/spec/spec_helper.rb +7 -1
- metadata +37 -12
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 70e6ce509e15bac2d2e63dad243d7ce386d7cffb
|
4
|
+
data.tar.gz: 8fa2485f164f343aa72540210285c378d33cc901
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 08ac112408c79420c2cda4af93caeca85ea4ee1587e06f4dd517db646b36d7e2cfe5203b3f3370aead01288213fdc15f939b5129da79cb2defd3a0c58ad430d9
|
7
|
+
data.tar.gz: 603b286fe5603f64b871717a3b944fdf3843318f0763af5b9036c94305935374927b78b43a52a9dc320d117155b167458d8638447bd54b0cdc4154aa41857d5b
|
data/.gitignore
CHANGED
data/README.md
CHANGED
@@ -1,19 +1,16 @@
|
|
1
|
-
**Greentext** *Unofficial 4chan API.*
|
2
|
-
By Avinash Dwarapu
|
1
|
+
**Greentext** *Unofficial 4chan API Client.*
|
3
2
|
|
4
|
-
|
5
|
-
[
|
6
|
-
[
|
7
|
-
[Contributing](#contributing)
|
8
|
-
**
|
3
|
+
[![Gem Version](https://badge.fury.io/rb/greentext.svg)](http://badge.fury.io/rb/greentext)
|
4
|
+
[![Dependency Status](https://gemnasium.com/avidw/greentext.svg)](https://gemnasium.com/avidw/greentext)
|
5
|
+
[![Build Status](https://travis-ci.org/avidw/greentext.svg)](https://travis-ci.org/avidw/greentext)
|
9
6
|
|
10
|
-
|
11
|
-
### Greentext::Client
|
12
|
-
Haven't implemented it yet :neutral_face:
|
7
|
+
---
|
13
8
|
|
9
|
+
## Usage
|
14
10
|
### Greentext::Dirty
|
15
|
-
|
16
|
-
|
11
|
+
|
12
|
+
I'm still working on the main implementation. Meanwhile, one
|
13
|
+
way of getting data from the API is using `Greentext::Dirty`.
|
17
14
|
|
18
15
|
```ruby
|
19
16
|
require "greentext/dirty"
|
@@ -35,11 +32,37 @@ thread.first[:url]
|
|
35
32
|
# => "http://boards.4chan.org/b/res/543125139#p543128395"
|
36
33
|
```
|
37
34
|
|
35
|
+
### Greentext::Client
|
36
|
+
|
37
|
+
Haven't implemented it yet :neutral_face:.
|
38
|
+
Meanwhile, use `Greentext::Dirty`.
|
39
|
+
|
40
|
+
```ruby
|
41
|
+
require "greentext"
|
42
|
+
|
43
|
+
client = Greentext::Client.new
|
44
|
+
# => #<Greentext::Client:0x007f9f9a624260 @base_uri="http://a.4cdn.org/">
|
45
|
+
|
46
|
+
cg = client.boards.first
|
47
|
+
# => #<Greentext::Client::Board:0x007f9f9aa10928 @attrs={"board"=>"3", "title"=>"3DCG", "ws_board"=>1, ... }>
|
48
|
+
cg.title
|
49
|
+
# => "3DCG"
|
50
|
+
cg.ws_board?
|
51
|
+
# => true
|
52
|
+
|
53
|
+
post = cg.threads.first
|
54
|
+
# => #<Greentext::Client::Post:0x005f4f9aa12393 @attrs={"no"=>240555661, "now"=>"04\/21\/14(Mon)13:26:27", ... }>
|
55
|
+
post.time
|
56
|
+
# => #<DateTime: 2014-04-21T18:24:10+00:00 ((2456769j,66250s,699039399n),+0s,2299161j)>
|
57
|
+
post.comment
|
58
|
+
# => "Love it. Looks like there's going to be ton of secret ... "
|
59
|
+
```
|
60
|
+
|
38
61
|
## Installation
|
39
62
|
|
40
63
|
Add this line to your application's Gemfile:
|
41
64
|
|
42
|
-
gem
|
65
|
+
gem "greentext"
|
43
66
|
|
44
67
|
And then execute:
|
45
68
|
|
@@ -53,6 +76,18 @@ Or install it yourself as:
|
|
53
76
|
|
54
77
|
1. Fork it ( http://github.com/avidw/greentext/fork )
|
55
78
|
2. Create your feature branch (`git checkout -b my-new-feature`)
|
79
|
+
3. Install development requirements (`bundle install`)
|
56
80
|
3. Commit your changes (`git commit -am 'Add some feature'`)
|
57
81
|
4. Push to the branch (`git push origin my-new-feature`)
|
58
82
|
5. Create new Pull Request
|
83
|
+
|
84
|
+
---
|
85
|
+
|
86
|
+
This project follows the [Ruby Style Guide](https://github.com/bbatsov/ruby-style-guide)
|
87
|
+
aside from a couple of differences:
|
88
|
+
|
89
|
+
- Documented using TomDoc instead of RDoc.
|
90
|
+
- Double quotes are always preferred over single quotes unless escaping them becomes a nightmare.
|
91
|
+
- There are no spaces around `=` for default arguments in a method. This is just a personal thing.
|
92
|
+
|
93
|
+
Double check the code using `bundle exec rubocop` before submitting a pull request.
|
data/greentext.gemspec
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
|
3
3
|
Gem::Specification.new do |s|
|
4
4
|
s.name = "greentext"
|
5
|
-
s.version = "0.
|
5
|
+
s.version = "0.2.0"
|
6
6
|
s.authors = ["Avinash Dwarapu"]
|
7
7
|
s.email = ["d.nash.avi@gmail.com"]
|
8
8
|
s.summary = %q{Unofficial API for 4chan.}
|
@@ -15,9 +15,10 @@ Gem::Specification.new do |s|
|
|
15
15
|
s.test_files = s.files.grep(%r{^(test|spec|features)/})
|
16
16
|
s.require_paths = ["lib"]
|
17
17
|
|
18
|
+
s.add_dependency "bundler", "~> 1.6"
|
19
|
+
s.add_dependency "memoizable", "~> 0.4"
|
18
20
|
s.add_dependency "faraday", "~> 0.9"
|
19
|
-
s.add_dependency "
|
20
|
-
s.add_dependency "oj"
|
21
|
+
s.add_dependency "faraday_middleware", "~> 0.9"
|
21
22
|
|
22
23
|
s.add_development_dependency "rubocop"
|
23
24
|
s.add_development_dependency "rspec"
|
data/lib/greentext.rb
CHANGED
@@ -0,0 +1,25 @@
|
|
1
|
+
require "greentext/client"
|
2
|
+
|
3
|
+
# Public: The main Greentext module.
|
4
|
+
module Greentext
|
5
|
+
class << self
|
6
|
+
# Public: An instance of the client when calling methods
|
7
|
+
# on the Greentext module.
|
8
|
+
#
|
9
|
+
# Returns an Instance of Greentext::Client
|
10
|
+
def client
|
11
|
+
@client ||= Greentext::Client.new
|
12
|
+
end
|
13
|
+
|
14
|
+
def respond_to?(method_name, include_private=false)
|
15
|
+
client.respond_to?(method_name, include_private) || super
|
16
|
+
end
|
17
|
+
|
18
|
+
private
|
19
|
+
|
20
|
+
def method_missing(method_name, *args, &block)
|
21
|
+
return super unless client.respond_to?(method_name)
|
22
|
+
client.send(method_name, *args, &block)
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,57 @@
|
|
1
|
+
require "memoizable"
|
2
|
+
require "time"
|
3
|
+
|
4
|
+
module Greentext
|
5
|
+
# Internal: The base class for the models.
|
6
|
+
class Base
|
7
|
+
include Memoizable
|
8
|
+
attr_reader :attrs
|
9
|
+
alias_method :to_h, :attrs
|
10
|
+
|
11
|
+
class << self
|
12
|
+
# Internal: Dynamically define an attribute method for a given attribute
|
13
|
+
#
|
14
|
+
# key - A Symbol of the method name.
|
15
|
+
# value - An optional Symbol of the attribute key.
|
16
|
+
#
|
17
|
+
# Yields an optional attribute key.
|
18
|
+
#
|
19
|
+
# Returns nothing.
|
20
|
+
def attr_reader(key, value=key)
|
21
|
+
define_method(key) { @attrs[value.to_s] }
|
22
|
+
memoize(key)
|
23
|
+
end
|
24
|
+
|
25
|
+
# Internal: Dynamically define a predicate method for a given attribute.
|
26
|
+
#
|
27
|
+
# key - A Symbol of the method name.
|
28
|
+
# value - An optional Symbol of the attribute key.
|
29
|
+
#
|
30
|
+
# Returns nothing.
|
31
|
+
def attr_predicate(key, value=key)
|
32
|
+
define_method(:"#{key}?") { @attrs[value.to_s] == 1 }
|
33
|
+
memoize(:"#{key}?")
|
34
|
+
end
|
35
|
+
|
36
|
+
# Internal: Dynamically define an date method for a given attribute.
|
37
|
+
#
|
38
|
+
# key - A Symbol of the method name.
|
39
|
+
# value - An optional Symbol of the attribute key.
|
40
|
+
#
|
41
|
+
# Returns nothing.
|
42
|
+
def attr_epoch(key, value=key)
|
43
|
+
define_method(key) { DateTime.strptime(@attrs[value.to_s].to_s, "%s") }
|
44
|
+
memoize(key)
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
# Internal: Initialize a new Object with given attributes.
|
49
|
+
#
|
50
|
+
# attrs - An optional Hash of attributes.
|
51
|
+
#
|
52
|
+
# Returns an instance of the Object
|
53
|
+
def initialize(attrs)
|
54
|
+
@attrs = attrs
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
require "greentext/base"
|
2
|
+
|
3
|
+
module Greentext
|
4
|
+
# Public: (Model) A 4chan board.
|
5
|
+
class Board < Greentext::Base
|
6
|
+
attr_reader :name, :board
|
7
|
+
attr_reader :title
|
8
|
+
attr_reader :posts_per_page, :per_page
|
9
|
+
attr_reader :pages
|
10
|
+
attr_predicate :worksafe, :ws_board
|
11
|
+
end
|
12
|
+
end
|
data/lib/greentext/client.rb
CHANGED
@@ -0,0 +1,53 @@
|
|
1
|
+
require "faraday"
|
2
|
+
require "faraday_middleware"
|
3
|
+
|
4
|
+
require "greentext/client/board"
|
5
|
+
require "greentext/client/post"
|
6
|
+
|
7
|
+
module Greentext
|
8
|
+
# Public: The Client to access the API
|
9
|
+
#
|
10
|
+
# Examples
|
11
|
+
# client = Greentext::Client.new
|
12
|
+
# client.boards
|
13
|
+
# # => [#<Greentext::Board>, ...
|
14
|
+
class Client
|
15
|
+
include Greentext::Client::Board
|
16
|
+
include Greentext::Client::Post
|
17
|
+
|
18
|
+
attr_accessor :api_endpoint
|
19
|
+
|
20
|
+
def initialize
|
21
|
+
yield self if block_given?
|
22
|
+
end
|
23
|
+
|
24
|
+
# Public: Get the API Endpoint
|
25
|
+
#
|
26
|
+
# Returns a String containing a URI.
|
27
|
+
def api_endpoint
|
28
|
+
@api_endpoint ||= "http://a.4cdn.org/"
|
29
|
+
end
|
30
|
+
|
31
|
+
private
|
32
|
+
|
33
|
+
# Private: Return the current Faraday connection or create a new one.
|
34
|
+
#
|
35
|
+
# Returns a Faraday session.
|
36
|
+
def connection
|
37
|
+
@connection ||= Faraday.new(url: api_endpoint) do |conn|
|
38
|
+
conn.response :json
|
39
|
+
conn.adapter Faraday.default_adapter
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
# Private: Send a GET request to the path provided.
|
44
|
+
#
|
45
|
+
# path - The path String under the base url to access.
|
46
|
+
# params - An optional params Hash.
|
47
|
+
#
|
48
|
+
# Returns a Faraday Response object.
|
49
|
+
def get(path, params={})
|
50
|
+
connection.get(path, params).body
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
require "greentext/board"
|
2
|
+
|
3
|
+
module Greentext
|
4
|
+
class Client
|
5
|
+
# Internal: Methods for interacting with boards.
|
6
|
+
module Board
|
7
|
+
# Public: List all the boards available.
|
8
|
+
#
|
9
|
+
# Returns an Array of Greentext::Board instances.
|
10
|
+
def boards
|
11
|
+
boards = get("/boards.json")["boards"]
|
12
|
+
boards.map { |board| Greentext::Board.new(board) }
|
13
|
+
end
|
14
|
+
|
15
|
+
# Public: List all available threads in a board.
|
16
|
+
#
|
17
|
+
# board - A Greentext::Board object.
|
18
|
+
#
|
19
|
+
# Returns an Array of Greentext::Post instances.
|
20
|
+
def threads(board)
|
21
|
+
get("/#{board.name}/catalog.json")
|
22
|
+
.map { |page| page["threads"] }.flatten
|
23
|
+
.map { |thread| Greentext::Post.new(thread.merge("board" => board)) }
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
require "greentext/post"
|
2
|
+
|
3
|
+
module Greentext
|
4
|
+
class Client
|
5
|
+
# Internal: Methods for interacting with posts
|
6
|
+
module Post
|
7
|
+
# Public: Get the replies to a Greentext::Post object.
|
8
|
+
# This will only work if the post is OP.
|
9
|
+
#
|
10
|
+
# post - a Greentext::Post object.
|
11
|
+
#
|
12
|
+
# Returns an Array of Greentext::Post instances.
|
13
|
+
def expand(post)
|
14
|
+
if post.op?
|
15
|
+
posts = get("/#{post.board.name}/res/#{post.no}.json")["posts"]
|
16
|
+
posts.shift # Remove OP's post
|
17
|
+
posts.map do |params|
|
18
|
+
params.merge!("board" => post.board)
|
19
|
+
Greentext::Post.new(params)
|
20
|
+
end
|
21
|
+
else
|
22
|
+
raise ArgumentError, "This is not the first post in the thread."
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
data/lib/greentext/dirty.rb
CHANGED
@@ -1,15 +1,9 @@
|
|
1
1
|
require "faraday"
|
2
|
-
require "
|
3
|
-
require "oj"
|
2
|
+
require "json"
|
4
3
|
|
5
4
|
module Greentext
|
6
5
|
# Public: Crudely written but quick way to access the 4chan API.
|
7
6
|
# Surprisingly, Rubocop's pretty okay with this mess.
|
8
|
-
#
|
9
|
-
# Examples
|
10
|
-
#
|
11
|
-
# Greentext.new.threads(:b)
|
12
|
-
# # => [{"no" => 543103136, "last_modified" => 1398012243}, ...
|
13
7
|
class Dirty
|
14
8
|
def boards
|
15
9
|
get("/boards.json")["boards"]
|
@@ -18,33 +12,25 @@ module Greentext
|
|
18
12
|
def threads(board)
|
19
13
|
get("/#{board}/threads.json")
|
20
14
|
.map { |page| page["threads"] }.flatten
|
21
|
-
.map { |
|
15
|
+
.map { |thread| symbolize(thread) }
|
22
16
|
end
|
23
17
|
alias_method :board, :threads
|
24
18
|
|
25
19
|
def posts(board, thread)
|
26
20
|
get("/#{board}/res/#{thread}.json")["posts"]
|
27
|
-
|
28
|
-
.map do |post|
|
29
|
-
post.merge!("time" => DateTime.strptime(post["time"].to_s, "%s"))
|
30
|
-
post.merge!("name" => nil) if post["name"] == "Anonymous"
|
31
|
-
post["url"] =
|
32
|
-
"http://boards.4chan.org/#{board}/res/" \
|
33
|
-
"#{post['resto'] == 0 ? post['no'] : post['resto']}#p#{post['no']}"
|
34
|
-
Hash[post.map { |k, v| [k.to_sym, v] }]
|
35
|
-
end
|
21
|
+
.map { |post| symbolize(post) }
|
36
22
|
end
|
37
23
|
alias_method :thread, :posts
|
38
24
|
|
39
25
|
private
|
40
26
|
|
41
27
|
def get(path)
|
42
|
-
res = Faraday.new(url: "http://a.4cdn.org/").get(path)
|
43
|
-
if res.
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
28
|
+
res = Faraday.new(url: "http://a.4cdn.org/").get(path).body
|
29
|
+
JSON.parse(res) if res.length > 2
|
30
|
+
end
|
31
|
+
|
32
|
+
def symbolize(hash)
|
33
|
+
Hash[hash.map { |k, v| [k.to_sym, v] }]
|
48
34
|
end
|
49
35
|
end
|
50
36
|
end
|
@@ -0,0 +1,66 @@
|
|
1
|
+
require "greentext/base"
|
2
|
+
|
3
|
+
module Greentext
|
4
|
+
# Public: (Model) A 4chan post in a thread.
|
5
|
+
class Post < Greentext::Base
|
6
|
+
attr_reader :no
|
7
|
+
attr_reader :resto
|
8
|
+
attr_reader :board
|
9
|
+
|
10
|
+
attr_epoch :time
|
11
|
+
attr_epoch :last_modified
|
12
|
+
|
13
|
+
attr_reader :trip
|
14
|
+
attr_reader :id
|
15
|
+
attr_reader :country
|
16
|
+
attr_reader :country_name
|
17
|
+
attr_reader :email
|
18
|
+
attr_reader :subject, :sub
|
19
|
+
attr_reader :comment, :com
|
20
|
+
attr_reader :custom_spoiler
|
21
|
+
attr_reader :omitted_posts
|
22
|
+
attr_reader :omitted_images
|
23
|
+
attr_reader :replies
|
24
|
+
attr_reader :images
|
25
|
+
attr_reader :capcode_replies
|
26
|
+
attr_reader :tag
|
27
|
+
attr_reader :semantic_url
|
28
|
+
|
29
|
+
attr_predicate :sticky
|
30
|
+
attr_predicate :closed
|
31
|
+
attr_predicate :deleted
|
32
|
+
attr_predicate :spoiler
|
33
|
+
attr_predicate :bump_limit_reached, :bumplimit
|
34
|
+
attr_predicate :image_limit_reached, :imagelimit
|
35
|
+
|
36
|
+
attr_predicate :image, :filename
|
37
|
+
|
38
|
+
# Public: Get information about the image attached to the post.
|
39
|
+
#
|
40
|
+
# Returns a Hash.
|
41
|
+
def image
|
42
|
+
{
|
43
|
+
width: @attrs['w'],
|
44
|
+
height: @attrs['h'],
|
45
|
+
filename: @attrs['tim'],
|
46
|
+
md5: @attrs['md5'],
|
47
|
+
url: "https://i.4cdn.org/#{@attrs['board']}/#{@attrs['tim']}.#{@attrs['ext']}"
|
48
|
+
}
|
49
|
+
end
|
50
|
+
|
51
|
+
# Public: Get information about the thumbnail of the image.
|
52
|
+
#
|
53
|
+
# Returns a Hash.
|
54
|
+
def thumbnail
|
55
|
+
{ width: @attrs["tn_w"], height: @attrs["tn_h"],
|
56
|
+
url: "https://t.4cdn.org/#{@attrs['board']}/#{@attrs['tim']}s.jpg" }
|
57
|
+
end
|
58
|
+
|
59
|
+
# Public: Determines if the post is OP.
|
60
|
+
#
|
61
|
+
# Returns a Boolean value.
|
62
|
+
def op?
|
63
|
+
@attrs["resto"] == 0
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
data/spec/board_spec.rb
ADDED
@@ -0,0 +1,23 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
describe Greentext::Board, :vcr do
|
4
|
+
describe "#boards" do
|
5
|
+
it "gets an Array of boards" do
|
6
|
+
expect(@client.boards).to be_an(Array)
|
7
|
+
end
|
8
|
+
|
9
|
+
it "converts objects to Greentext::Board instances" do
|
10
|
+
expect(@client.boards.sample).to be_an_instance_of(Greentext::Board)
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
describe "#threads" do
|
15
|
+
it "gets an Array of posts" do
|
16
|
+
expect(@client.threads(@client.boards.sample)).to be_an(Array)
|
17
|
+
end
|
18
|
+
|
19
|
+
it "converts objects to Greentext::Post instances" do
|
20
|
+
expect(@client.threads(@client.boards.sample).sample).to be_an_instance_of(Greentext::Post)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
data/spec/client_spec.rb
ADDED
data/spec/post_spec.rb
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
require "spec_helper"
|
data/spec/spec_helper.rb
CHANGED
@@ -3,6 +3,7 @@ require "webmock/rspec"
|
|
3
3
|
require "vcr"
|
4
4
|
|
5
5
|
VCR.configure do |c|
|
6
|
+
c.default_cassette_options = {record: :new_episodes}
|
6
7
|
c.cassette_library_dir = "spec/cassettes"
|
7
8
|
c.hook_into :webmock
|
8
9
|
end
|
@@ -13,11 +14,16 @@ RSpec.configure do |c|
|
|
13
14
|
c.filter_run :focus
|
14
15
|
c.order = "random"
|
15
16
|
|
17
|
+
c.before :all do
|
18
|
+
@client = Greentext.client
|
19
|
+
end
|
20
|
+
|
16
21
|
c.around(:each, :vcr) do |example|
|
17
22
|
name = example.metadata[:full_description]
|
18
23
|
.split(/\s+/, 2)
|
19
24
|
.join("/")
|
20
|
-
.
|
25
|
+
.downcase
|
26
|
+
.tr(' ', '_')
|
21
27
|
.gsub(/[^\w\/]+/, "_")
|
22
28
|
VCR.use_cassette(name) { example.call }
|
23
29
|
end
|
metadata
CHANGED
@@ -1,57 +1,71 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: greentext
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Avinash Dwarapu
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-04-
|
11
|
+
date: 2014-04-24 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
|
-
name:
|
14
|
+
name: bundler
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
17
|
- - "~>"
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: '
|
19
|
+
version: '1.6'
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
24
|
- - "~>"
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version: '
|
26
|
+
version: '1.6'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: memoizable
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
31
|
- - "~>"
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version: 0.4
|
33
|
+
version: '0.4'
|
34
34
|
type: :runtime
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
38
|
- - "~>"
|
39
39
|
- !ruby/object:Gem::Version
|
40
|
-
version: 0.4
|
40
|
+
version: '0.4'
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
|
-
name:
|
42
|
+
name: faraday
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
44
44
|
requirements:
|
45
|
-
- - "
|
45
|
+
- - "~>"
|
46
46
|
- !ruby/object:Gem::Version
|
47
|
-
version: '0'
|
47
|
+
version: '0.9'
|
48
48
|
type: :runtime
|
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: '0'
|
54
|
+
version: '0.9'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: faraday_middleware
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - "~>"
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0.9'
|
62
|
+
type: :runtime
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - "~>"
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0.9'
|
55
69
|
- !ruby/object:Gem::Dependency
|
56
70
|
name: rubocop
|
57
71
|
requirement: !ruby/object:Gem::Requirement
|
@@ -139,8 +153,16 @@ files:
|
|
139
153
|
- Rakefile
|
140
154
|
- greentext.gemspec
|
141
155
|
- lib/greentext.rb
|
156
|
+
- lib/greentext/base.rb
|
157
|
+
- lib/greentext/board.rb
|
142
158
|
- lib/greentext/client.rb
|
159
|
+
- lib/greentext/client/board.rb
|
160
|
+
- lib/greentext/client/post.rb
|
143
161
|
- lib/greentext/dirty.rb
|
162
|
+
- lib/greentext/post.rb
|
163
|
+
- spec/board_spec.rb
|
164
|
+
- spec/client_spec.rb
|
165
|
+
- spec/post_spec.rb
|
144
166
|
- spec/spec_helper.rb
|
145
167
|
homepage: https://github.com/avidw/greentext
|
146
168
|
licenses:
|
@@ -167,4 +189,7 @@ signing_key:
|
|
167
189
|
specification_version: 4
|
168
190
|
summary: Unofficial API for 4chan.
|
169
191
|
test_files:
|
192
|
+
- spec/board_spec.rb
|
193
|
+
- spec/client_spec.rb
|
194
|
+
- spec/post_spec.rb
|
170
195
|
- spec/spec_helper.rb
|