deviantart 0.2.2 → 0.3.0
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.
- checksums.yaml +4 -4
- data/.travis.yml +2 -2
- data/README.md +1 -1
- data/Rakefile +42 -26
- data/deviantart.gemspec +1 -1
- data/lib/deviantart.rb +6 -2
- data/lib/deviantart/base.rb +74 -0
- data/lib/deviantart/client.rb +52 -18
- data/lib/deviantart/client/collections.rb +30 -0
- data/lib/deviantart/client/data.rb +31 -0
- data/lib/deviantart/client/deviation.rb +36 -0
- data/lib/deviantart/client/feed.rb +18 -0
- data/lib/deviantart/client/gallery.rb +46 -0
- data/lib/deviantart/client/user.rb +75 -0
- data/lib/deviantart/collections.rb +5 -23
- data/lib/deviantart/collections/folders.rb +8 -0
- data/lib/deviantart/data.rb +3 -21
- data/lib/deviantart/data/countries.rb +7 -0
- data/lib/deviantart/data/privacy.rb +7 -0
- data/lib/deviantart/data/submission.rb +7 -0
- data/lib/deviantart/data/tos.rb +7 -0
- data/lib/deviantart/deviation.rb +9 -27
- data/lib/deviantart/deviation/content.rb +6 -0
- data/lib/deviantart/deviation/download.rb +6 -0
- data/lib/deviantart/deviation/whofaved.rb +7 -0
- data/lib/deviantart/error.rb +12 -0
- data/lib/deviantart/feed.rb +3 -11
- data/lib/deviantart/feed/home.rb +14 -0
- data/lib/deviantart/gallery.rb +5 -38
- data/lib/deviantart/gallery/all.rb +8 -0
- data/lib/deviantart/gallery/folders.rb +8 -0
- data/lib/deviantart/status.rb +10 -0
- data/lib/deviantart/user.rb +5 -53
- data/lib/deviantart/user/friends.rb +8 -0
- data/lib/deviantart/user/friends/search.rb +8 -0
- data/lib/deviantart/user/profile.rb +11 -0
- data/lib/deviantart/user/statuses.rb +8 -0
- data/lib/deviantart/user/watchers.rb +8 -0
- data/lib/deviantart/user/whois.rb +8 -0
- data/lib/deviantart/version.rb +1 -1
- metadata +29 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 162d1fde53c7eccf7687ae2392536e3b0bd0540a
|
4
|
+
data.tar.gz: 13ac6cbf255db8fd66ec059dbc2828b495990168
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f39a3cfe0373bebd317ed7c22a7dfaf6356af1ddf641c0e62c15012edd0055d744b6c4a7165c3bbedb49ed45bdf418bb7532b3a0531394bd436092f1cd903123
|
7
|
+
data.tar.gz: 024e4b0350e98ad6d0a314733989c0167cd89bd209dcdabd1a940dc101a7d7e10e2a4bc6d9f019c07b57ba699212b3a965d330b12c6c0fbbbd01d1c3f1c4ad8f
|
data/.travis.yml
CHANGED
data/README.md
CHANGED
data/Rakefile
CHANGED
@@ -1,6 +1,11 @@
|
|
1
|
-
require
|
2
|
-
require
|
3
|
-
require
|
1
|
+
require 'bundler/gem_tasks'
|
2
|
+
require 'rake/testtask'
|
3
|
+
require 'readline'
|
4
|
+
require 'net/http'
|
5
|
+
|
6
|
+
BROWSER_COMMAND_FILE = 'test/browser_command'
|
7
|
+
AUTHORIZATION_CODE_FILE = 'test/fixtures/authorization_code.json'
|
8
|
+
OUTPUT_PIPE = 'test/output_pipe'
|
4
9
|
|
5
10
|
test_pettern = FileList['test/**/*_test.rb']
|
6
11
|
|
@@ -11,20 +16,40 @@ Rake::TestTask.new(:test) do |t|
|
|
11
16
|
end
|
12
17
|
|
13
18
|
def get_browser_command
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
19
|
+
open(BROWSER_COMMAND_FILE, 'r').read
|
20
|
+
end
|
21
|
+
|
22
|
+
file BROWSER_COMMAND_FILE do
|
23
|
+
browser_command = Readline.readline('Input your browser command> ')
|
24
|
+
open(BROWSER_COMMAND_FILE, 'w') do |f|
|
25
|
+
f.write(browser_command)
|
26
|
+
end
|
27
|
+
puts "Wrote \"#{browser_command}\" to #{BROWSER_COMMAND_FILE}"
|
28
|
+
end
|
29
|
+
|
30
|
+
def wait_oauth_consumer_booting
|
31
|
+
http = Net::HTTP.new('localhost', 4567)
|
32
|
+
http.open_timeout = 1
|
33
|
+
begin
|
34
|
+
http.start
|
35
|
+
rescue Errno::ECONNREFUSED
|
36
|
+
sleep 1
|
37
|
+
retry
|
38
|
+
rescue Net::OpenTimeout
|
39
|
+
retry
|
40
|
+
rescue => e
|
41
|
+
puts e.class.name
|
42
|
+
end
|
43
|
+
while http.head('/').code != '200'
|
44
|
+
sleep 1
|
24
45
|
end
|
25
46
|
end
|
26
47
|
|
27
|
-
|
48
|
+
file AUTHORIZATION_CODE_FILE => BROWSER_COMMAND_FILE do
|
49
|
+
if File.exists?(OUTPUT_PIPE)
|
50
|
+
File.unlink(OUTPUT_PIPE)
|
51
|
+
end
|
52
|
+
File.mkfifo(OUTPUT_PIPE)
|
28
53
|
cv = ConditionVariable.new
|
29
54
|
mutex = Mutex.new
|
30
55
|
is_pinged = false
|
@@ -34,6 +59,7 @@ def get_access_token
|
|
34
59
|
system('bundle exec ruby test/oauth_consumer.rb > /dev/null 2>&1 &')
|
35
60
|
open(OUTPUT_PIPE).read # block to get 'ping'
|
36
61
|
is_pinged = true
|
62
|
+
wait_oauth_consumer_booting
|
37
63
|
cv.signal
|
38
64
|
}
|
39
65
|
}
|
@@ -60,20 +86,10 @@ def get_access_token
|
|
60
86
|
open(AUTHORIZATION_CODE_FILE, 'w') do |f|
|
61
87
|
f.write(result)
|
62
88
|
end
|
89
|
+
File.unlink(OUTPUT_PIPE)
|
63
90
|
end
|
64
91
|
|
65
|
-
task :access_token
|
66
|
-
AUTHORIZATION_CODE_FILE = 'test/fixtures/authorization_code.json'
|
67
|
-
if !File.exists?(AUTHORIZATION_CODE_FILE)
|
68
|
-
OUTPUT_PIPE = 'test/output_pipe'
|
69
|
-
if File.exists?(OUTPUT_PIPE)
|
70
|
-
File.unlink(OUTPUT_PIPE)
|
71
|
-
end
|
72
|
-
File.mkfifo(OUTPUT_PIPE)
|
73
|
-
get_access_token
|
74
|
-
File.unlink(OUTPUT_PIPE)
|
75
|
-
end
|
76
|
-
end
|
92
|
+
task :access_token => AUTHORIZATION_CODE_FILE
|
77
93
|
|
78
94
|
Rake::TestTask.new(:real) do |t|
|
79
95
|
t.deps << :access_token
|
data/deviantart.gemspec
CHANGED
@@ -14,7 +14,7 @@ Gem::Specification.new do |spec|
|
|
14
14
|
spec.homepage = "https://github.com/aycabta/deviantart"
|
15
15
|
spec.license = "MIT"
|
16
16
|
|
17
|
-
spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|
|
17
|
+
spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|features)/}) }
|
18
18
|
spec.bindir = "exe"
|
19
19
|
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
20
20
|
spec.require_paths = ["lib"]
|
data/lib/deviantart.rb
CHANGED
@@ -1,5 +1,9 @@
|
|
1
|
-
require
|
2
|
-
require
|
1
|
+
require 'deviantart/version'
|
2
|
+
require 'deviantart/client'
|
3
|
+
require 'deviantart/base'
|
4
|
+
require 'deviantart/deviation'
|
5
|
+
require 'deviantart/user'
|
6
|
+
require 'deviantart/status'
|
3
7
|
|
4
8
|
module DeviantArt
|
5
9
|
# Bypass args and block to DeviantArt::Client
|
@@ -0,0 +1,74 @@
|
|
1
|
+
module DeviantArt
|
2
|
+
class Base
|
3
|
+
attr_reader :attrs
|
4
|
+
@points_class_mapping = {}
|
5
|
+
|
6
|
+
def initialize(attrs)
|
7
|
+
@attrs = attrs
|
8
|
+
define_hash_attrs(self, @attrs, [])
|
9
|
+
end
|
10
|
+
|
11
|
+
class << self
|
12
|
+
def points_class_mapping
|
13
|
+
@points_class_mapping ||= {}
|
14
|
+
end
|
15
|
+
def points_class_mapping=(v)
|
16
|
+
@points_class_mapping = v
|
17
|
+
end
|
18
|
+
|
19
|
+
def point_to_class(point, klass)
|
20
|
+
self.points_class_mapping[point] = klass
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
private
|
25
|
+
|
26
|
+
def define_hash_attrs(receiver, attrs, point)
|
27
|
+
attrs.each_pair do |key, value|
|
28
|
+
attr_accessor_with_receiver(receiver, key)
|
29
|
+
receiver.instance_variable_set(:"@#{key}", nested_value(value, point + [key.to_sym]))
|
30
|
+
end
|
31
|
+
receiver
|
32
|
+
end
|
33
|
+
|
34
|
+
def attr_accessor_with_receiver(receiver, name)
|
35
|
+
receiver.instance_eval do
|
36
|
+
reader_name = name.to_sym
|
37
|
+
writer_name = :"#{name}="
|
38
|
+
variable_name = :"@#{name}"
|
39
|
+
if !receiver.respond_to?(reader_name)
|
40
|
+
define_singleton_method(reader_name, proc { |dummy=nil| instance_variable_get(variable_name) })
|
41
|
+
end
|
42
|
+
if !receiver.respond_to?(writer_name)
|
43
|
+
define_singleton_method(writer_name, method(:instance_variable_set).curry.(variable_name))
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
def define_array_attrs(array, attrs, point)
|
49
|
+
attrs.each do |value|
|
50
|
+
array << nested_value(value, point)
|
51
|
+
end
|
52
|
+
array
|
53
|
+
end
|
54
|
+
|
55
|
+
def nested_value(value, point)
|
56
|
+
if self.class.points_class_mapping.include?(point)
|
57
|
+
self.class.points_class_mapping[point].new(value)
|
58
|
+
else
|
59
|
+
case value
|
60
|
+
when Array
|
61
|
+
define_array_attrs(Array.new, value, point + [:[]])
|
62
|
+
when Hash
|
63
|
+
define_hash_attrs(Object.new, value, point)
|
64
|
+
else
|
65
|
+
value
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
class Deviation < Base; end
|
72
|
+
class User < Base; end
|
73
|
+
class Status < Base; end
|
74
|
+
end
|
data/lib/deviantart/client.rb
CHANGED
@@ -1,10 +1,11 @@
|
|
1
|
-
require 'deviantart/deviation'
|
2
|
-
require 'deviantart/gallery'
|
3
|
-
require 'deviantart/collections'
|
4
|
-
require 'deviantart/user'
|
5
|
-
require 'deviantart/data'
|
6
|
-
require 'deviantart/feed'
|
1
|
+
require 'deviantart/client/deviation'
|
2
|
+
require 'deviantart/client/gallery'
|
3
|
+
require 'deviantart/client/collections'
|
4
|
+
require 'deviantart/client/user'
|
5
|
+
require 'deviantart/client/data'
|
6
|
+
require 'deviantart/client/feed'
|
7
7
|
# TODO: comments, cured, messages, notes, stash, util
|
8
|
+
require 'deviantart/error'
|
8
9
|
require 'net/http'
|
9
10
|
require 'uri'
|
10
11
|
require 'json'
|
@@ -15,13 +16,13 @@ end
|
|
15
16
|
|
16
17
|
module DeviantArt
|
17
18
|
class Client
|
18
|
-
include DeviantArt::Deviation
|
19
|
-
include DeviantArt::Gallery
|
20
|
-
include DeviantArt::Collections
|
21
|
-
include DeviantArt::User
|
22
|
-
include DeviantArt::Data
|
23
|
-
include DeviantArt::Feed
|
24
|
-
attr_accessor :access_token, :client_id, :client_secret, :code, :redirect_uri, :grant_type, :access_token_auto_refresh, :refresh_token, :host
|
19
|
+
include DeviantArt::Client::Deviation
|
20
|
+
include DeviantArt::Client::Gallery
|
21
|
+
include DeviantArt::Client::Collections
|
22
|
+
include DeviantArt::Client::User
|
23
|
+
include DeviantArt::Client::Data
|
24
|
+
include DeviantArt::Client::Feed
|
25
|
+
attr_accessor :access_token, :client_id, :client_secret, :code, :redirect_uri, :grant_type, :access_token_auto_refresh, :refresh_token, :host, :headers
|
25
26
|
attr_writer :user_agent
|
26
27
|
@@default_host = 'www.deviantart.com'
|
27
28
|
|
@@ -42,6 +43,7 @@ module DeviantArt
|
|
42
43
|
# [#redirect_uri] URL what is exactly match the value in authorization step.
|
43
44
|
# [#code] Authorization step returns this.
|
44
45
|
# [#refresh_token] Refresh token for +:authorization_code+.
|
46
|
+
# [#headers] Add custom headers for request.
|
45
47
|
#
|
46
48
|
# For refresh token with +:client_credentials+
|
47
49
|
#
|
@@ -52,6 +54,9 @@ module DeviantArt
|
|
52
54
|
@host = @@default_host
|
53
55
|
@on_refresh_access_token = nil
|
54
56
|
@on_refresh_authorization_code = nil
|
57
|
+
@access_token_auto_refresh = true
|
58
|
+
@grant_type = nil
|
59
|
+
@headers = {}
|
55
60
|
options.each do |key, value|
|
56
61
|
instance_variable_set("@#{key}", value)
|
57
62
|
end
|
@@ -72,11 +77,11 @@ module DeviantArt
|
|
72
77
|
|
73
78
|
# Auto refresh access token flag
|
74
79
|
def access_token_auto_refresh?
|
75
|
-
@access_token_auto_refresh
|
80
|
+
@access_token_auto_refresh && !@grant_type.nil?
|
76
81
|
end
|
77
82
|
|
78
83
|
# Access API with params by method
|
79
|
-
def perform(method, path, params = {})
|
84
|
+
def perform(klass, method, path, params = {})
|
80
85
|
if @access_token.nil? && access_token_auto_refresh?
|
81
86
|
refresh_access_token
|
82
87
|
end
|
@@ -85,7 +90,29 @@ module DeviantArt
|
|
85
90
|
refresh_access_token
|
86
91
|
response = request(method, path, params)
|
87
92
|
end
|
88
|
-
response.
|
93
|
+
case response.code
|
94
|
+
when '200'
|
95
|
+
klass.new(response.json)
|
96
|
+
when '400'
|
97
|
+
# Request failed due to client error,
|
98
|
+
# e.g. validation failed or User not found
|
99
|
+
DeviantArt::Error.new(response.json, response.code.to_i)
|
100
|
+
when '401'
|
101
|
+
# Invalid token
|
102
|
+
DeviantArt::Error.new(response.json, response.code.to_i)
|
103
|
+
when '429'
|
104
|
+
# Rate limit reached or service overloaded
|
105
|
+
DeviantArt::Error.new(response.json, response.code.to_i)
|
106
|
+
when '500'
|
107
|
+
# Our servers encountered an internal error, try again
|
108
|
+
DeviantArt::Error.new(response.json, response.code.to_i)
|
109
|
+
when '503'
|
110
|
+
# Our servers are currently unavailable, try again later.
|
111
|
+
# This is normally due to planned or emergency maintenance.
|
112
|
+
DeviantArt::Error.new(response.json, response.code.to_i)
|
113
|
+
else
|
114
|
+
DeviantArt::Error.new(response.json, response.code.to_i)
|
115
|
+
end
|
89
116
|
end
|
90
117
|
|
91
118
|
# Call given block when authorization code is refreshed
|
@@ -129,8 +156,16 @@ module DeviantArt
|
|
129
156
|
if not @access_token.nil?
|
130
157
|
request["Authorization"] = "Bearer #{@access_token}"
|
131
158
|
end
|
159
|
+
@headers.each_pair do |key, value|
|
160
|
+
request[key] = value
|
161
|
+
end
|
132
162
|
response = @http.request(request)
|
133
|
-
response.
|
163
|
+
if response.code == '403'
|
164
|
+
# You must send User-Agent and use HTTP compression in request
|
165
|
+
response.json = JSON.parse('{}')
|
166
|
+
else
|
167
|
+
response.json = JSON.parse(response.body)
|
168
|
+
end
|
134
169
|
response
|
135
170
|
end
|
136
171
|
|
@@ -171,4 +206,3 @@ module DeviantArt
|
|
171
206
|
end
|
172
207
|
end
|
173
208
|
end
|
174
|
-
|
@@ -0,0 +1,30 @@
|
|
1
|
+
require 'deviantart/collections'
|
2
|
+
require 'deviantart/collections/folders'
|
3
|
+
|
4
|
+
module DeviantArt
|
5
|
+
class Client
|
6
|
+
module Collections
|
7
|
+
# Fetch collection folders
|
8
|
+
def get_collections_folders(username: nil, calculate_size: false, ext_preload: false, offset: 0, limit: 10)
|
9
|
+
params = {}
|
10
|
+
params['username'] = username unless username.nil?
|
11
|
+
params['calculate_size'] = calculate_size if calculate_size
|
12
|
+
params['ext_preload'] = ext_preload if ext_preload
|
13
|
+
params['offset'] = offset if offset != 0
|
14
|
+
params['limit'] = limit if limit != 10
|
15
|
+
perform(DeviantArt::Collections::Folders, :get, '/api/v1/oauth2/collections/folders', params)
|
16
|
+
end
|
17
|
+
|
18
|
+
# Fetch collection folder contents
|
19
|
+
def get_collections(folderid, username: nil, offset: 0, limit: 10)
|
20
|
+
params = {}
|
21
|
+
params['username'] = username unless username.nil?
|
22
|
+
params['offset'] = offset if offset != 0
|
23
|
+
params['limit'] = limit if limit != 10
|
24
|
+
perform(DeviantArt::Collections, :get, "/api/v1/oauth2/collections/#{folderid}", params)
|
25
|
+
end
|
26
|
+
|
27
|
+
# TODO: fave, folders/create, folders/remove/{folderid}, unfav
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
require 'deviantart/data'
|
2
|
+
require 'deviantart/data/countries'
|
3
|
+
require 'deviantart/data/privacy'
|
4
|
+
require 'deviantart/data/submission'
|
5
|
+
require 'deviantart/data/tos'
|
6
|
+
|
7
|
+
module DeviantArt
|
8
|
+
class Client
|
9
|
+
module Data
|
10
|
+
# Get a list of countries
|
11
|
+
def get_countries
|
12
|
+
perform(DeviantArt::Data::Countries, :get, '/api/v1/oauth2/data/countries')
|
13
|
+
end
|
14
|
+
|
15
|
+
# Returns the DeviantArt Privacy Policy
|
16
|
+
def get_privacy
|
17
|
+
perform(DeviantArt::Data::Privacy, :get, '/api/v1/oauth2/data/privacy')
|
18
|
+
end
|
19
|
+
|
20
|
+
# Returns the DeviantArt Submission Policy
|
21
|
+
def get_submission
|
22
|
+
perform(DeviantArt::Data::Submission, :get, '/api/v1/oauth2/data/submission')
|
23
|
+
end
|
24
|
+
|
25
|
+
# Returns the DeviantArt Terms of Service
|
26
|
+
def get_tos
|
27
|
+
perform(DeviantArt::Data::TOS, :get, '/api/v1/oauth2/data/tos')
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
require 'deviantart/deviation'
|
2
|
+
require 'deviantart/deviation/content'
|
3
|
+
require 'deviantart/deviation/whofaved'
|
4
|
+
require 'deviantart/deviation/download'
|
5
|
+
|
6
|
+
module DeviantArt
|
7
|
+
class Client
|
8
|
+
module Deviation
|
9
|
+
# Fetch a deviation details
|
10
|
+
def get_deviation(deviationid)
|
11
|
+
perform(DeviantArt::Deviation, :get, "/api/v1/oauth2/deviation/#{deviationid}")
|
12
|
+
end
|
13
|
+
|
14
|
+
# Fetch full data that is not included in the main devaition details
|
15
|
+
def get_deviation_content(deviationid)
|
16
|
+
perform(DeviantArt::Deviation::Content, :get, '/api/v1/oauth2/deviation/content', { deviationid: deviationid })
|
17
|
+
end
|
18
|
+
|
19
|
+
# Fetch a list of users who faved the deviation
|
20
|
+
def get_deviation_whofaved(deviationid, offset: 0, limit: 10)
|
21
|
+
params = {}
|
22
|
+
params['deviationid'] = deviationid
|
23
|
+
params['offset'] = offset if offset != 0
|
24
|
+
params['limit'] = limit if limit != 10
|
25
|
+
perform(DeviantArt::Deviation::WhoFaved, :get, '/api/v1/oauth2/deviation/whofaved', params)
|
26
|
+
end
|
27
|
+
|
28
|
+
# Get the original file download (if allowed)
|
29
|
+
def download_deviation(deviationid)
|
30
|
+
perform(DeviantArt::Deviation::Download, :get, "/api/v1/oauth2/deviation/download/#{deviationid}")
|
31
|
+
end
|
32
|
+
|
33
|
+
# TODO: embeddedcontent, metadata
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
require 'deviantart/feed'
|
2
|
+
require 'deviantart/feed/home'
|
3
|
+
|
4
|
+
module DeviantArt
|
5
|
+
class Client
|
6
|
+
module Feed
|
7
|
+
# Fetch Watch Feed
|
8
|
+
def get_feed(mature_content: false, cursor: nil)
|
9
|
+
params = {}
|
10
|
+
params['cursor'] = cursor unless cursor.nil?
|
11
|
+
params['mature_content'] = mature_content
|
12
|
+
perform(DeviantArt::Feed::Home, :get, '/api/v1/oauth2/feed/home', params)
|
13
|
+
end
|
14
|
+
|
15
|
+
# TODO: home/{bucketid}, notifications, profile, settings, settings/update
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,46 @@
|
|
1
|
+
require 'deviantart/gallery'
|
2
|
+
require 'deviantart/gallery/all'
|
3
|
+
require 'deviantart/gallery/folders'
|
4
|
+
|
5
|
+
module DeviantArt
|
6
|
+
class Client
|
7
|
+
module Gallery
|
8
|
+
# Get the "all" view of a users gallery
|
9
|
+
def get_gallery_all(username: nil, offset: 0, limit: 10)
|
10
|
+
params = {}
|
11
|
+
params['username'] = username unless username.nil?
|
12
|
+
params['offset'] = offset if offset != 0
|
13
|
+
params['limit'] = limit if limit != 10
|
14
|
+
perform(DeviantArt::Gallery::All, :get, '/api/v1/oauth2/gallery/all', params)
|
15
|
+
end
|
16
|
+
|
17
|
+
# Fetch gallery folders
|
18
|
+
def get_gallery_folders(username: nil, calculate_size: false, ext_preload: false, offset: 0, limit: 10)
|
19
|
+
params = {}
|
20
|
+
params['username'] = username unless username.nil?
|
21
|
+
params['calculate_size'] = calculate_size if calculate_size
|
22
|
+
params['ext_preload'] = ext_preload if ext_preload
|
23
|
+
params['offset'] = offset if offset != 0
|
24
|
+
params['limit'] = limit if limit != 10
|
25
|
+
perform(DeviantArt::Gallery::Folders, :get, '/api/v1/oauth2/gallery/folders', params)
|
26
|
+
end
|
27
|
+
|
28
|
+
# Fetch gallery folder contents
|
29
|
+
def get_gallery(username: nil, folderid: nil, mode: nil, offset: 0, limit: 10)
|
30
|
+
params = {}
|
31
|
+
params['username'] = username unless username.nil?
|
32
|
+
params['mode'] = mode unless mode.nil?
|
33
|
+
params['offset'] = offset if offset != 0
|
34
|
+
params['limit'] = limit if limit != 10
|
35
|
+
unless folderid.nil?
|
36
|
+
path = "/api/v1/oauth2/gallery/#{folderid}"
|
37
|
+
else
|
38
|
+
path = '/api/v1/oauth2/gallery/'
|
39
|
+
end
|
40
|
+
perform(DeviantArt::Gallery, :get, path, params)
|
41
|
+
end
|
42
|
+
|
43
|
+
# TODO: create, remove/{folderid}
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
@@ -0,0 +1,75 @@
|
|
1
|
+
require 'deviantart/user'
|
2
|
+
require 'deviantart/user/profile'
|
3
|
+
require 'deviantart/user/friends'
|
4
|
+
require 'deviantart/user/friends/search'
|
5
|
+
require 'deviantart/user/whois'
|
6
|
+
require 'deviantart/user/statuses'
|
7
|
+
require 'deviantart/user/watchers'
|
8
|
+
|
9
|
+
module DeviantArt
|
10
|
+
class Client
|
11
|
+
module User
|
12
|
+
# Get user profile information
|
13
|
+
def get_profile(username, ext_collections: false, ext_galleries: false)
|
14
|
+
params = {}
|
15
|
+
params['ext_collections'] = ext_collections if ext_collections
|
16
|
+
params['ext_galleries'] = ext_galleries if ext_galleries
|
17
|
+
perform(DeviantArt::User::Profile, :get, "/api/v1/oauth2/user/profile/#{username.nil? ? '' : username}", params)
|
18
|
+
end
|
19
|
+
|
20
|
+
# Get the users list of friends
|
21
|
+
def get_friends(username, offset: 0, limit: 10)
|
22
|
+
params = {}
|
23
|
+
params['offset'] = offset if offset != 0
|
24
|
+
params['limit'] = limit if limit != 10
|
25
|
+
perform(DeviantArt::User::Friends, :get, "/api/v1/oauth2/user/friends/#{username.nil? ? '' : username}", params)
|
26
|
+
end
|
27
|
+
|
28
|
+
# Fetch user info for given usernames
|
29
|
+
def whois(users)
|
30
|
+
params = { usernames: users.is_a?(Enumerable) ? users : [users] }
|
31
|
+
perform(DeviantArt::User::Whois, :post, '/api/v1/oauth2/user/whois', params)
|
32
|
+
end
|
33
|
+
|
34
|
+
# Fetch user info of authenticated user
|
35
|
+
def whoami
|
36
|
+
perform(DeviantArt::User, :get, '/api/v1/oauth2/user/whoami?')
|
37
|
+
end
|
38
|
+
|
39
|
+
# Search friends by username
|
40
|
+
def search_friends(query, username: nil)
|
41
|
+
params = {}
|
42
|
+
params['query'] = query
|
43
|
+
params['username'] = username unless username.nil?
|
44
|
+
perform(DeviantArt::User::Friends::Search, :get, '/api/v1/oauth2/user/friends/search', params)
|
45
|
+
end
|
46
|
+
|
47
|
+
# User Statuses
|
48
|
+
def get_statuses(username, offset: 0, limit: 10, mature_content: true)
|
49
|
+
params = {}
|
50
|
+
params['username'] = username
|
51
|
+
params['mature_content'] = mature_content
|
52
|
+
params['offset'] = offset if offset != 0
|
53
|
+
params['limit'] = limit if limit != 10
|
54
|
+
perform(DeviantArt::User::Statuses, :get, '/api/v1/oauth2/user/statuses/', params)
|
55
|
+
end
|
56
|
+
|
57
|
+
# Fetch the status
|
58
|
+
def get_status(statusid, mature_content: true)
|
59
|
+
params = {}
|
60
|
+
params['mature_content'] = mature_content
|
61
|
+
perform(DeviantArt::Status, :get, "/api/v1/oauth2/user/statuses/#{statusid}", params)
|
62
|
+
end
|
63
|
+
|
64
|
+
# Get the user's list of watchers
|
65
|
+
def get_watchers(username: nil, offset: 0, limit: 10)
|
66
|
+
params = {}
|
67
|
+
params['offset'] = offset if offset != 0
|
68
|
+
params['limit'] = limit if limit != 10
|
69
|
+
perform(DeviantArt::User::Watchers, :get, "/api/v1/oauth2/user/watchers/#{username.nil? ? '' : username}", params)
|
70
|
+
end
|
71
|
+
|
72
|
+
# TODO: damntoken, friends/unwatch/{username}, friends/watch/{username}, friends/watching/{username}, profile/update, statuses/post
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
@@ -1,26 +1,8 @@
|
|
1
|
-
|
2
|
-
module Collections
|
3
|
-
# Fetch collection folders
|
4
|
-
def get_collections_folders(username: nil, calculate_size: false, ext_preload: false, offset: 0, limit: 10)
|
5
|
-
params = {}
|
6
|
-
params['username'] = username unless username.nil?
|
7
|
-
params['calculate_size'] = calculate_size if calculate_size
|
8
|
-
params['ext_preload'] = ext_preload if ext_preload
|
9
|
-
params['offset'] = offset if offset != 0
|
10
|
-
params['limit'] = limit if limit != 10
|
11
|
-
perform(:get, '/api/v1/oauth2/collections/folders', params)
|
12
|
-
end
|
13
|
-
|
14
|
-
# Fetch collection folder contents
|
15
|
-
def get_collections(folderid, username: nil, offset: 0, limit: 10)
|
16
|
-
params = {}
|
17
|
-
params['username'] = username unless username.nil?
|
18
|
-
params['offset'] = offset if offset != 0
|
19
|
-
params['limit'] = limit if limit != 10
|
20
|
-
perform(:get, "/api/v1/oauth2/collections/#{folderid}", params)
|
21
|
-
end
|
1
|
+
require 'deviantart/base'
|
22
2
|
|
23
|
-
|
3
|
+
module DeviantArt
|
4
|
+
class Collections < Base
|
5
|
+
attr_accessor :has_more, :next_offset, :name, :results
|
6
|
+
point_to_class [:results, :[]], DeviantArt::Deviation
|
24
7
|
end
|
25
8
|
end
|
26
|
-
|
data/lib/deviantart/data.rb
CHANGED
@@ -1,24 +1,6 @@
|
|
1
|
-
|
2
|
-
module Data
|
3
|
-
# Get a list of countries
|
4
|
-
def get_countries
|
5
|
-
perform(:get, '/api/v1/oauth2/data/countries')
|
6
|
-
end
|
7
|
-
|
8
|
-
# Returns the DeviantArt Privacy Policy
|
9
|
-
def get_privacy
|
10
|
-
perform(:get, '/api/v1/oauth2/data/privacy')
|
11
|
-
end
|
12
|
-
|
13
|
-
# Returns the DeviantArt Submission Policy
|
14
|
-
def get_submission
|
15
|
-
perform(:get, '/api/v1/oauth2/data/submission')
|
16
|
-
end
|
1
|
+
require 'deviantart/base'
|
17
2
|
|
18
|
-
|
19
|
-
|
20
|
-
perform(:get, '/api/v1/oauth2/data/tos')
|
21
|
-
end
|
3
|
+
module DeviantArt
|
4
|
+
class Data < Base
|
22
5
|
end
|
23
6
|
end
|
24
|
-
|
data/lib/deviantart/deviation.rb
CHANGED
@@ -1,30 +1,12 @@
|
|
1
|
-
|
2
|
-
module Deviation
|
3
|
-
# Fetch a deviation details
|
4
|
-
def get_deviation(deviationid)
|
5
|
-
perform(:get, "/api/v1/oauth2/deviation/#{deviationid}")
|
6
|
-
end
|
7
|
-
|
8
|
-
# Fetch full data that is not included in the main devaition details
|
9
|
-
def get_deviation_content(deviationid)
|
10
|
-
perform(:get, '/api/v1/oauth2/deviation/content', { deviationid: deviationid })
|
11
|
-
end
|
12
|
-
|
13
|
-
# Fetch a list of users who faved the deviation
|
14
|
-
def get_deviation_whofaved(deviationid, offset: 0, limit: 10)
|
15
|
-
params = {}
|
16
|
-
params['deviationid'] = deviationid
|
17
|
-
params['offset'] = offset if offset != 0
|
18
|
-
params['limit'] = limit if limit != 10
|
19
|
-
perform(:get, '/api/v1/oauth2/deviation/whofaved', params)
|
20
|
-
end
|
1
|
+
require 'deviantart/base'
|
21
2
|
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
3
|
+
module DeviantArt
|
4
|
+
class Deviation < Base
|
5
|
+
attr_accessor :deviationid, :printid, :url, :title, :category, :category_path, :is_favourited, :is_deleted, :author, :stats
|
6
|
+
attr_accessor :published_time, :allows_comments, :preview, :content, :thumbs, :videos, :flash, :daily_deviation
|
7
|
+
attr_accessor :excerpt, :is_mature, :is_downloadable, :download_filesize, :challenge, :challenge_entry, :motion_book
|
8
|
+
point_to_class [:author], DeviantArt::User
|
9
|
+
point_to_class [:daily_deviation, :giver], DeviantArt::User
|
10
|
+
point_to_class [:daily_deviation, :suggester], DeviantArt::User
|
28
11
|
end
|
29
12
|
end
|
30
|
-
|
data/lib/deviantart/feed.rb
CHANGED
@@ -1,14 +1,6 @@
|
|
1
|
-
|
2
|
-
module Feed
|
3
|
-
# Fetch Watch Feed
|
4
|
-
def get_feed(mature_content: false, cursor: nil)
|
5
|
-
params = {}
|
6
|
-
params['cursor'] = cursor unless cursor.nil?
|
7
|
-
params['mature_content'] = mature_content
|
8
|
-
perform(:get, '/api/v1/oauth2/feed/home', params)
|
9
|
-
end
|
1
|
+
require 'deviantart/base'
|
10
2
|
|
11
|
-
|
3
|
+
module DeviantArt
|
4
|
+
class Feed < Base
|
12
5
|
end
|
13
6
|
end
|
14
|
-
|
@@ -0,0 +1,14 @@
|
|
1
|
+
require 'deviantart/base'
|
2
|
+
|
3
|
+
module DeviantArt
|
4
|
+
class Feed::Home < Base
|
5
|
+
attr_accessor :cursor, :has_more, :items
|
6
|
+
point_to_class [:items, :[], :by_user], DeviantArt::User
|
7
|
+
point_to_class [:items, :[], :deviations, :[]], DeviantArt::Deviation
|
8
|
+
point_to_class [:items, :[], :status], DeviantArt::Status
|
9
|
+
#point_to_class [:items, :[], :comment], DeviantArt::Comment
|
10
|
+
#point_to_class [:items, :[], :comment_parent], DeviantArt::Comment
|
11
|
+
point_to_class [:items, :[], :comment_deviation], DeviantArt::Deviation
|
12
|
+
point_to_class [:items, :[], :comment_profile], DeviantArt::User
|
13
|
+
end
|
14
|
+
end
|
data/lib/deviantart/gallery.rb
CHANGED
@@ -1,41 +1,8 @@
|
|
1
|
-
|
2
|
-
module Gallery
|
3
|
-
# Get the "all" view of a users gallery
|
4
|
-
def get_gallery_all(username: nil, offset: 0, limit: 10)
|
5
|
-
params = {}
|
6
|
-
params['username'] = username unless username.nil?
|
7
|
-
params['offset'] = offset if offset != 0
|
8
|
-
params['limit'] = limit if limit != 10
|
9
|
-
perform(:get, '/api/v1/oauth2/gallery/all', params)
|
10
|
-
end
|
11
|
-
|
12
|
-
# Fetch gallery folders
|
13
|
-
def get_gallery_folders(username: nil, calculate_size: false, ext_preload: false, offset: 0, limit: 10)
|
14
|
-
params = {}
|
15
|
-
params['username'] = username unless username.nil?
|
16
|
-
params['calculate_size'] = calculate_size if calculate_size
|
17
|
-
params['ext_preload'] = ext_preload if ext_preload
|
18
|
-
params['offset'] = offset if offset != 0
|
19
|
-
params['limit'] = limit if limit != 10
|
20
|
-
perform(:get, '/api/v1/oauth2/gallery/folders', params)
|
21
|
-
end
|
22
|
-
|
23
|
-
# Fetch gallery folder contents
|
24
|
-
def get_gallery(username: nil, folderid: nil, mode: nil, offset: 0, limit: 10)
|
25
|
-
params = {}
|
26
|
-
params['username'] = username unless username.nil?
|
27
|
-
params['mode'] = mode unless mode.nil?
|
28
|
-
params['offset'] = offset if offset != 0
|
29
|
-
params['limit'] = limit if limit != 10
|
30
|
-
unless folderid.nil?
|
31
|
-
path = "/api/v1/oauth2/gallery/#{folderid}"
|
32
|
-
else
|
33
|
-
path = '/api/v1/oauth2/gallery/'
|
34
|
-
end
|
35
|
-
perform(:get, path, params)
|
36
|
-
end
|
1
|
+
require 'deviantart/base'
|
37
2
|
|
38
|
-
|
3
|
+
module DeviantArt
|
4
|
+
class Gallery < Base
|
5
|
+
attr_accessor :has_more, :next_offset, :name, :results
|
6
|
+
point_to_class [:results, :[]], DeviantArt::Deviation
|
39
7
|
end
|
40
8
|
end
|
41
|
-
|
@@ -0,0 +1,10 @@
|
|
1
|
+
require 'deviantart/base'
|
2
|
+
|
3
|
+
module DeviantArt
|
4
|
+
class Status < Base
|
5
|
+
attr_accessor :statusid, :body, :ts, :url, :comments_count, :is_share, :is_deleted, :author, :items
|
6
|
+
point_to_class [:author], DeviantArt::User
|
7
|
+
point_to_class [:items, :[], :status], DeviantArt::Status
|
8
|
+
point_to_class [:items, :[], :deviation], DeviantArt::Deviation
|
9
|
+
end
|
10
|
+
end
|
data/lib/deviantart/user.rb
CHANGED
@@ -1,56 +1,8 @@
|
|
1
|
-
|
2
|
-
module User
|
3
|
-
# Get user profile information
|
4
|
-
def get_profile(username, ext_collections: false, ext_galleries: false)
|
5
|
-
params = {}
|
6
|
-
params['ext_collections'] = ext_collections if ext_collections
|
7
|
-
params['ext_galleries'] = ext_galleries if ext_galleries
|
8
|
-
perform(:get, "/api/v1/oauth2/user/profile/#{username.nil? ? '' : username}", params)
|
9
|
-
end
|
10
|
-
|
11
|
-
# Get the users list of friends
|
12
|
-
def get_friends(username, offset: 0, limit: 10)
|
13
|
-
params = {}
|
14
|
-
params['offset'] = offset if offset != 0
|
15
|
-
params['limit'] = limit if limit != 10
|
16
|
-
perform(:get, "/api/v1/oauth2/user/friends/#{username.nil? ? '' : username}", params)
|
17
|
-
end
|
18
|
-
|
19
|
-
# Fetch user info for given usernames
|
20
|
-
def whois(users)
|
21
|
-
params = { usernames: users.is_a?(Enumerable) ? users : [users] }
|
22
|
-
perform(:post, '/api/v1/oauth2/user/whois', params)
|
23
|
-
end
|
24
|
-
|
25
|
-
# Fetch user info of authenticated user
|
26
|
-
def whoami
|
27
|
-
perform(:get, '/api/v1/oauth2/user/whoami?')
|
28
|
-
end
|
29
|
-
|
30
|
-
# Search friends by username
|
31
|
-
def search_friends(query, username: nil)
|
32
|
-
params = {}
|
33
|
-
params['query'] = query
|
34
|
-
params['username'] = username unless username.nil?
|
35
|
-
perform(:get, '/api/v1/oauth2/user/friends/search', params)
|
36
|
-
end
|
1
|
+
require 'deviantart/base'
|
37
2
|
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
params['offset'] = offset if offset != 0
|
43
|
-
params['limit'] = limit if limit != 10
|
44
|
-
perform(:get, '/api/v1/oauth2/user/statuses/', params)
|
45
|
-
end
|
46
|
-
|
47
|
-
def get_status(statusid, mature_content: true)
|
48
|
-
params = {}
|
49
|
-
params['mature_content'] = mature_content
|
50
|
-
perform(:get, "/api/v1/oauth2/user/statuses/#{statusid}", params)
|
51
|
-
end
|
52
|
-
|
53
|
-
# TODO: damntoken, friends/unwatch/{username}, friends/watch/{username}, friends/watching/{username}, profile/update, statuses/post, watchers/{username}
|
3
|
+
module DeviantArt
|
4
|
+
class User < Base
|
5
|
+
attr_accessor :userid, :username, :usericon, :type, :is_watching, :details, :geo, :profile, :stats
|
6
|
+
point_to_class [:profile, :profile_pic], DeviantArt::Deviation
|
54
7
|
end
|
55
8
|
end
|
56
|
-
|
@@ -0,0 +1,11 @@
|
|
1
|
+
require 'deviantart/base'
|
2
|
+
|
3
|
+
module DeviantArt
|
4
|
+
class User::Profile < Base
|
5
|
+
attr_accessor :user, :is_watching, :profile_url, :user_is_artist, :artist_level, :artist_specialty, :real_name, :tagline
|
6
|
+
attr_accessor :countryid, :country, :website, :bio, :cover_photo, :profile_pic, :last_status, :stats, :collections, :galleries
|
7
|
+
point_to_class [:user], DeviantArt::User
|
8
|
+
point_to_class [:profile_pic], DeviantArt::Deviation
|
9
|
+
point_to_class [:last_status], DeviantArt::Status
|
10
|
+
end
|
11
|
+
end
|
data/lib/deviantart/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: deviantart
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Code Ass
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-
|
11
|
+
date: 2016-11-29 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -69,13 +69,39 @@ files:
|
|
69
69
|
- bin/setup
|
70
70
|
- deviantart.gemspec
|
71
71
|
- lib/deviantart.rb
|
72
|
+
- lib/deviantart/base.rb
|
72
73
|
- lib/deviantart/client.rb
|
74
|
+
- lib/deviantart/client/collections.rb
|
75
|
+
- lib/deviantart/client/data.rb
|
76
|
+
- lib/deviantart/client/deviation.rb
|
77
|
+
- lib/deviantart/client/feed.rb
|
78
|
+
- lib/deviantart/client/gallery.rb
|
79
|
+
- lib/deviantart/client/user.rb
|
73
80
|
- lib/deviantart/collections.rb
|
81
|
+
- lib/deviantart/collections/folders.rb
|
74
82
|
- lib/deviantart/data.rb
|
83
|
+
- lib/deviantart/data/countries.rb
|
84
|
+
- lib/deviantart/data/privacy.rb
|
85
|
+
- lib/deviantart/data/submission.rb
|
86
|
+
- lib/deviantart/data/tos.rb
|
75
87
|
- lib/deviantart/deviation.rb
|
88
|
+
- lib/deviantart/deviation/content.rb
|
89
|
+
- lib/deviantart/deviation/download.rb
|
90
|
+
- lib/deviantart/deviation/whofaved.rb
|
91
|
+
- lib/deviantart/error.rb
|
76
92
|
- lib/deviantart/feed.rb
|
93
|
+
- lib/deviantart/feed/home.rb
|
77
94
|
- lib/deviantart/gallery.rb
|
95
|
+
- lib/deviantart/gallery/all.rb
|
96
|
+
- lib/deviantart/gallery/folders.rb
|
97
|
+
- lib/deviantart/status.rb
|
78
98
|
- lib/deviantart/user.rb
|
99
|
+
- lib/deviantart/user/friends.rb
|
100
|
+
- lib/deviantart/user/friends/search.rb
|
101
|
+
- lib/deviantart/user/profile.rb
|
102
|
+
- lib/deviantart/user/statuses.rb
|
103
|
+
- lib/deviantart/user/watchers.rb
|
104
|
+
- lib/deviantart/user/whois.rb
|
79
105
|
- lib/deviantart/version.rb
|
80
106
|
homepage: https://github.com/aycabta/deviantart
|
81
107
|
licenses:
|
@@ -97,7 +123,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
97
123
|
version: '0'
|
98
124
|
requirements: []
|
99
125
|
rubyforge_project:
|
100
|
-
rubygems_version: 2.
|
126
|
+
rubygems_version: 2.5.2
|
101
127
|
signing_key:
|
102
128
|
specification_version: 4
|
103
129
|
summary: deviantART API library
|