rubyhexagon 1.1.0 → 1.2.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.rb +1 -1
- data/lib/rubyhexagon/error.rb +6 -0
- data/lib/rubyhexagon/helper/api.rb +8 -6
- data/lib/rubyhexagon/search/posts.rb +19 -4
- data/lib/rubyhexagon/search/tags.rb +75 -3
- data/lib/rubyhexagon/tag.rb +18 -6
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f88455b4dbcc7ad6e9a36d8f377147f71dd116ecce985fcc59d424fc39804ac3
|
4
|
+
data.tar.gz: aa44c7453d967144605930ae31899c5851ef7606e38e4de4a2614f6625ffc1bb
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 2073477e49ba4cd8a7abc52d91713365e1eec77dfc9449f9d732c78188e94bd9daf742973a86ee4afd60b5677be6f6c1475672acfc06e777003e392e5fbf80b0
|
7
|
+
data.tar.gz: 017dc526b07aeadfecbd128c0578816880fb3145c7bfed57106343b76b0e3444bbd30578c7e2b77ef916b64fe04675132621c40f47d28920b8ea3b1a8563b004
|
data/lib/rubyhexagon.rb
CHANGED
data/lib/rubyhexagon/error.rb
CHANGED
@@ -19,3 +19,9 @@
|
|
19
19
|
# @author Maxine Michalski
|
20
20
|
# @since 1.0.0
|
21
21
|
class InvalidIDError < StandardError; end
|
22
|
+
|
23
|
+
# Error class to show that an object misses an important parameter
|
24
|
+
#
|
25
|
+
# @author Maxine Michalski
|
26
|
+
# @since 1.0.0
|
27
|
+
class ObjectNotFilledError < StandardError; end
|
@@ -39,10 +39,12 @@ module E621
|
|
39
39
|
def initialize(rspec = false)
|
40
40
|
@user_agent = { 'User-Agent' =>
|
41
41
|
"#{E621::NAME}/#{E621::VERSION} (by maxine_red on e621" }
|
42
|
-
@
|
42
|
+
@rspec = rspec
|
43
|
+
@base = if @rspec || !defined? RSpec then 'https://e621.net'
|
44
|
+
else 'spec/data'
|
45
|
+
end
|
43
46
|
lock_path = '/tmp/rubyhexagon.lock'
|
44
47
|
@lock_file = File.open(lock_path, 'a')
|
45
|
-
@rspec = rspec
|
46
48
|
end
|
47
49
|
|
48
50
|
# @author Maxine Michalski
|
@@ -58,13 +60,13 @@ module E621
|
|
58
60
|
# @return [Hash] JSON parsed response.
|
59
61
|
def fetch(noun, action, query)
|
60
62
|
query = query.to_a.map { |q| "#{q.first}=#{q.last}" }.join('&')
|
63
|
+
query = "?#{query}" unless query == ''
|
64
|
+
uri = "#{@base}/#{noun}/#{action}.json#{query}"
|
61
65
|
lock do
|
62
66
|
if @rspec || !defined? RSpec
|
63
|
-
JSON.parse(open(
|
64
|
-
@user_agent).read, symbolize_names: true)
|
67
|
+
JSON.parse(open(uri, @user_agent).read, symbolize_names: true)
|
65
68
|
else # In RSpec environment?
|
66
|
-
JSON.parse(open(
|
67
|
-
.read, symbolize_names: true)
|
69
|
+
JSON.parse(open(uri).read, symbolize_names: true)
|
68
70
|
end
|
69
71
|
end
|
70
72
|
end
|
@@ -69,14 +69,30 @@ module E621
|
|
69
69
|
posts
|
70
70
|
end
|
71
71
|
|
72
|
+
# @author Maxine Michalski
|
73
|
+
#
|
74
|
+
# Fetch popular posts by day, week or month
|
75
|
+
#
|
76
|
+
# @param timespan [Symbol] can be :day, :week or :month
|
77
|
+
# @raise ArgumentError if no valid symbol is given
|
78
|
+
#
|
79
|
+
# @return [Array<Post>]
|
80
|
+
def self.popular(timespan = :day)
|
81
|
+
unless %i[day week month].include?(timespan)
|
82
|
+
raise ArgumentError, "Unknown time span: #{timespan}"
|
83
|
+
end
|
84
|
+
API.new.fetch('post', "popular_by_#{timespan}", {}).map do |post|
|
85
|
+
Post.new(post[:id]).show(post)
|
86
|
+
end
|
87
|
+
end
|
88
|
+
|
72
89
|
# @author Maxine Michalski
|
73
90
|
#
|
74
91
|
# Helper function for deleted posts
|
75
92
|
#
|
76
93
|
# @return [Array<Post>] array of deleted posts
|
77
94
|
def self.fetch_deleted(page)
|
78
|
-
|
79
|
-
api.fetch('post', 'deleted_index', page: page).map do |post|
|
95
|
+
API.new.fetch('post', 'deleted_index', page: page).map do |post|
|
80
96
|
DeletedPost.new(post[:id], post[:delreason])
|
81
97
|
end
|
82
98
|
end
|
@@ -88,8 +104,7 @@ module E621
|
|
88
104
|
#
|
89
105
|
# @return [Array<Post>] array of posts
|
90
106
|
def self.fetch_posts(parameters)
|
91
|
-
|
92
|
-
api.fetch('post', 'index', parameters).map do |data|
|
107
|
+
API.new.fetch('post', 'index', parameters).map do |data|
|
93
108
|
Post.new(data[:id]).show(data)
|
94
109
|
end
|
95
110
|
end
|
@@ -33,7 +33,7 @@ module E621
|
|
33
33
|
# @param name [String] name pattern to search tags with
|
34
34
|
# @param limit [Integer] number of tags to return. This has a hard limit
|
35
35
|
# of 500
|
36
|
-
# @param
|
36
|
+
# @param page [Integer] page to retieve
|
37
37
|
#
|
38
38
|
# @return [Array<Tag>] array of tags
|
39
39
|
def self.list(name, limit = 500, page = 1)
|
@@ -48,18 +48,90 @@ module E621
|
|
48
48
|
t
|
49
49
|
end
|
50
50
|
|
51
|
+
# @author Maxine Michalski
|
52
|
+
#
|
53
|
+
# Retrieve information about implicated tags.
|
54
|
+
# @param name [String] name pattern to search tags with
|
55
|
+
# @param page [Integer] page to retrieve
|
56
|
+
#
|
57
|
+
# @raise ObjectNotFilledError if no name is present
|
58
|
+
#
|
59
|
+
# @return [Array<Tag>] array of implicated tags for this tag
|
60
|
+
def self.implications(name, page = 1)
|
61
|
+
params = { implied_to: name, page: page }
|
62
|
+
tags = fetch_implications(params)
|
63
|
+
while block_given? && tags != []
|
64
|
+
tags.each { |tag| yield tag unless tag.nil? }
|
65
|
+
tags = fetch_implications(params)
|
66
|
+
params[:page] += 1
|
67
|
+
end
|
68
|
+
tags.compact
|
69
|
+
end
|
70
|
+
|
71
|
+
# @author Maxine Michalski
|
72
|
+
#
|
73
|
+
# Retrieve information about aliased tags.
|
74
|
+
# @param name [String] name pattern to search tags with
|
75
|
+
# @param page [Integer] page to retrieve
|
76
|
+
#
|
77
|
+
# @raise ObjectNotFilledError if no name is present
|
78
|
+
#
|
79
|
+
# @return [Array<Tag>] array of implicated tags for this tag
|
80
|
+
def self.aliases(name, page = 1)
|
81
|
+
params = { aliased_to: name, approved: true, page: page }
|
82
|
+
tags = fetch_aliases(params)
|
83
|
+
while block_given? && tags != []
|
84
|
+
tags.each { |tag| yield tag unless tag.nil? }
|
85
|
+
tags = fetch_aliases(params)
|
86
|
+
params[:page] += 1
|
87
|
+
end
|
88
|
+
tags.compact
|
89
|
+
end
|
90
|
+
|
51
91
|
# @author Maxine Michalski
|
52
92
|
#
|
53
93
|
# Helper function to get Tag data
|
54
94
|
#
|
55
95
|
# @return [Array<Tag>] array of tags
|
56
96
|
def self.fetch_tags(params)
|
57
|
-
|
58
|
-
api.fetch('tag', 'index', params).map do |data|
|
97
|
+
API.new.fetch('tag', 'index', params).map do |data|
|
59
98
|
Tag.new(data[:id]).show(data)
|
60
99
|
end
|
61
100
|
end
|
62
101
|
private_class_method :fetch_tags
|
102
|
+
|
103
|
+
# @author Maxine Michalski
|
104
|
+
#
|
105
|
+
# Helper function to fetch implicated tags
|
106
|
+
#
|
107
|
+
# @param params [Hash] parameter for API call
|
108
|
+
#
|
109
|
+
# @return [Array<Tag>] array of implicated tags
|
110
|
+
def self.fetch_implications(params)
|
111
|
+
tag_params = { name: params[:implied_to], order: :date, limit: 1,
|
112
|
+
page: 1 }
|
113
|
+
implied_tag = fetch_tags(tag_params).first
|
114
|
+
API.new.fetch('tag_implication', 'index', params).map do |tag|
|
115
|
+
if tag[:consequent_id] == implied_tag.id && !tag[:pending]
|
116
|
+
Tag.new(tag[:predicate_id])
|
117
|
+
end
|
118
|
+
end
|
119
|
+
end
|
120
|
+
private_class_method :fetch_implications
|
121
|
+
|
122
|
+
# @author Maxine Michalski
|
123
|
+
#
|
124
|
+
# Helper function to fetch aliased tags
|
125
|
+
#
|
126
|
+
# @param params [Hash] parameter for API call
|
127
|
+
#
|
128
|
+
# @return [Array<Tag>] array of implicated tags
|
129
|
+
def self.fetch_aliases(params)
|
130
|
+
API.new.fetch('tag_alias', 'index', params).map do |tag|
|
131
|
+
Tag.new(tag[:alias_id])
|
132
|
+
end
|
133
|
+
end
|
134
|
+
private_class_method :fetch_aliases
|
63
135
|
end
|
64
136
|
end
|
65
137
|
end
|
data/lib/rubyhexagon/tag.rb
CHANGED
@@ -38,7 +38,7 @@ module E621
|
|
38
38
|
#
|
39
39
|
# @raise InvalidIDError
|
40
40
|
#
|
41
|
-
# @param
|
41
|
+
# @param id [Integer] tag data, fetched from e621
|
42
42
|
#
|
43
43
|
# @return the object
|
44
44
|
def initialize(id)
|
@@ -50,19 +50,29 @@ module E621
|
|
50
50
|
|
51
51
|
# @author Maxine Michalski
|
52
52
|
#
|
53
|
-
# Bang method to fill tag data.
|
54
|
-
#
|
53
|
+
# Bang method to fill tag data.
|
54
|
+
# @notice If the optional parameter is not given, this method makes an API
|
55
|
+
# call.
|
56
|
+
#
|
57
|
+
# @param tag [Hash] optional parameter with API call information
|
58
|
+
#
|
59
|
+
# @return [NilClass]
|
55
60
|
def show!(tag = nil)
|
56
61
|
tag = API.new.fetch('tag', 'show', id: @id) if tag.nil?
|
57
62
|
@name = tag[:name]
|
58
63
|
@count = tag[:count].to_i
|
59
64
|
@type = (Type.new(tag[:type], tag[:type_locked]) unless tag[:type].nil?)
|
65
|
+
nil
|
60
66
|
end
|
61
67
|
|
62
68
|
# @author Maxine Michalski
|
63
69
|
#
|
64
|
-
#
|
65
|
-
#
|
70
|
+
# Method to return a properly filled Tag object.
|
71
|
+
# @note This makes an additional API call if no argument is given
|
72
|
+
#
|
73
|
+
# @param tag [Hash] optional parameter, if information are ready
|
74
|
+
#
|
75
|
+
# @return [Tag] Tag filled with all information
|
66
76
|
def show(tag = nil)
|
67
77
|
new_tag = Tag.new(@id)
|
68
78
|
new_tag.show!(tag)
|
@@ -76,7 +86,9 @@ module E621
|
|
76
86
|
# @note If there is only a an ID set with one argument, then only compare
|
77
87
|
# IDs
|
78
88
|
#
|
79
|
-
# @
|
89
|
+
# @param other [Object] object that should be compared
|
90
|
+
#
|
91
|
+
# @return [TrueClass, FalseClass] test result of comparison
|
80
92
|
def ==(other)
|
81
93
|
return false unless other.is_a?(Tag)
|
82
94
|
if @name.nil? || other.name.nil?
|
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.2.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-03-
|
11
|
+
date: 2018-03-28 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: json
|