ct_wordpress-client 0.2.8 → 0.2.10

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.
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