ct_wordpress-client 0.2.8 → 0.2.10
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +15 -0
- data/.coveralls.yml +1 -0
- data/.gitignore +24 -0
- data/.travis.yml +8 -0
- data/CONTRIBUTING.md +16 -0
- data/Gemfile +3 -0
- data/LICENSE +20 -0
- data/README.md +80 -0
- data/Rakefile +5 -0
- data/lib/faraday_middleware/gzip.rb +22 -0
- data/lib/wordpress-client.rb +43 -0
- data/lib/wordpress/api.rb +62 -0
- data/lib/wordpress/api/comments.rb +48 -0
- data/lib/wordpress/api/follow.rb +20 -0
- data/lib/wordpress/api/freshly_pressed.rb +10 -0
- data/lib/wordpress/api/me.rb +18 -0
- data/lib/wordpress/api/media.rb +15 -0
- data/lib/wordpress/api/notifications.rb +25 -0
- data/lib/wordpress/api/oauth.rb +22 -0
- data/lib/wordpress/api/posts.rb +79 -0
- data/lib/wordpress/api/sites.rb +12 -0
- data/lib/wordpress/api/taxonomy.rb +45 -0
- data/lib/wordpress/api/tests.rb +25 -0
- data/lib/wordpress/base.rb +51 -0
- data/lib/wordpress/client.rb +68 -0
- data/lib/wordpress/configuration.rb +6 -0
- data/lib/wordpress/errors.rb +25 -0
- data/lib/wordpress/object/array.rb +30 -0
- data/lib/wordpress/object/base.rb +94 -0
- data/lib/wordpress/object/comment.rb +11 -0
- data/lib/wordpress/object/comments.rb +8 -0
- data/lib/wordpress/object/media.rb +7 -0
- data/lib/wordpress/object/meta_object.rb +65 -0
- data/lib/wordpress/object/oauth.rb +7 -0
- data/lib/wordpress/object/post.rb +10 -0
- data/lib/wordpress/object/posts.rb +8 -0
- data/lib/wordpress/object/site.rb +8 -0
- data/lib/wordpress/object/test.rb +7 -0
- data/lib/wordpress/object/user.rb +8 -0
- data/lib/wordpress/ostruct.rb +64 -0
- data/lib/wordpress/request.rb +29 -0
- data/lib/wordpress/version.rb +14 -0
- data/spec/spec_helper.rb +15 -0
- data/spec/wordpress-client_spec.rb +25 -0
- data/spec/wordpress/api_spec.rb +90 -0
- data/spec/wordpress/base_spec.rb +63 -0
- data/spec/wordpress/client_spec.rb +91 -0
- data/spec/wordpress/object/base_spec.rb +56 -0
- data/spec/wordpress/object/meta_object_spec.rb +20 -0
- data/spec/wordpress/ostruct_spec.rb +58 -0
- data/spec/wordpress/request_spec.rb +15 -0
- data/wordpress-client.gemspec +26 -0
- metadata +158 -90
@@ -0,0 +1,22 @@
|
|
1
|
+
require "wordpress/ostruct"
|
2
|
+
require "wordpress/object/oauth"
|
3
|
+
module Wordpress::API
|
4
|
+
module Oauth
|
5
|
+
def get_token(params = {})
|
6
|
+
validate_keys! params, [:client_id, :client_secret, :code, :grant_type, :redirect_uri] + default_keys
|
7
|
+
exec_api(Wordpress::Request.new(:post, "oauth2/token",nil, params )) do |json|
|
8
|
+
Wordpress::Object::Oauth.new(self, json)
|
9
|
+
end
|
10
|
+
|
11
|
+
end
|
12
|
+
|
13
|
+
def token_info(params = {})
|
14
|
+
validate_keys! params, [:client_id, :token] + default_keys
|
15
|
+
exec_api(Wordpress::Request.new(:get, "oauth2/token-info",params, )) do |json|
|
16
|
+
Wordpress::Object::Oauth.new(self, json)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
@@ -0,0 +1,79 @@
|
|
1
|
+
require "wordpress/ostruct"
|
2
|
+
require "wordpress/object/posts"
|
3
|
+
require "wordpress/object/post"
|
4
|
+
|
5
|
+
module Wordpress::API
|
6
|
+
module Posts
|
7
|
+
def get_posts(site, params = {})
|
8
|
+
validate_keys! params, [:context, :tag, :category, :type, :status, :sticky, :author, :search, :meta_key, :meta_value] + default_keys + search_keys
|
9
|
+
exec_api(Wordpress::Request.new(:get, "/rest/v1.1/sites/#{site}/posts", params)) do |json|
|
10
|
+
Wordpress::Object::Posts.new(self, json)
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
def get_post(site, post_id, params = {})
|
15
|
+
validate_keys! params, [:context] + default_keys
|
16
|
+
exec_api(Wordpress::Request.new(:get, "/rest/v1.1/sites/#{site}/posts/#{post_id}", params)) do |json|
|
17
|
+
Wordpress::Object::Post.new(self, json)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
def update_post(site, post_id, data, params = {})
|
22
|
+
validate_keys! params, [:context] + default_keys
|
23
|
+
exec_api(Wordpress::Request.new(:post, "/rest/v1.1/sites/#{site}/posts/#{post_id}", params, data)) do |json|
|
24
|
+
Wordpress::Object::Post.new(self, json)
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
def get_post_by_slug(site, slug, params = {})
|
29
|
+
validate_keys! params, [:context] + default_keys
|
30
|
+
exec_api(Wordpress::Request.new(:get, "/rest/v1.1/sites/#{site}/posts/slug:#{slug}", params)) do |json|
|
31
|
+
Wordpress::Object::Post.new(self, json)
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
def create_post(site, data, params = {})
|
36
|
+
validate_keys! params, [:context] + default_keys
|
37
|
+
exec_api(Wordpress::Request.new(:post, "/rest/v1.1/sites/#{site}/posts/new", params, data)) do |json|
|
38
|
+
Wordpress::Object::Post.new(self, json)
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
def delete_post(site, post_id, data, params = {})
|
43
|
+
validate_keys! params, [:context] + default_keys
|
44
|
+
exec_api(Wordpress::Request.new(:post, "/rest/v1.1/sites/#{site}/posts/#{post_id}/delete", params, data)) do |json|
|
45
|
+
Wordpress::Object::Post.new(self, json)
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
def get_likes(site, post_id, params = {})
|
50
|
+
validate_keys! params, default_keys
|
51
|
+
exec_api(Wordpress::Request.new(:get, "/rest/v1.1/sites/#{site}/posts/#{post_id}/likes", params))
|
52
|
+
end
|
53
|
+
|
54
|
+
def create_like(site, post_id, data, params = {})
|
55
|
+
validate_keys! params, default_keys
|
56
|
+
exec_api(Wordpress::Request.new(:post, "/rest/v1.1/sites/#{site}/posts/#{post_id}/likes/new", params, data))
|
57
|
+
end
|
58
|
+
|
59
|
+
def delete_like(site, post_id, data, params = {})
|
60
|
+
validate_keys! params, default_keys
|
61
|
+
exec_api(Wordpress::Request.new(:post, "/rest/v1.1/sites/#{site}/posts/#{post_id}/likes/mine/delete", params, data))
|
62
|
+
end
|
63
|
+
|
64
|
+
def get_like_status(site, post_id, params = {})
|
65
|
+
validate_keys! params, default_keys
|
66
|
+
exec_api(Wordpress::Request.new(:get, "/rest/v1.1/sites/#{site}/posts/#{post_id}/likes/mine", params))
|
67
|
+
end
|
68
|
+
|
69
|
+
def get_reblog_status(site, post_id, params = {})
|
70
|
+
validate_keys! params, default_keys
|
71
|
+
exec_api(Wordpress::Request.new(:get, "/rest/v1.1/sites/#{site}/posts/#{post_id}/reblogs/mine", params))
|
72
|
+
end
|
73
|
+
|
74
|
+
def create_reblog(site, post_id, data, params = {})
|
75
|
+
validate_keys! params, default_keys
|
76
|
+
exec_api(Wordpress::Request.new(:post, "/rest/v1.1/sites/#{site}/posts/#{post_id}/reblogs/new", params, data))
|
77
|
+
end
|
78
|
+
end
|
79
|
+
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
require "wordpress/object/site"
|
2
|
+
|
3
|
+
module Wordpress::API
|
4
|
+
module Sites
|
5
|
+
def get_site(site, params = {})
|
6
|
+
validate_keys! params, default_keys
|
7
|
+
exec_api(Wordpress::Request.new(:get, "/rest/v1.1/sites/#{site}", params)) do |json|
|
8
|
+
Wordpress::Object::Site.new(self, json)
|
9
|
+
end
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
@@ -0,0 +1,45 @@
|
|
1
|
+
require "wordpress/ostruct"
|
2
|
+
|
3
|
+
module Wordpress::API
|
4
|
+
module Taxonomy
|
5
|
+
def get_category(site, slug, params = {})
|
6
|
+
validate_keys! params, [:context] + default_keys
|
7
|
+
exec_api(Wordpress::Request.new(:get, "/rest/v1.1/sites/#{site}/categories/slug:#{slug}", params))
|
8
|
+
end
|
9
|
+
|
10
|
+
def update_category(site, slug, data, params = {})
|
11
|
+
validate_keys! params, [:context] + default_keys
|
12
|
+
exec_api(Wordpress::Request.new(:post, "/rest/v1.1/sites/#{site}/categories/slug:#{slug}", params, data))
|
13
|
+
end
|
14
|
+
|
15
|
+
def get_tag(site, slug, params = {})
|
16
|
+
validate_keys! params, [:context] + default_keys
|
17
|
+
exec_api(Wordpress::Request.new(:get, "/rest/v1.1/sites/#{site}/tags/slug:#{slug}", params))
|
18
|
+
end
|
19
|
+
|
20
|
+
def update_tag(site, slug, data, params = {})
|
21
|
+
validate_keys! params, [:context] + default_keys
|
22
|
+
exec_api(Wordpress::Request.new(:post, "/rest/v1.1/sites/#{site}/tags/slug:#{slug}", params, data))
|
23
|
+
end
|
24
|
+
|
25
|
+
def create_category(site, data, params = {})
|
26
|
+
validate_keys! params, [:context] + default_keys
|
27
|
+
exec_api(Wordpress::Request.new(:post, "/rest/v1.1/sites/#{site}/categories/new", params, data))
|
28
|
+
end
|
29
|
+
|
30
|
+
def create_tag(site, data, params = {})
|
31
|
+
validate_keys! params, [:context] + default_keys
|
32
|
+
exec_api(Wordpress::Request.new(:post, "/rest/v1.1/sites/#{site}/tags/new", params, data))
|
33
|
+
end
|
34
|
+
|
35
|
+
def delete_category(site, slug, data, params = {})
|
36
|
+
validate_keys! params, [:context] + default_keys
|
37
|
+
exec_api(Wordpress::Request.new(:post, "/rest/v1.1/sites/#{site}/categories/slug:#{slug}/delete", params, data))
|
38
|
+
end
|
39
|
+
|
40
|
+
def delete_tag(site, slug, data, params = {})
|
41
|
+
validate_keys! params, [:context] + default_keys
|
42
|
+
exec_api(Wordpress::Request.new(:post, "/rest/v1.1/sites/#{site}/tags/slug:#{slug}/delete", params, data))
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
require "wordpress/object/test"
|
2
|
+
|
3
|
+
module Wordpress::API
|
4
|
+
module Tests
|
5
|
+
def get_test(id, params = {})
|
6
|
+
validate_keys! params, test_keys
|
7
|
+
exec_api(Wordpress::Request.new(:get, "/rest/v1.1/test/#{id}", params)) do |json|
|
8
|
+
Wordpress::Object::Test.new(self, json)
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
def post_test(id, data, params = {})
|
13
|
+
validate_keys! params, test_keys
|
14
|
+
exec_api(Wordpress::Request.new(:post, "/rest/v1.1/test/#{id}", params, data)) do |json|
|
15
|
+
Wordpress::Object::Test.new(self, json)
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
private
|
20
|
+
|
21
|
+
def test_keys
|
22
|
+
[:id, :default_string, :default_int, :boolean_whitelist_defaults_to_false, :boolean_whitelist_defaults_to_true, :string_whitelist_defaults_to_foo, :url, :datetime].freeze
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,51 @@
|
|
1
|
+
module Wordpress
|
2
|
+
class Base
|
3
|
+
extend Forwardable
|
4
|
+
|
5
|
+
def_delegators 'Wordpress', :logger
|
6
|
+
def_delegators 'logger', :debug, :info, :warn, :error, :fatal
|
7
|
+
|
8
|
+
class << self
|
9
|
+
private
|
10
|
+
|
11
|
+
def attr_accessor(*args)
|
12
|
+
if args.size == 1 && args.first.is_a?(Hash)
|
13
|
+
args.first.each do |key, default|
|
14
|
+
define_method key do
|
15
|
+
instance_variable_defined?("@#{key}") ? instance_variable_get("@#{key}") : default
|
16
|
+
end
|
17
|
+
define_method "#{key}=" do |value|
|
18
|
+
instance_variable_set("@#{key}", value)
|
19
|
+
end
|
20
|
+
end
|
21
|
+
else
|
22
|
+
super
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
def class_attribute(*args)
|
27
|
+
args.each do |arg|
|
28
|
+
class_eval <<-EOS
|
29
|
+
class << self
|
30
|
+
def #{arg}
|
31
|
+
@#{arg}
|
32
|
+
end
|
33
|
+
|
34
|
+
def #{arg}=(v)
|
35
|
+
@#{arg} = v
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
def #{arg}
|
40
|
+
self.class.#{arg}
|
41
|
+
end
|
42
|
+
EOS
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
def metaclass
|
48
|
+
class << self; self; end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
@@ -0,0 +1,68 @@
|
|
1
|
+
require 'multi_json'
|
2
|
+
require 'faraday'
|
3
|
+
require 'faraday_middleware/gzip'
|
4
|
+
require_relative 'base'
|
5
|
+
require_relative 'request'
|
6
|
+
require_relative 'api'
|
7
|
+
require_relative 'errors'
|
8
|
+
require_relative 'configuration'
|
9
|
+
|
10
|
+
module Wordpress
|
11
|
+
class Client < Base
|
12
|
+
include Wordpress::API
|
13
|
+
|
14
|
+
attr_accessor :access_token
|
15
|
+
|
16
|
+
def initialize
|
17
|
+
@conn = Faraday.new do |faraday|
|
18
|
+
faraday.use Faraday::Response::Logger, logger
|
19
|
+
faraday.request :multipart
|
20
|
+
faraday.request :url_encoded
|
21
|
+
faraday.response :gzip
|
22
|
+
faraday.adapter Faraday.default_adapter
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
def call(request, options = {})
|
27
|
+
debug "Request: #{request.inspect}"
|
28
|
+
|
29
|
+
response = @conn.send(request.method) do |req|
|
30
|
+
|
31
|
+
case req.method
|
32
|
+
when :delete, :get
|
33
|
+
req.url(request.url, request.params)
|
34
|
+
when :put, :post
|
35
|
+
req.path = request.url
|
36
|
+
req.body = request.body unless request.body.empty?
|
37
|
+
end
|
38
|
+
|
39
|
+
|
40
|
+
if options[:bearer_token_request] && !bearer_auth_header.nil?
|
41
|
+
req.headers['Authorization'] = bearer_auth_header
|
42
|
+
end
|
43
|
+
req.headers['Accept-Encoding'] = 'gzip,deflate'
|
44
|
+
req.options[:timeout] = 10
|
45
|
+
req.options[:open_timeout] = 5
|
46
|
+
end
|
47
|
+
|
48
|
+
begin
|
49
|
+
json = MultiJson.load(response.body)
|
50
|
+
if json.nil? || json == ''
|
51
|
+
raise Wordpress::ResponseError
|
52
|
+
end
|
53
|
+
rescue MultiJson::LoadError => e
|
54
|
+
raise Wordpress::ResponseError, {'error' => e, 'message' => "Can not parse the response: #{response.body.inspect}"}
|
55
|
+
end
|
56
|
+
|
57
|
+
debug "Response: #{json}"
|
58
|
+
|
59
|
+
json
|
60
|
+
end
|
61
|
+
|
62
|
+
private
|
63
|
+
|
64
|
+
def bearer_auth_header
|
65
|
+
access_token.nil? ? nil : "Bearer #{access_token}"
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
module Wordpress
|
2
|
+
class Error < ::StandardError
|
3
|
+
attr_reader :message
|
4
|
+
|
5
|
+
def initialize(message = nil)
|
6
|
+
@message = message
|
7
|
+
end
|
8
|
+
|
9
|
+
def to_s
|
10
|
+
@message
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
class ResponseError < Error
|
15
|
+
attr_reader :error
|
16
|
+
|
17
|
+
def initialize(json = {})
|
18
|
+
@error = json['error'] || 'unknown'
|
19
|
+
super json['message']
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
class ArgumentError < Error
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
require_relative 'base'
|
2
|
+
|
3
|
+
module Wordpress::Object
|
4
|
+
class Array < Base
|
5
|
+
class_attribute :array_name
|
6
|
+
|
7
|
+
class << self
|
8
|
+
private
|
9
|
+
|
10
|
+
def attr_array(name, klass)
|
11
|
+
name = name.to_s
|
12
|
+
self.array_name = name
|
13
|
+
def_delegators name, 'each', 'map', 'select', 'reject', 'find', 'find_all', 'any?', 'all?', 'size'
|
14
|
+
attr_parameter name, :as => lambda{ |client, array|
|
15
|
+
(array || []).map{ |v|
|
16
|
+
Wordpress::Object.const_get(klass).new(client, v)
|
17
|
+
}
|
18
|
+
}
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
def [](k)
|
23
|
+
if k.is_a?(Fixnum) && array_name.to_s != ''
|
24
|
+
send(array_name)[k]
|
25
|
+
else
|
26
|
+
send(k)
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,94 @@
|
|
1
|
+
require 'date'
|
2
|
+
require 'wordpress/base'
|
3
|
+
require 'wordpress/request'
|
4
|
+
require 'wordpress/ostruct'
|
5
|
+
|
6
|
+
module Wordpress::Object
|
7
|
+
class Base < Wordpress::Base
|
8
|
+
attr_reader :client, :request
|
9
|
+
|
10
|
+
class << self
|
11
|
+
def options
|
12
|
+
@options ||= {}
|
13
|
+
end
|
14
|
+
|
15
|
+
private
|
16
|
+
|
17
|
+
def attr_parameter(*args)
|
18
|
+
opt = args[-1].is_a?(Hash) ? args.pop : {}
|
19
|
+
args.each do |arg|
|
20
|
+
options[arg.to_s] = opt.dup
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
def initialize(client = Wordpress.client, response = {})
|
26
|
+
@client = client
|
27
|
+
assign(response)
|
28
|
+
end
|
29
|
+
|
30
|
+
def assign(response)
|
31
|
+
@response = Hash[response.map{ |k, v| [k.to_s.downcase, v] }]
|
32
|
+
self
|
33
|
+
end
|
34
|
+
|
35
|
+
def [](name)
|
36
|
+
name = name.to_s
|
37
|
+
get_object(name) if available_object?(name)
|
38
|
+
end
|
39
|
+
|
40
|
+
def to_hash
|
41
|
+
@response.dup
|
42
|
+
end
|
43
|
+
|
44
|
+
def respond_to_missing?(method_name, include_private = false)
|
45
|
+
name = method_name.to_s
|
46
|
+
is_setter = name.to_s[-1] == '=' ? !!name.pop : false
|
47
|
+
(is_setter && available_object?(name[0..-1])) || available_object?(name) || super
|
48
|
+
end
|
49
|
+
|
50
|
+
private
|
51
|
+
|
52
|
+
def method_missing(method_name, *arguments, &block)
|
53
|
+
name = method_name.to_s
|
54
|
+
is_setter = name.to_s[-1] == '='
|
55
|
+
if is_setter
|
56
|
+
return set_object(name[0...-1], *arguments) if available_object?(name[0...-1])
|
57
|
+
else
|
58
|
+
return get_object(name) if available_object?(name)
|
59
|
+
end
|
60
|
+
super(method_name, *arguments, &block)
|
61
|
+
end
|
62
|
+
|
63
|
+
def available_object?(name)
|
64
|
+
name = name.to_s
|
65
|
+
options.include?(name)
|
66
|
+
end
|
67
|
+
|
68
|
+
def get_object(name)
|
69
|
+
name = name.to_s
|
70
|
+
v = @response[name]
|
71
|
+
if options && options[name] && (as = options[name][:as])
|
72
|
+
if as.is_a?(Proc)
|
73
|
+
as.call(client, v)
|
74
|
+
elsif as.is_a?(String)
|
75
|
+
Wordpress::Object.const_get(as).new(client, v)
|
76
|
+
else
|
77
|
+
as.new(v)
|
78
|
+
end
|
79
|
+
elsif v.is_a?(Hash)
|
80
|
+
Wordpress::OpenStruct.new(v)
|
81
|
+
else
|
82
|
+
v
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
86
|
+
def set_object(name, v)
|
87
|
+
@response[name] = v
|
88
|
+
end
|
89
|
+
|
90
|
+
def options
|
91
|
+
self.class.options.freeze
|
92
|
+
end
|
93
|
+
end
|
94
|
+
end
|