wordpress-client 0.0.6 → 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (46) hide show
  1. checksums.yaml +15 -0
  2. data/Rakefile +8 -0
  3. data/lib/faraday_middleware/gzip.rb +22 -0
  4. data/lib/wordpress-client.rb +2 -4
  5. data/lib/wordpress/api/comments.rb +6 -6
  6. data/lib/wordpress/api/me.rb +2 -2
  7. data/lib/wordpress/api/posts.rb +12 -12
  8. data/lib/wordpress/api/sites.rb +1 -1
  9. data/lib/wordpress/api/tests.rb +6 -6
  10. data/lib/wordpress/api/utils.rb +12 -14
  11. data/lib/wordpress/base.rb +24 -1
  12. data/lib/wordpress/client.rb +29 -31
  13. data/lib/wordpress/configuration.rb +1 -2
  14. data/lib/wordpress/errors.rb +10 -0
  15. data/lib/wordpress/object/array.rb +29 -0
  16. data/lib/wordpress/object/base.rb +94 -0
  17. data/lib/wordpress/object/comment.rb +11 -0
  18. data/lib/wordpress/object/comments.rb +8 -0
  19. data/lib/wordpress/object/meta_object.rb +62 -0
  20. data/lib/wordpress/{post.rb → object/post.rb} +6 -8
  21. data/lib/wordpress/object/posts.rb +8 -0
  22. data/lib/wordpress/object/site.rb +8 -0
  23. data/lib/wordpress/{test.rb → object/test.rb} +3 -3
  24. data/lib/wordpress/object/user.rb +8 -0
  25. data/lib/wordpress/ostruct.rb +28 -36
  26. data/lib/wordpress/request.rb +24 -0
  27. data/lib/wordpress/version.rb +2 -2
  28. data/spec/spec_helper.rb +13 -0
  29. data/spec/wordpress-client_spec.rb +20 -2
  30. data/spec/wordpress/base_spec.rb +54 -11
  31. data/spec/wordpress/client_spec.rb +50 -0
  32. data/spec/wordpress/object/base_spec.rb +56 -0
  33. data/spec/wordpress/ostruct_spec.rb +15 -9
  34. data/spec/wordpress/request_spec.rb +5 -0
  35. data/wordpress-client.gemspec +4 -3
  36. metadata +42 -38
  37. data/lib/wordpress/array.rb +0 -30
  38. data/lib/wordpress/comment.rb +0 -14
  39. data/lib/wordpress/comment_array.rb +0 -10
  40. data/lib/wordpress/like_array.rb +0 -9
  41. data/lib/wordpress/like_result.rb +0 -9
  42. data/lib/wordpress/object.rb +0 -34
  43. data/lib/wordpress/post_array.rb +0 -10
  44. data/lib/wordpress/site.rb +0 -9
  45. data/lib/wordpress/user.rb +0 -9
  46. data/spec/wordpress/object_spec.rb +0 -31
checksums.yaml ADDED
@@ -0,0 +1,15 @@
1
+ ---
2
+ !binary "U0hBMQ==":
3
+ metadata.gz: !binary |-
4
+ MjczN2E1ZjNkODBlN2NjYjBiYWMyZmI0OWY0MmU3N2IxZWY1OGUzNQ==
5
+ data.tar.gz: !binary |-
6
+ YWI2YzI2YzBhZTJmNDNhZjc1MTQ1YzU4OTE5NGNhZmUyODE2ZmFiNA==
7
+ SHA512:
8
+ metadata.gz: !binary |-
9
+ NDQ5Y2YzYjAzMWZlMDNlYzJiZDgwMWJjODcyM2VmZjdmMGMxZmI1OTdmOWZk
10
+ YmNmZjBlMzEwODM3ZmMxNjJiYTZjZDcyOGJmMTkwMjEyYjgxM2E5YmQxNzU0
11
+ YTk0ODc5NjY2MzAyOGI4ZDQ0NTI4MmMyNzc5ZTUxMDM3NmVmMTQ=
12
+ data.tar.gz: !binary |-
13
+ MWYzNmQ4YTI4OTZiYmRiNTE2NTc5Y2ExNGY0ZDBhZTZkNzUzYjZkNTllMmRk
14
+ M2IzYmFhZGMxMGIwOGY4MDc0OTlkMDFlMjRiNDM0YzNkOTQyOTljNzM0NDU5
15
+ YTk0ODZkNDc2YzlkYzdkNDdmZmExY2VjNTc5ZDIxODEwZTllNDU=
data/Rakefile CHANGED
@@ -3,3 +3,11 @@ require 'rspec/core/rake_task'
3
3
  RSpec::Core::RakeTask.new(:spec)
4
4
 
5
5
  task :default => :spec
6
+
7
+ namespace :spec do
8
+ desc "Execute rspec coverage"
9
+ task :coverage do
10
+ ENV['COVERAGE'] = 'true'
11
+ Rake::Task["spec"].execute
12
+ end
13
+ end
@@ -0,0 +1,22 @@
1
+ require 'faraday'
2
+ require 'zlib'
3
+
4
+ module FaradayMiddleware
5
+ class Gzip < Faraday::Response::Middleware
6
+
7
+ def on_complete(env)
8
+ encoding = env[:response_headers]['content-encoding'].to_s.downcase
9
+ case encoding
10
+ when 'gzip'
11
+ env[:body] = Zlib::GzipReader.new(StringIO.new(env[:body]), encoding: 'ASCII-8BIT').read
12
+ env[:response_headers].delete('content-encoding')
13
+ when 'deflate'
14
+ env[:body] = Zlib::Inflate.inflate(env[:body])
15
+ env[:response_headers].delete('content-encoding')
16
+ end
17
+ end
18
+
19
+ end
20
+ end
21
+
22
+ Faraday::Response.register_middleware :gzip => FaradayMiddleware::Gzip
@@ -3,14 +3,12 @@ require 'wordpress/client'
3
3
 
4
4
  module Wordpress
5
5
  class << self
6
+ attr_writer :logger
7
+
6
8
  def client
7
9
  @client ||= Wordpress::Client.new
8
10
  end
9
11
 
10
- def client?
11
- !!@client
12
- end
13
-
14
12
  def logger
15
13
  @logger ||= Logger.new(STDOUT)
16
14
  end
@@ -7,32 +7,32 @@ module Wordpress
7
7
 
8
8
  def get_comments(site, params = {})
9
9
  validate_params! params, [:context, :type, :status], :search
10
- object_from_response Wordpress::CommentArray, "/sites/#{site}/comments", :get, :query => params
10
+ object_from_response Wordpress::Object::Comments.new(self), Wordpress::Request.new(:get, "/rest/v1/sites/#{site}/comments", params)
11
11
  end
12
12
 
13
13
  def get_post_comments(site, post_id, params = {})
14
14
  validate_params! params, [:context]
15
- object_from_response Wordpress::CommentArray, "/sites/#{site}/posts/#{post_id}/replies", :get, :query => params
15
+ object_from_response Wordpress::Object::Comments.new(self), Wordpress::Request.new(:get, "/rest/v1/sites/#{site}/posts/#{post_id}/replies", params)
16
16
  end
17
17
 
18
18
  def get_comment(site, comment_id, params = {})
19
19
  validate_params! params, [:context]
20
- object_from_response Wordpress::Comment, "/sites/#{site}/comments/#{comment_id}", :get, :query => params
20
+ object_from_response Wordpress::Object::Comment.new(self), Wordpress::Request.new(:get, "/rest/v1/sites/#{site}/comments/#{comment_id}", params)
21
21
  end
22
22
 
23
23
  def update_comment(site, comment_id, data, params = {})
24
24
  validate_params! params, [:context]
25
- object_from_response Wordpress::Comment, "/sites/#{site}/comments/#{comment_id}", :post, :request => data, :query => params
25
+ object_from_response Wordpress::Object::Comment.new(self), Wordpress::Request.new(:post, "/rest/v1/sites/#{site}/comments/#{comment_id}", params, data)
26
26
  end
27
27
 
28
28
  def create_comment(site, post_id, data, params = {})
29
29
  validate_params! params, [:context]
30
- object_from_response Wordpress::Comment, "/sites/#{site}/posts/#{post_id}/replies/new", :post, :request => data, :query => params
30
+ object_from_response Wordpress::Object::Comment.new(self), Wordpress::Request.new(:post, "/rest/v1/sites/#{site}/posts/#{post_id}/replies/new", params, data)
31
31
  end
32
32
 
33
33
  def delete_comment(site, comment_id, params = {})
34
34
  validate_params! params, [:context]
35
- object_from_response Wordpress::Comment, "/sites/#{site}/comments/#{comment_id}/delete", :post, :query => params
35
+ object_from_response Wordpress::Object::Comment.new(self), Wordpress::Request.new(:post, "/rest/v1/sites/#{site}/comments/#{comment_id}/delete", params)
36
36
  end
37
37
  end
38
38
  end
@@ -7,12 +7,12 @@ module Wordpress
7
7
 
8
8
  def me(params = {})
9
9
  validate_params! params
10
- object_from_response Wordpress::User, "/me", :get, :query => params
10
+ object_from_response Wordpress::Object::User.new(self), Wordpress::Request.new(:get, "/rest/v1/me", params)
11
11
  end
12
12
 
13
13
  def get_my_likes(params = {})
14
14
  validate_params! params
15
- object_from_response Wordpress::LikeArray, "/me/likes", :get, :query => params
15
+ object_from_response Wordpress::Ostruct.new, Wordpress::Request.new(:get, "/rest/v1/me/likes", params)
16
16
  end
17
17
  end
18
18
  end
@@ -7,62 +7,62 @@ module Wordpress
7
7
 
8
8
  def get_posts(site, params = {})
9
9
  validate_params! params, [:context, :tag, :category, :type, :status, :sticky, :author, :search, :meta_key, :meta_value], :search
10
- object_from_response Wordpress::PostArray, "/sites/#{site}/posts", :get, :query => params
10
+ object_from_response Wordpress::Object::Posts.new(self), Wordpress::Request.new(:get, "/rest/v1/sites/#{site}/posts", params)
11
11
  end
12
12
 
13
13
  def get_post(site, post_id, params = {})
14
14
  validate_params! params, [:context]
15
- object_from_response Wordpress::Post, "/sites/#{site}/posts/#{post_id}", :get, :query => params
15
+ object_from_response Wordpress::Object::Post.new(self), Wordpress::Request.new(:get, "/rest/v1/sites/#{site}/posts/#{post_id}", params)
16
16
  end
17
17
 
18
18
  def update_post(site, post_id, data, params = {})
19
19
  validate_params! params, [:context]
20
- object_from_response Wordpress::Post, "/sites/#{site}/posts/#{post_id}", :post, :request => data, :query => params
20
+ object_from_response Wordpress::Object::Post.new(self), Wordpress::Request.new(:post, "/rest/v1/sites/#{site}/posts/#{post_id}", params, data)
21
21
  end
22
22
 
23
23
  def get_post_by_slug(site, post_slug, params = {})
24
24
  validate_params! params, [:context]
25
- object_from_response Wordpress::Post, "/sites/#{site}/posts/slug:#{post_slug}", :get, :query => params
25
+ object_from_response Wordpress::Object::Post.new(self), Wordpress::Request.new(:get, "/rest/v1/sites/#{site}/posts/slug:#{post_slug}", params)
26
26
  end
27
27
 
28
28
  def create_post(site, post_id, data, params = {})
29
29
  validate_params! params, [:context]
30
- object_from_response Wordpress::Post, "/sites/#{site}/posts/new", :post, :request => data, :query => params
30
+ object_from_response Wordpress::Object::Post.new(self), Wordpress::Request.new(:post, "/rest/v1/sites/#{site}/posts/new", params, data)
31
31
  end
32
32
 
33
33
  def delete_post(site, post_id, params = {})
34
34
  validate_params! params, [:context]
35
- object_from_response Wordpress::Post, "/sites/#{site}/posts/#{post_id}/delete", :post, :query => params
35
+ object_from_response Wordpress::Object::Post.new(self), Wordpress::Request.new(:post, "/rest/v1/sites/#{site}/posts/#{post_id}/delete", params)
36
36
  end
37
37
 
38
38
  def get_likes(site, post_id, params = {})
39
39
  validate_params! params
40
- object_from_response Wordpress::LikeArray, "/sites/#{site}/posts/#{post_id}/likes", :get, :query => params
40
+ object_from_response Wordpress::Ostruct.new, Wordpress::Request.new(:get, "/rest/v1/sites/#{site}/posts/#{post_id}/likes", params)
41
41
  end
42
42
 
43
43
  def create_like(site, post_id, params = {})
44
44
  validate_params! params
45
- object_from_response Wordpress::OpenStruct, "/sites/#{site}/posts/#{post_id}/likes/new", :post, :query => params
45
+ object_from_response Wordpress::Ostruct.new, Wordpress::Request.new(:post, "/rest/v1/sites/#{site}/posts/#{post_id}/likes/new", params)
46
46
  end
47
47
 
48
48
  def delete_like(site, post_id, params = {})
49
49
  validate_params! params
50
- object_from_response Wordpress::OpenStruct, "/sites/#{site}/posts/#{post_id}/likes/mine/delete", :post, :query => params
50
+ object_from_response Wordpress::Ostruct.new, Wordpress::Request.new(:post, "/rest/v1/sites/#{site}/posts/#{post_id}/likes/mine/delete", params)
51
51
  end
52
52
 
53
53
  def get_like_status(site, post_id, params = {})
54
54
  validate_params! params
55
- object_from_response Wordpress::OpenStruct, "/sites/#{site}/posts/#{post_id}/likes/mine", :get, :query => params
55
+ object_from_response Wordpress::Ostruct.new, Wordpress::Request.new(:get, "/rest/v1/sites/#{site}/posts/#{post_id}/likes/mine", params)
56
56
  end
57
57
 
58
58
  def get_reblog_status(site, post_id, params = {})
59
59
  validate_params! params
60
- object_from_response Wordpress::OpenStruct, "/sites/#{site}/posts/#{post_id}/reblogs/mine", :get, :query => params
60
+ object_from_response Wordpress::Ostruct.new, Wordpress::Request.new(:get, "/rest/v1/sites/#{site}/posts/#{post_id}/reblogs/mine", params)
61
61
  end
62
62
 
63
63
  def create_reblog(site, post_id, data, params = {})
64
64
  validate_params! params
65
- object_from_response Wordpress::OpenStruct, "/sites/#{site}/posts/#{post_id}/reblogs/new", :post, :request => data, :query => params
65
+ object_from_response Wordpress::Ostruct.new, Wordpress::Request.new(:post, "/rest/v1/sites/#{site}/posts/#{post_id}/reblogs/new", params, data)
66
66
  end
67
67
  end
68
68
  end
@@ -7,7 +7,7 @@ module Wordpress
7
7
 
8
8
  def get_site(site, params = {})
9
9
  validate_params! params
10
- object_from_response Wordpress::Site, "/sites/#{site}", :get, :query => params
10
+ object_from_response Wordpress::Object::Site.new(self), Wordpress::Request.new(:get, "/rest/v1/sites/#{site}", params)
11
11
  end
12
12
  end
13
13
  end
@@ -5,14 +5,14 @@ module Wordpress
5
5
  module Tests
6
6
  include Wordpress::API::Utils
7
7
 
8
- def get_test(id, options = {})
9
- validate_options! options, [:id, :default_string, :default_int, :boolean_whitelist_defaults_to_false, :boolean_whitelist_defaults_to_true, :string_whitelist_defaults_to_foo, :url, :datetime], :test
10
- object_from_response Wordpress::Test, "/test/#{id}", :get, options
8
+ def get_test(id, params = {})
9
+ validate_params! params, [:id, :default_string, :default_int, :boolean_whitelist_defaults_to_false, :boolean_whitelist_defaults_to_true, :string_whitelist_defaults_to_foo, :url, :datetime], :test
10
+ object_from_response Wordpress::Object::Test.new(self), Wordpress::Request.new(:get, "/rest/v1/test/#{id}", params)
11
11
  end
12
12
 
13
- def post_test(id, options = {})
14
- validate_options! options, [:id, :default_string, :default_int, :boolean_whitelist_defaults_to_false, :boolean_whitelist_defaults_to_true, :string_whitelist_defaults_to_foo, :url, :datetime], :test
15
- object_from_response Wordpress::Test, "/test/#{id}", :post, options
13
+ def post_test(id, params = {})
14
+ validate_params! params, [:id, :default_string, :default_int, :boolean_whitelist_defaults_to_false, :boolean_whitelist_defaults_to_true, :string_whitelist_defaults_to_foo, :url, :datetime], :test
15
+ object_from_response Wordpress::Object::Test.new(self), Wordpress::Request.new(:post, "/rest/v1/test/#{id}", params)
16
16
  end
17
17
  end
18
18
  end
@@ -1,33 +1,31 @@
1
1
  require 'json'
2
2
  require 'wordpress/errors'
3
3
  require 'wordpress/ostruct'
4
- require 'wordpress/user'
5
- require 'wordpress/site'
6
- require 'wordpress/post'
7
- require 'wordpress/post_array'
8
- require 'wordpress/like_array'
9
- require 'wordpress/comment'
10
- require 'wordpress/test'
4
+ Dir.glob(File.expand_path('../../object/*.rb', __FILE__)) do |path|
5
+ require path
6
+ end
11
7
 
12
8
  module Wordpress
13
9
  module API
14
10
  module Utils
15
- private
16
-
17
- def object_from_response(klass, path, method, params = {})
18
- res = request(method, "/rest/v1#{path}", params, :bearer_token_request => true)
19
- if res
11
+ def object_from_response(obj, request)
12
+ res = call(request, :bearer_token_request => true)
13
+ begin
20
14
  json = MultiJson.load(res)
21
15
  if json.nil? || json == ''
22
16
  raise Wordpress::ResponseError
23
17
  end
24
18
  if !json['error'].nil?
25
- raise Wordpress::ResponseError, json['message']
19
+ raise Wordpress::ResponseError, json
26
20
  end
27
- klass.new(json)
21
+ obj.assign(json)
22
+ rescue MultiJson::LoadError => e
23
+ raise Wordpress::ResponseError, {'error' => e, 'message' => "Can not parse the response: #{res.inspect}"}
28
24
  end
29
25
  end
30
26
 
27
+ private
28
+
31
29
  def validate_params!(params, valid_keys = [], type = nil)
32
30
  valid_keys += [:http_envelope, :pretty, :callback] if type != :test
33
31
  valid_keys += [:number, :offset, :page, :order, :order_by, :after, :before] if type == :search
@@ -2,9 +2,12 @@ module Wordpress
2
2
  class Base
3
3
  extend Forwardable
4
4
 
5
- def_delegators 'Wordpress.logger', :debug, :info, :warn, :error, :fatal
5
+ def_delegators 'Wordpress', :logger
6
+ def_delegators 'logger', :debug, :info, :warn, :error, :fatal
6
7
 
7
8
  class << self
9
+ private
10
+
8
11
  def attr_accessor(*args)
9
12
  if args.size == 1 && args.first.is_a?(Hash)
10
13
  args.first.each do |key, default|
@@ -19,6 +22,26 @@ module Wordpress
19
22
  super
20
23
  end
21
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
22
45
  end
23
46
 
24
47
  def metaclass
@@ -1,50 +1,48 @@
1
1
  require 'wordpress/base'
2
+ require 'wordpress/request'
2
3
  require 'wordpress/api'
3
- require 'curb'
4
+ require 'faraday'
5
+ require 'faraday_middleware/gzip'
6
+ require 'multi_json'
4
7
 
5
8
  module Wordpress
6
- class Client < Wordpress::Base
9
+ class Client < Base
7
10
  include Wordpress::API
8
11
 
9
12
  attr_accessor :access_token
10
- attr_accessor :end_point => "https://public-api.wordpress.com/"
11
13
 
12
- private
13
-
14
- def request(method, path, params = {}, options = {})
15
- query_params = params[:query] || {}
16
- request_params = params[:request] || {}
17
- uri = end_point + (end_point[-1] == '/' ? '' : '/') + path.sub(/^[\/]+/, '')
18
- uri += "?#{query_params.map{ |k, v| "#{k}=#{v}" }.join('&')}" if !query_params.empty?
14
+ def initialize
15
+ @conn = Faraday.new do |faraday|
16
+ faraday.use Faraday::Response::Logger, logger
17
+ faraday.request :url_encoded
18
+ faraday.response :gzip
19
+ faraday.adapter Faraday.default_adapter
20
+ end
21
+ end
19
22
 
20
- debug <<-EOS
21
- Request Dump
22
- Method : #{method}
23
- Path : #{uri}
24
- Parameters : #{request_params.inspect}
25
- EOS
23
+ def call(request, options = {})
24
+ debug "Request: #{request}"
26
25
 
27
- http = Curl.send(method, uri, request_params) do |http|
26
+ response = @conn.send(request.method) do |req|
27
+ req.url request.url
28
+ req.params = request.params
29
+ req.body = request.body.to_s
28
30
  if options.delete(:bearer_token_request) && !access_token.nil?
29
- http.headers['Authorization'] = bearer_auth_header
31
+ req.headers['Authorization'] = bearer_auth_header
30
32
  end
31
- http.headers['Accept-Encoding'] = 'gzip,deflate'
32
- http.timeout = 10
33
+ req.headers['Accept-Encoding'] = 'gzip,deflate'
34
+ req.headers['Content-Type'] = 'application/json'
35
+ req.options[:timeout] = 10
36
+ req.options[:open_timeout] = 5
33
37
  end
34
- begin
35
- res = Zlib::GzipReader.new(StringIO.new(http.body_str)).read
36
- rescue Zlib::GzipFile::Error
37
- res = http.body_str
38
- end
39
-
40
- debug <<-EOS
41
- Response Dump
42
- Content : #{res}
43
- EOS
44
38
 
45
- res
39
+ debug "Response: #{response.body}"
40
+
41
+ response.body
46
42
  end
47
43
 
44
+ private
45
+
48
46
  def bearer_auth_header
49
47
  "Bearer #{access_token}"
50
48
  end
@@ -1,5 +1,4 @@
1
1
  module Wordpress
2
- class Configuration < Hash
3
-
2
+ class Configuration
4
3
  end
5
4
  end
@@ -1,4 +1,14 @@
1
1
  module Wordpress
2
2
  class ResponseError < StandardError
3
+ attr_reader :error, :message
4
+
5
+ def initialize(json = {})
6
+ @error = json['error'] || 'unknown'
7
+ @message = json['message']
8
+ end
9
+
10
+ def to_s
11
+ @message
12
+ end
3
13
  end
4
14
  end
@@ -0,0 +1,29 @@
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
+ @array_name = name
13
+ attr_parameter name, :as => lambda{ |client, array|
14
+ (array || []).map{ |v|
15
+ Wordpress::Object.const_get(klass).new(client, v)
16
+ }
17
+ }
18
+ end
19
+ end
20
+
21
+ def [](k)
22
+ if k.is_a?(Fixnum) && array_name.to_s != ''
23
+ send(array_name)[k]
24
+ else
25
+ send(k)
26
+ end
27
+ end
28
+ end
29
+ end