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.
Files changed (53) hide show
  1. checksums.yaml +15 -0
  2. data/.coveralls.yml +1 -0
  3. data/.gitignore +24 -0
  4. data/.travis.yml +8 -0
  5. data/CONTRIBUTING.md +16 -0
  6. data/Gemfile +3 -0
  7. data/LICENSE +20 -0
  8. data/README.md +80 -0
  9. data/Rakefile +5 -0
  10. data/lib/faraday_middleware/gzip.rb +22 -0
  11. data/lib/wordpress-client.rb +43 -0
  12. data/lib/wordpress/api.rb +62 -0
  13. data/lib/wordpress/api/comments.rb +48 -0
  14. data/lib/wordpress/api/follow.rb +20 -0
  15. data/lib/wordpress/api/freshly_pressed.rb +10 -0
  16. data/lib/wordpress/api/me.rb +18 -0
  17. data/lib/wordpress/api/media.rb +15 -0
  18. data/lib/wordpress/api/notifications.rb +25 -0
  19. data/lib/wordpress/api/oauth.rb +22 -0
  20. data/lib/wordpress/api/posts.rb +79 -0
  21. data/lib/wordpress/api/sites.rb +12 -0
  22. data/lib/wordpress/api/taxonomy.rb +45 -0
  23. data/lib/wordpress/api/tests.rb +25 -0
  24. data/lib/wordpress/base.rb +51 -0
  25. data/lib/wordpress/client.rb +68 -0
  26. data/lib/wordpress/configuration.rb +6 -0
  27. data/lib/wordpress/errors.rb +25 -0
  28. data/lib/wordpress/object/array.rb +30 -0
  29. data/lib/wordpress/object/base.rb +94 -0
  30. data/lib/wordpress/object/comment.rb +11 -0
  31. data/lib/wordpress/object/comments.rb +8 -0
  32. data/lib/wordpress/object/media.rb +7 -0
  33. data/lib/wordpress/object/meta_object.rb +65 -0
  34. data/lib/wordpress/object/oauth.rb +7 -0
  35. data/lib/wordpress/object/post.rb +10 -0
  36. data/lib/wordpress/object/posts.rb +8 -0
  37. data/lib/wordpress/object/site.rb +8 -0
  38. data/lib/wordpress/object/test.rb +7 -0
  39. data/lib/wordpress/object/user.rb +8 -0
  40. data/lib/wordpress/ostruct.rb +64 -0
  41. data/lib/wordpress/request.rb +29 -0
  42. data/lib/wordpress/version.rb +14 -0
  43. data/spec/spec_helper.rb +15 -0
  44. data/spec/wordpress-client_spec.rb +25 -0
  45. data/spec/wordpress/api_spec.rb +90 -0
  46. data/spec/wordpress/base_spec.rb +63 -0
  47. data/spec/wordpress/client_spec.rb +91 -0
  48. data/spec/wordpress/object/base_spec.rb +56 -0
  49. data/spec/wordpress/object/meta_object_spec.rb +20 -0
  50. data/spec/wordpress/ostruct_spec.rb +58 -0
  51. data/spec/wordpress/request_spec.rb +15 -0
  52. data/wordpress-client.gemspec +26 -0
  53. 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,6 @@
1
+ require 'wordpress/ostruct'
2
+
3
+ module Wordpress
4
+ class Configuration < OpenStruct
5
+ end
6
+ 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