rubyhexagon 1.3.0 → 1.4.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/rubyhexagon/artist.rb +3 -1
- data/lib/rubyhexagon/error.rb +2 -0
- data/lib/rubyhexagon/helper/api.rb +10 -22
- data/lib/rubyhexagon/image.rb +8 -5
- data/lib/rubyhexagon/level.rb +3 -1
- data/lib/rubyhexagon/pool.rb +133 -0
- data/lib/rubyhexagon/post.rb +17 -16
- data/lib/rubyhexagon/search/flag_history.rb +62 -0
- data/lib/rubyhexagon/search/pools.rb +62 -0
- data/lib/rubyhexagon/search/posts.rb +4 -2
- data/lib/rubyhexagon/search/tag_history.rb +61 -0
- data/lib/rubyhexagon/search/tags.rb +3 -1
- data/lib/rubyhexagon/tag.rb +4 -2
- data/lib/rubyhexagon/tag_change.rb +69 -0
- data/lib/rubyhexagon/type.rb +3 -1
- data/lib/rubyhexagon/user.rb +8 -2
- data/lib/rubyhexagon.rb +16 -4
- metadata +8 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f648db04caba89f3461c14c60bf3054e0727c265bfa5ae5a45374135043fb284
|
4
|
+
data.tar.gz: 40c7af470e95c3d8ab97f469354ec494cf6fbe71bc191e2b33770c0ffb494bd7
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 45fd6046f22d1d6a539af0e08aa2a9a8676269b96fd32f00d0d298f3e28dadbcf37970b7b97be6bcae699ce3c4c3e168268408dc6d69cc4eb07ca119c00f6201
|
7
|
+
data.tar.gz: ccd2c946edfcb2c2ce1dbff518f40ca6c84ad5d0a4e1311c60a9586ebc02f950f6dbe49ce5d776f4a026685f87c607ae73604d97881e4d631fa1996615441018
|
data/lib/rubyhexagon/artist.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
# Copyright 2014-2018 Maxine Michalski <maxine@furfind.net>
|
2
4
|
#
|
3
5
|
# This file is part of rubyhexagon.
|
@@ -14,7 +16,7 @@
|
|
14
16
|
# You should have received a copy of the GNU General Public License
|
15
17
|
# along with rubyhexagon. If not, see <http://www.gnu.org/licenses/>.
|
16
18
|
|
17
|
-
module
|
19
|
+
module Rubyhexagon
|
18
20
|
# Class to hold information about an artist on e621
|
19
21
|
#
|
20
22
|
# @author Maxine Michalski
|
data/lib/rubyhexagon/error.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
# Copyright 2014-2018 Maxine Michalski <maxine@furfind.net>
|
2
4
|
#
|
3
5
|
# This file is part of rubyhexagon.
|
@@ -15,7 +17,7 @@
|
|
15
17
|
# You should have received a copy of the GNU General Public License
|
16
18
|
# along with rubyhexagon. If not, see <http://www.gnu.org/licenses/>.
|
17
19
|
|
18
|
-
module
|
20
|
+
module Rubyhexagon
|
19
21
|
# An interface class, to unify calls from other code to e621 [dot] net.
|
20
22
|
# This class handles rate limiting, as well as provides a more uniform
|
21
23
|
# approach in making requests.
|
@@ -36,13 +38,11 @@ module E621
|
|
36
38
|
# Initializer for API. All methods are instance methods.
|
37
39
|
#
|
38
40
|
# @return the object
|
39
|
-
def initialize
|
41
|
+
def initialize
|
40
42
|
@user_agent = { 'User-Agent' =>
|
41
|
-
"#{
|
42
|
-
|
43
|
-
@base =
|
44
|
-
else 'spec/data'
|
45
|
-
end
|
43
|
+
"#{Rubyhexagon::NAME}/#{Rubyhexagon::VERSION} "\
|
44
|
+
'(by maxine_red on e621' }
|
45
|
+
@base = 'https://e621.net'
|
46
46
|
lock_path = '/tmp/rubyhexagon.lock'
|
47
47
|
@lock_file = File.open(lock_path, 'a')
|
48
48
|
end
|
@@ -62,23 +62,11 @@ module E621
|
|
62
62
|
query = query.to_a.map { |q| "#{q.first}=#{q.last}" }.join('&')
|
63
63
|
query = "?#{query}" unless query == ''
|
64
64
|
uri = "#{@base}/#{noun}/#{action}.json#{query}"
|
65
|
-
|
66
|
-
end
|
67
|
-
|
68
|
-
private
|
69
|
-
|
70
|
-
# @author Maxine Michalski
|
71
|
-
#
|
72
|
-
def fetch_data(uri)
|
65
|
+
uri = URI.parse(uri)
|
73
66
|
lock do
|
74
|
-
data =
|
75
|
-
else File.open(uri).read
|
76
|
-
end
|
67
|
+
data = uri.open(@user_agent).read
|
77
68
|
JSON.parse(data, symbolize_names: true)
|
78
69
|
end
|
79
|
-
rescue SocketError
|
80
|
-
sleep 5
|
81
|
-
retry
|
82
70
|
end
|
83
71
|
|
84
72
|
# @author Maxine Michalski
|
@@ -93,7 +81,7 @@ module E621
|
|
93
81
|
data = yield
|
94
82
|
# There is a hard limit of 2 requests per second, but to be nice we wait
|
95
83
|
# a whole second between requests.
|
96
|
-
sleep 1
|
84
|
+
sleep 1
|
97
85
|
ensure
|
98
86
|
@lock_file.flock(File::LOCK_UN)
|
99
87
|
end
|
data/lib/rubyhexagon/image.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
# Copyright 2014-2018 Maxine Michalski <maxine@furfind.net>
|
2
4
|
#
|
3
5
|
# This file is part of rubyhexagon.
|
@@ -14,7 +16,7 @@
|
|
14
16
|
# You should have received a copy of the GNU General Public License
|
15
17
|
# along with rubyhexagon. If not, see <http://www.gnu.org/licenses/>.
|
16
18
|
|
17
|
-
module
|
19
|
+
module Rubyhexagon
|
18
20
|
# Class for post file data. This is mostly an abstraction to have data
|
19
21
|
# structures in a more Ruby like nature.
|
20
22
|
#
|
@@ -49,14 +51,15 @@ module E621
|
|
49
51
|
#
|
50
52
|
# @return the object
|
51
53
|
def initialize(file)
|
52
|
-
@url = URI(file[:url])
|
54
|
+
@url = URI.parse(file[:url])
|
53
55
|
@md5 = File.basename(file[:url]).sub(/\.\w{3,4}$/, '')
|
54
56
|
@ext = file[:ext]
|
55
57
|
@width = file[:width].to_i
|
56
58
|
@height = file[:height].to_i
|
57
59
|
@size = file[:size].to_i
|
58
60
|
@user_agent = { 'User-Agent' =>
|
59
|
-
"#{
|
61
|
+
"#{Rubyhexagon::NAME}/#{Rubyhexagon::VERSION} "\
|
62
|
+
'(by maxine_red on e621' }
|
60
63
|
end
|
61
64
|
|
62
65
|
# @author Maxine Michalski
|
@@ -81,7 +84,7 @@ module E621
|
|
81
84
|
raise ArgumentError, 'Not a directory!' unless File.directory?(dirname)
|
82
85
|
filename ||= @md5
|
83
86
|
loop do
|
84
|
-
stream = open(@
|
87
|
+
stream = @url.open(@user_agent).read
|
85
88
|
File.open("#{dirname}/#{filename}.#{@ext}", 'w') do |f|
|
86
89
|
f.print stream
|
87
90
|
end
|
@@ -112,7 +115,7 @@ module E621
|
|
112
115
|
def save!(dirname = './')
|
113
116
|
raise ArgumentError, 'Not a directory!' unless File.directory?(dirname)
|
114
117
|
File.open("#{dirname}/#{File.basename(@url.path)}", 'w') do |f|
|
115
|
-
f.print open(@
|
118
|
+
f.print @url.open(@user_agent).read
|
116
119
|
end
|
117
120
|
end
|
118
121
|
end
|
data/lib/rubyhexagon/level.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
# Copyright 2014-2018 Maxine Michalski <maxine@furfind.net>
|
2
4
|
#
|
3
5
|
# This file is part of rubyhexagon.
|
@@ -14,7 +16,7 @@
|
|
14
16
|
# You should have received a copy of the GNU General Public License
|
15
17
|
# along with rubyhexagon. If not, see <http://www.gnu.org/licenses/>.
|
16
18
|
|
17
|
-
module
|
19
|
+
module Rubyhexagon
|
18
20
|
# Class to hold level information.
|
19
21
|
#
|
20
22
|
# @api private
|
@@ -0,0 +1,133 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# Copyright 2014-2018 Maxine Michalski <maxine@furfind.net>
|
4
|
+
#
|
5
|
+
# This file is part of rubyhexagon.
|
6
|
+
#
|
7
|
+
# rubyhexagon is free software: you can redistribute it and/or modify
|
8
|
+
# it under the terms of the GNU General Public License as published by
|
9
|
+
# the Free Software Foundation, either version 3 of the License, or
|
10
|
+
# (at your option) any later version.
|
11
|
+
#
|
12
|
+
# rubyhexagon is distributed in the hope that it will be useful,
|
13
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
14
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
15
|
+
# GNU General Public License for more details.
|
16
|
+
# You should have received a copy of the GNU General Public License
|
17
|
+
# along with rubyhexagon. If not, see <http://www.gnu.org/licenses/>.
|
18
|
+
|
19
|
+
module Rubyhexagon
|
20
|
+
# This class holds post information, fetched from e621, and gives access in a
|
21
|
+
# more Ruby like manner.
|
22
|
+
#
|
23
|
+
# @author Maxine Michalski
|
24
|
+
# @since 1.4.0
|
25
|
+
class Pool
|
26
|
+
# @return [Integer] returns this pool's ID
|
27
|
+
attr_reader :id
|
28
|
+
|
29
|
+
# @return [String] returns name of current pool
|
30
|
+
attr_reader :name
|
31
|
+
|
32
|
+
# @return [Time] returns creation time
|
33
|
+
attr_reader :created_at
|
34
|
+
|
35
|
+
# @return [Time] returns time of last update
|
36
|
+
attr_reader :updated_at
|
37
|
+
|
38
|
+
# @return [String] returns a description of the current pool
|
39
|
+
attr_reader :description
|
40
|
+
|
41
|
+
# @return [User] returns the user, who has created this pool
|
42
|
+
attr_reader :user
|
43
|
+
|
44
|
+
# @return [Array<Post>] returns an array of posts, that belong to this pool
|
45
|
+
attr_reader :posts
|
46
|
+
|
47
|
+
# @author Maxine Michalski
|
48
|
+
#
|
49
|
+
# Initializer for Pool objects
|
50
|
+
#
|
51
|
+
# @param id [Integer] ID of this pool
|
52
|
+
#
|
53
|
+
# @return the object
|
54
|
+
def initialize(id)
|
55
|
+
unless id.is_a?(Integer) && id.positive?
|
56
|
+
raise InvalidIDError, "ID out of range: #{id}"
|
57
|
+
end
|
58
|
+
@id = id
|
59
|
+
end
|
60
|
+
|
61
|
+
# @author Maxine Michalski
|
62
|
+
#
|
63
|
+
# @param pool [Hash] pool data, if present
|
64
|
+
#
|
65
|
+
# Fetch data from e621 to current post id
|
66
|
+
def show!(pool = nil)
|
67
|
+
@posts = []
|
68
|
+
if pool.nil?
|
69
|
+
page = 1
|
70
|
+
loop do
|
71
|
+
pool = API.new.fetch('pool', 'show', id: @id, page: page)
|
72
|
+
page += 1
|
73
|
+
@posts += pool[:posts].map do |post|
|
74
|
+
E621::Post.new(post[:id]).show(post)
|
75
|
+
end
|
76
|
+
break if pool[:posts] == []
|
77
|
+
end
|
78
|
+
end
|
79
|
+
@name = pool[:name]
|
80
|
+
@created_at = Time.at(pool[:created_at][:s].to_i)
|
81
|
+
@updated_at = Time.at(pool[:updated_at][:s].to_i)
|
82
|
+
@description = pool[:description]
|
83
|
+
@user = User.new(id: pool[:user_id])
|
84
|
+
@is_locked = pool[:is_locked]
|
85
|
+
@is_active = pool[:is_active]
|
86
|
+
end
|
87
|
+
|
88
|
+
# @author Maxine Michalski
|
89
|
+
#
|
90
|
+
# @param pool [Hash] pool data, if present
|
91
|
+
#
|
92
|
+
# Fetch data from e621 to current pool id
|
93
|
+
def show(pool = nil)
|
94
|
+
tmp = Pool.new(@id)
|
95
|
+
tmp.show!(pool)
|
96
|
+
tmp
|
97
|
+
end
|
98
|
+
|
99
|
+
# @author Maxine Michalski
|
100
|
+
#
|
101
|
+
# Returns locking status
|
102
|
+
#
|
103
|
+
# @return [TrueClass,FalseClass]
|
104
|
+
def locked?
|
105
|
+
@is_locked
|
106
|
+
end
|
107
|
+
|
108
|
+
# @author Maxine Michalski
|
109
|
+
#
|
110
|
+
# Returns active status
|
111
|
+
#
|
112
|
+
# @return [TrueClass,FalseClass]
|
113
|
+
def active?
|
114
|
+
@is_active
|
115
|
+
end
|
116
|
+
|
117
|
+
# @author Maxine Michalski
|
118
|
+
#
|
119
|
+
# Comparison method for Pool objects
|
120
|
+
#
|
121
|
+
# @param other [Object] other object to compare
|
122
|
+
#
|
123
|
+
# @return [TrueClass,FalseClass]
|
124
|
+
def ==(other)
|
125
|
+
if @name.nil?
|
126
|
+
other.is_a?(Pool) && @id == other.id
|
127
|
+
else
|
128
|
+
other.is_a?(Pool) && @name == other.name && @id == other.id &&
|
129
|
+
@updated_at == other.updated_at
|
130
|
+
end
|
131
|
+
end
|
132
|
+
end
|
133
|
+
end
|
data/lib/rubyhexagon/post.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
# Copyright 2014-2018 Maxine Michalski <maxine@furfind.net>
|
2
4
|
#
|
3
5
|
# This file is part of rubyhexagon.
|
@@ -14,7 +16,7 @@
|
|
14
16
|
# You should have received a copy of the GNU General Public License
|
15
17
|
# along with rubyhexagon. If not, see <http://www.gnu.org/licenses/>.
|
16
18
|
|
17
|
-
module
|
19
|
+
module Rubyhexagon
|
18
20
|
# This class holds post information, fetched from e621, and gives access in a
|
19
21
|
# more Ruby like manner.
|
20
22
|
#
|
@@ -65,13 +67,13 @@ module E621
|
|
65
67
|
# @return [String] MD5 checksum associated with this post
|
66
68
|
attr_reader :md5
|
67
69
|
|
68
|
-
# @return [
|
70
|
+
# @return [Rubyhexagon::Image] file content of this post
|
69
71
|
attr_reader :image
|
70
72
|
|
71
|
-
# @return [
|
73
|
+
# @return [Rubyhexagon::Sample] sample data in Rubyhexagon::Sample format
|
72
74
|
attr_reader :sample
|
73
75
|
|
74
|
-
# @return [
|
76
|
+
# @return [Rubyhexagon::Preview] preview data in Rubyhexagon::Preview format
|
75
77
|
attr_reader :preview
|
76
78
|
|
77
79
|
# @return [Array<String>] tag names only for convenience
|
@@ -86,7 +88,7 @@ module E621
|
|
86
88
|
# @return the object
|
87
89
|
def initialize(id)
|
88
90
|
id = id.to_i
|
89
|
-
unless id.is_a?(Integer) && id
|
91
|
+
unless id.is_a?(Integer) && id.positive?
|
90
92
|
raise InvalidIDError, "ID out of range: #{id}"
|
91
93
|
end
|
92
94
|
@id = id
|
@@ -113,8 +115,7 @@ module E621
|
|
113
115
|
#
|
114
116
|
# Fetch data from e621 to current post id
|
115
117
|
def show(post = nil)
|
116
|
-
|
117
|
-
tmp = Post.new(post[:id].to_i)
|
118
|
+
tmp = Post.new(@id)
|
118
119
|
tmp.show!(post)
|
119
120
|
tmp
|
120
121
|
end
|
@@ -169,9 +170,9 @@ module E621
|
|
169
170
|
def setup_file_data(post)
|
170
171
|
@tag_names = post[:tags].split(/\s+/)
|
171
172
|
@md5 = post[:md5]
|
172
|
-
@image =
|
173
|
-
|
174
|
-
|
173
|
+
@image = Image.new(url: post[:file_url], ext: post[:file_ext],
|
174
|
+
width: post[:width], height: post[:height],
|
175
|
+
size: post[:file_size])
|
175
176
|
setup_sample(post)
|
176
177
|
setup_preview(post)
|
177
178
|
end
|
@@ -180,18 +181,18 @@ module E621
|
|
180
181
|
#
|
181
182
|
# Helper function, to setup post sample data
|
182
183
|
def setup_sample(post)
|
183
|
-
@sample =
|
184
|
-
|
185
|
-
|
184
|
+
@sample = Sample.new(url: post[:sample_url], ext: post[:file_ext],
|
185
|
+
width: post[:sample_width],
|
186
|
+
height: post[:sample_height])
|
186
187
|
end
|
187
188
|
|
188
189
|
# @author Maxine Michalski
|
189
190
|
#
|
190
191
|
# Helper function, to setup post preview data
|
191
192
|
def setup_preview(post)
|
192
|
-
@preview =
|
193
|
-
|
194
|
-
|
193
|
+
@preview = Preview.new(url: post[:preview_url], ext: 'jpg',
|
194
|
+
width: post[:preview_width],
|
195
|
+
height: post[:preview_height])
|
195
196
|
end
|
196
197
|
|
197
198
|
# @author Maxine Michalski
|
@@ -0,0 +1,62 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# Copyright 2014-2018 Maxine Michalski <maxine@furfind.net>
|
4
|
+
#
|
5
|
+
# This file is part of rubyhexagon.
|
6
|
+
#
|
7
|
+
# rubyhexagon is free software: you can redistribute it and/or modify
|
8
|
+
# it under the terms of the GNU General Public License as published by
|
9
|
+
# the Free Software Foundation, either version 3 of the License, or
|
10
|
+
# (at your option) any later version.
|
11
|
+
#
|
12
|
+
# rubyhexagon is distributed in the hope that it will be useful,
|
13
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
14
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
15
|
+
# GNU General Public License for more details.
|
16
|
+
# You should have received a copy of the GNU General Public License
|
17
|
+
# along with rubyhexagon. If not, see <http://www.gnu.org/licenses/>.
|
18
|
+
|
19
|
+
module Rubyhexagon
|
20
|
+
# Module to hold search classes
|
21
|
+
#
|
22
|
+
# @author Maxine Michalski
|
23
|
+
# @since 1.0.0
|
24
|
+
module Search
|
25
|
+
# Class to hold methods for fetching a list of flagged posts.
|
26
|
+
#
|
27
|
+
# @author Maxine Michalski
|
28
|
+
# @since 1.4.0
|
29
|
+
class FlagHistory
|
30
|
+
# @author Maxine Michalski
|
31
|
+
#
|
32
|
+
# Retrieve a list of flagged posts, with flag reason. Only id and
|
33
|
+
# del_reason is present.
|
34
|
+
# This method accepts blocks and only returns one page without blocks
|
35
|
+
#
|
36
|
+
# @param page [Integer] page of deleted posts to return
|
37
|
+
#
|
38
|
+
# @return [Array<DeletedPost>] an array of deleted posts
|
39
|
+
def self.list(page = 1)
|
40
|
+
d = fetch_list(page)
|
41
|
+
while block_given? && d != []
|
42
|
+
d.each { |del| yield del }
|
43
|
+
page += 1
|
44
|
+
d = fetch_list(page)
|
45
|
+
end
|
46
|
+
d
|
47
|
+
end
|
48
|
+
|
49
|
+
# @author Maxine Michalski
|
50
|
+
#
|
51
|
+
# Helper function for flagged posts
|
52
|
+
#
|
53
|
+
# @return [Array<DeletedPost>] array of deleted posts
|
54
|
+
def self.fetch_list(page)
|
55
|
+
API.new.fetch('post_flag_history', 'index', page: page).map do |post|
|
56
|
+
DeletedPost.new(post[:id], post[:reason])
|
57
|
+
end
|
58
|
+
end
|
59
|
+
private_class_method :fetch_list
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
@@ -0,0 +1,62 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# Copyright 2014-2018 Maxine Michalski <maxine@furfind.net>
|
4
|
+
#
|
5
|
+
# This file is part of rubyhexagon.
|
6
|
+
#
|
7
|
+
# rubyhexagon is free software: you can redistribute it and/or modify
|
8
|
+
# it under the terms of the GNU General Public License as published by
|
9
|
+
# the Free Software Foundation, either version 3 of the License, or
|
10
|
+
# (at your option) any later version.
|
11
|
+
#
|
12
|
+
# rubyhexagon is distributed in the hope that it will be useful,
|
13
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
14
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
15
|
+
# GNU General Public License for more details.
|
16
|
+
# You should have received a copy of the GNU General Public License
|
17
|
+
# along with rubyhexagon. If not, see <http://www.gnu.org/licenses/>.
|
18
|
+
|
19
|
+
module Rubyhexagon
|
20
|
+
# Module to hold search classes
|
21
|
+
#
|
22
|
+
# @author Maxine Michalski
|
23
|
+
# @since 1.0.0
|
24
|
+
module Search
|
25
|
+
# Class to hold methods for Pool searches.
|
26
|
+
#
|
27
|
+
# @author Maxine Michalski
|
28
|
+
# @since 1.4.0
|
29
|
+
class Pools
|
30
|
+
# @author Maxine Michalski
|
31
|
+
#
|
32
|
+
# Retrieve a list of pools.
|
33
|
+
# This method accepts blocks and only returns one page without blocks
|
34
|
+
#
|
35
|
+
# @param page [Integer] page of deleted pools to return
|
36
|
+
#
|
37
|
+
# @return [Array<Pool>] an array of deleted pools
|
38
|
+
def self.list(query, page = 1)
|
39
|
+
parameters = { query: query, page: page }
|
40
|
+
pools = fetch_pools(parameters)
|
41
|
+
while block_given? && pools != []
|
42
|
+
pools.each { |pool| yield pool }
|
43
|
+
parameters[:page] += 1
|
44
|
+
pools = fetch_pools(parameters)
|
45
|
+
end
|
46
|
+
pools
|
47
|
+
end
|
48
|
+
|
49
|
+
# @author Maxine Michalski
|
50
|
+
#
|
51
|
+
# Helper function for pools
|
52
|
+
#
|
53
|
+
# @return [Array<Pool>] array of pools
|
54
|
+
def self.fetch_pools(parameters)
|
55
|
+
API.new.fetch('pool', 'index', parameters).map do |data|
|
56
|
+
Pool.new(data[:id]).show(data)
|
57
|
+
end
|
58
|
+
end
|
59
|
+
private_class_method :fetch_pools
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
# Copyright 2014-2018 Maxine Michalski <maxine@furfind.net>
|
2
4
|
#
|
3
5
|
# This file is part of rubyhexagon.
|
@@ -14,7 +16,7 @@
|
|
14
16
|
# You should have received a copy of the GNU General Public License
|
15
17
|
# along with rubyhexagon. If not, see <http://www.gnu.org/licenses/>.
|
16
18
|
|
17
|
-
module
|
19
|
+
module Rubyhexagon
|
18
20
|
# Module to hold search classes
|
19
21
|
#
|
20
22
|
# @author Maxine Michalski
|
@@ -108,7 +110,7 @@ module E621
|
|
108
110
|
Post.new(data[:id]).show(data)
|
109
111
|
end
|
110
112
|
end
|
111
|
-
private_class_method :
|
113
|
+
private_class_method :fetch_posts
|
112
114
|
end
|
113
115
|
end
|
114
116
|
end
|
@@ -0,0 +1,61 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# Copyright 2014-2018 Maxine Michalski <maxine@furfind.net>
|
4
|
+
#
|
5
|
+
# This file is part of rubyhexagon.
|
6
|
+
#
|
7
|
+
# rubyhexagon is free software: you can redistribute it and/or modify
|
8
|
+
# it under the terms of the GNU General Public License as published by
|
9
|
+
# the Free Software Foundation, either version 3 of the License, or
|
10
|
+
# (at your option) any later version.
|
11
|
+
#
|
12
|
+
# rubyhexagon is distributed in the hope that it will be useful,
|
13
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
14
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
15
|
+
# GNU General Public License for more details.
|
16
|
+
# You should have received a copy of the GNU General Public License
|
17
|
+
# along with rubyhexagon. If not, see <http://www.gnu.org/licenses/>.
|
18
|
+
|
19
|
+
module Rubyhexagon
|
20
|
+
# Module to hold search classes
|
21
|
+
#
|
22
|
+
# @author Maxine Michalski
|
23
|
+
# @since 1.0.0
|
24
|
+
module Search
|
25
|
+
# Class to hold methods for fetching tag changes.
|
26
|
+
#
|
27
|
+
# @author Maxine Michalski
|
28
|
+
# @since 1.4.0
|
29
|
+
class TagHistory
|
30
|
+
# @author Maxine Michalski
|
31
|
+
#
|
32
|
+
# Retrieve a list of posts with changed tags
|
33
|
+
# This method accepts blocks and only returns one page without blocks
|
34
|
+
#
|
35
|
+
# @param page [Integer] page of deleted posts to return
|
36
|
+
#
|
37
|
+
# @return [Array<Post>] an array of deleted posts
|
38
|
+
def self.list(page = 1)
|
39
|
+
d = fetch_list(page)
|
40
|
+
while block_given? && d != []
|
41
|
+
d.each { |del| yield del }
|
42
|
+
page += 1
|
43
|
+
d = fetch_list(page)
|
44
|
+
end
|
45
|
+
d
|
46
|
+
end
|
47
|
+
|
48
|
+
# @author Maxine Michalski
|
49
|
+
#
|
50
|
+
# Helper function for flagged posts
|
51
|
+
#
|
52
|
+
# @return [Array<DeletedPost>] array of deleted posts
|
53
|
+
def self.fetch_list(page)
|
54
|
+
API.new.fetch('post_tag_history', 'index', page: page).map do |post|
|
55
|
+
TagChange.new(post)
|
56
|
+
end
|
57
|
+
end
|
58
|
+
private_class_method :fetch_list
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
# Copyright 2014-2018 Maxine Michalski <maxine@furfind.net>
|
2
4
|
#
|
3
5
|
# This file is part of rubyhexagon.
|
@@ -14,7 +16,7 @@
|
|
14
16
|
# You should have received a copy of the GNU General Public License
|
15
17
|
# along with rubyhexagon. If not, see <http://www.gnu.org/licenses/>.
|
16
18
|
|
17
|
-
module
|
19
|
+
module Rubyhexagon
|
18
20
|
# Module to hold search classes
|
19
21
|
#
|
20
22
|
# @author Maxine Michalski
|
data/lib/rubyhexagon/tag.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
# Copyright 2014-2018 Maxine Michalski <maxine@furfind.net>
|
2
4
|
#
|
3
5
|
# This file is part of rubyhexagon.
|
@@ -14,7 +16,7 @@
|
|
14
16
|
# You should have received a copy of the GNU General Public License
|
15
17
|
# along with rubyhexagon. If not, see <http://www.gnu.org/licenses/>.
|
16
18
|
|
17
|
-
module
|
19
|
+
module Rubyhexagon
|
18
20
|
# Class to hold tag information.
|
19
21
|
#
|
20
22
|
# @author Maxine Michalski
|
@@ -42,7 +44,7 @@ module E621
|
|
42
44
|
#
|
43
45
|
# @return the object
|
44
46
|
def initialize(id)
|
45
|
-
unless id.is_a?(Integer) && id
|
47
|
+
unless id.is_a?(Integer) && id.positive?
|
46
48
|
raise InvalidIDError, "ID out of range: #{id}"
|
47
49
|
end
|
48
50
|
@id = id
|
@@ -0,0 +1,69 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# Copyright 2014-2018 Maxine Michalski <maxine@furfind.net>
|
4
|
+
#
|
5
|
+
# This file is part of rubyhexagon.
|
6
|
+
#
|
7
|
+
# rubyhexagon is free software: you can redistribute it and/or modify
|
8
|
+
# it under the terms of the GNU General Public License as published by
|
9
|
+
# the Free Software Foundation, either version 3 of the License, or
|
10
|
+
# (at your option) any later version.
|
11
|
+
#
|
12
|
+
# rubyhexagon is distributed in the hope that it will be useful,
|
13
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
14
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
15
|
+
# GNU General Public License for more details.
|
16
|
+
# You should have received a copy of the GNU General Public License
|
17
|
+
# along with rubyhexagon. If not, see <http://www.gnu.org/licenses/>.
|
18
|
+
|
19
|
+
module Rubyhexagon
|
20
|
+
# This class holds post information, fetched from e621, and gives access in a
|
21
|
+
# more Ruby like manner.
|
22
|
+
#
|
23
|
+
# @author Maxine Michalski
|
24
|
+
# @since 1.4.0
|
25
|
+
class TagChange
|
26
|
+
# @return [Integer] change ID
|
27
|
+
attr_reader :id
|
28
|
+
|
29
|
+
# @return [Integer] post ID that got updated
|
30
|
+
attr_reader :post_id
|
31
|
+
|
32
|
+
# @return [Time] time of change
|
33
|
+
attr_reader :created_at
|
34
|
+
|
35
|
+
# @return [Array<String>] new tags
|
36
|
+
attr_reader :tags
|
37
|
+
|
38
|
+
# @return [Array<String>] new sources
|
39
|
+
attr_reader :sources
|
40
|
+
|
41
|
+
# @author Maxine Michalski
|
42
|
+
#
|
43
|
+
# Initializer for TagChange
|
44
|
+
#
|
45
|
+
# @param post [Hash]
|
46
|
+
#
|
47
|
+
# @return the object
|
48
|
+
def initialize(post)
|
49
|
+
post.each do |k, v|
|
50
|
+
if k.to_s =~ /id$/
|
51
|
+
v = v.to_i
|
52
|
+
unless k.to_s.match(/id$/) && v.is_a?(Integer) && v.positive?
|
53
|
+
raise InvalidIDError, "ID out of range: #{v}"
|
54
|
+
end
|
55
|
+
end
|
56
|
+
instance_variable_set("@#{k}".to_sym, v)
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
# @author Maxine Michalski
|
61
|
+
#
|
62
|
+
# Comparison method for tag changes
|
63
|
+
#
|
64
|
+
# @return [TrueClass, FalseClass]
|
65
|
+
def ==(other)
|
66
|
+
other.is_a?(TagChange) && @id == other.id
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
data/lib/rubyhexagon/type.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
# Copyright 2014-2018 Maxine Michalski <maxine@furfind.net>
|
2
4
|
#
|
3
5
|
# This file is part of rubyhexagon.
|
@@ -14,7 +16,7 @@
|
|
14
16
|
# You should have received a copy of the GNU General Public License
|
15
17
|
# along with rubyhexagon. If not, see <http://www.gnu.org/licenses/>.
|
16
18
|
|
17
|
-
module
|
19
|
+
module Rubyhexagon
|
18
20
|
# Class to hold type information.
|
19
21
|
#
|
20
22
|
# @api private
|
data/lib/rubyhexagon/user.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
# Copyright 2014-2018 Maxine Michalski <maxine@furfind.net>
|
2
4
|
#
|
3
5
|
# This file is part of rubyhexagon.
|
@@ -16,7 +18,7 @@
|
|
16
18
|
|
17
19
|
require 'time'
|
18
20
|
|
19
|
-
module
|
21
|
+
module Rubyhexagon
|
20
22
|
# Class to hold user information for users on e621.
|
21
23
|
#
|
22
24
|
# @author Maxine Michalski
|
@@ -72,7 +74,11 @@ module E621
|
|
72
74
|
#
|
73
75
|
# @return [TrueClass, FalseClass]
|
74
76
|
def ==(other)
|
75
|
-
|
77
|
+
if @name.nil?
|
78
|
+
other.is_a?(User) && @id == other.id
|
79
|
+
else
|
80
|
+
other.is_a?(User) && @id == other.id && @name == other.name
|
81
|
+
end
|
76
82
|
end
|
77
83
|
end
|
78
84
|
end
|
data/lib/rubyhexagon.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
# Copyright 2014-2018 Maxine Michalski <maxine@furfind.net>
|
2
4
|
#
|
3
5
|
# This file is part of rubyhexagon.
|
@@ -29,16 +31,26 @@ require 'rubyhexagon/type'
|
|
29
31
|
require 'rubyhexagon/image'
|
30
32
|
require 'rubyhexagon/level'
|
31
33
|
require 'rubyhexagon/post'
|
34
|
+
require 'rubyhexagon/pool'
|
35
|
+
require 'rubyhexagon/tag_change'
|
32
36
|
require 'rubyhexagon/search/posts'
|
37
|
+
require 'rubyhexagon/search/pools'
|
33
38
|
require 'rubyhexagon/search/tags'
|
39
|
+
require 'rubyhexagon/search/flag_history'
|
40
|
+
require 'rubyhexagon/search/tag_history'
|
34
41
|
|
35
42
|
# Namespace for all classes in this gem.
|
36
43
|
# @author Maxine Michalski
|
37
44
|
# @since 0.4.3
|
38
|
-
module
|
45
|
+
module Rubyhexagon
|
39
46
|
MAJOR = 1
|
40
|
-
MINOR =
|
47
|
+
MINOR = 4
|
41
48
|
PATCH = 0
|
42
|
-
NAME = 'rubyhexagon'
|
43
|
-
VERSION = "#{MAJOR}.#{MINOR}.#{PATCH}"
|
49
|
+
NAME = 'rubyhexagon'
|
50
|
+
VERSION = "#{MAJOR}.#{MINOR}.#{PATCH}"
|
44
51
|
end
|
52
|
+
|
53
|
+
# Compatibility assignment, so that I can move module to a new name and don't
|
54
|
+
# break old code.
|
55
|
+
# Both module names can be used.
|
56
|
+
E621 = Rubyhexagon
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rubyhexagon
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.4.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Maxine Michalski
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-04-
|
11
|
+
date: 2018-04-15 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: json
|
@@ -36,10 +36,15 @@ files:
|
|
36
36
|
- lib/rubyhexagon/helper/api.rb
|
37
37
|
- lib/rubyhexagon/image.rb
|
38
38
|
- lib/rubyhexagon/level.rb
|
39
|
+
- lib/rubyhexagon/pool.rb
|
39
40
|
- lib/rubyhexagon/post.rb
|
41
|
+
- lib/rubyhexagon/search/flag_history.rb
|
42
|
+
- lib/rubyhexagon/search/pools.rb
|
40
43
|
- lib/rubyhexagon/search/posts.rb
|
44
|
+
- lib/rubyhexagon/search/tag_history.rb
|
41
45
|
- lib/rubyhexagon/search/tags.rb
|
42
46
|
- lib/rubyhexagon/tag.rb
|
47
|
+
- lib/rubyhexagon/tag_change.rb
|
43
48
|
- lib/rubyhexagon/type.rb
|
44
49
|
- lib/rubyhexagon/user.rb
|
45
50
|
homepage: https://github.com/maxine-red/rubyhexagon
|
@@ -54,7 +59,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
54
59
|
requirements:
|
55
60
|
- - "~>"
|
56
61
|
- !ruby/object:Gem::Version
|
57
|
-
version: '2.
|
62
|
+
version: '2.3'
|
58
63
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
59
64
|
requirements:
|
60
65
|
- - ">="
|