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,11 @@
1
+ require_relative 'meta_object'
2
+
3
+ module Wordpress::Object
4
+ class Comment < MetaObject
5
+ attr_parameter :id, :url, :short_url, :content, :status, :parent, :string
6
+ attr_parameter :date, :as => lambda { |c, v| DateTime.iso8601(v) }
7
+ attr_parameter :post, :as => 'Post'
8
+ attr_parameter :author, :as => 'User'
9
+ attr_meta_object :site => 'Site', :post => 'Post', :replies => 'Comments'
10
+ end
11
+ end
@@ -0,0 +1,8 @@
1
+ require_relative 'array'
2
+
3
+ module Wordpress::Object
4
+ class Comments < Array
5
+ attr_parameter :found
6
+ attr_array :comments, 'Comment'
7
+ end
8
+ end
@@ -0,0 +1,7 @@
1
+ require_relative 'meta_object'
2
+
3
+ module Wordpress::Object
4
+ class Media < MetaObject
5
+ attr_parameter :media, :errors
6
+ end
7
+ end
@@ -0,0 +1,65 @@
1
+ require_relative 'base'
2
+
3
+ module Wordpress::Object
4
+ class MetaObject < Base
5
+ class_attribute :meta_objects
6
+
7
+ class << self
8
+ def inherited(base)
9
+ base.class_eval do
10
+ attr_parameter :meta
11
+ end
12
+ end
13
+
14
+ def attr_meta_object(params)
15
+ self.meta_objects = (meta_objects || {}).merge(Hash[params.map{ |k, v| [k.to_s, v] }])
16
+ end
17
+ end
18
+
19
+ def assign(response)
20
+ @cached_objects = {}
21
+ super
22
+ end
23
+
24
+ def reload
25
+ if meta && meta.links && meta.links.self
26
+ request = Wordpress::Request.new(:get, meta.links.self)
27
+ client.exec_api(request) do |json|
28
+ self.assign(json)
29
+ end
30
+ end
31
+ end
32
+
33
+ def save
34
+ raise NotImplementedError
35
+ end
36
+
37
+ def delete
38
+ raise NotImplementedError
39
+ end
40
+
41
+ private
42
+
43
+ def associated_object?(name)
44
+ name = name.to_s
45
+ @response['meta'] && @response['meta']['links'] && @response['meta']['links'].include?(name) && meta_objects.include?(name)
46
+ end
47
+
48
+ def available_object?(name)
49
+ associated_object?(name) || super
50
+ end
51
+
52
+ def get_object(name)
53
+ name = name.to_s
54
+ if associated_object?(name)
55
+ @cached_objects[name] ||= begin
56
+ request = Wordpress::Request.new(:get, meta.links.send(name))
57
+ json = client.call(request)
58
+ Wordpress::Object.const_get(meta_objects[name]).new(client, json)
59
+ end
60
+ else
61
+ super
62
+ end
63
+ end
64
+ end
65
+ end
@@ -0,0 +1,7 @@
1
+ require_relative 'meta_object'
2
+
3
+ module Wordpress::Object
4
+ class Oauth < MetaObject
5
+ attr_parameter :access_token, :token_type, :blog_id, :blog_url
6
+ end
7
+ end
@@ -0,0 +1,10 @@
1
+ require_relative 'meta_object'
2
+
3
+ module Wordpress::Object
4
+ class Post < MetaObject
5
+ attr_parameter :id, :modified, :title, :url, :short_url, :content, :excerpt, :slug, :status, :password, :parent, :type, :comments_open, :pings_open, :comment_count, :like_count, :i_like, :is_reblogged, :is_following, :featured_image, :format, :geo, :publicize_urls, :tags, :categories, :attachments, :metadata
6
+ attr_parameter :date, :as => lambda { |c, v| DateTime.iso8601(v) }
7
+ attr_parameter :author, :as => 'User'
8
+ attr_meta_object :site => 'Site', :replies => 'Comments'
9
+ end
10
+ end
@@ -0,0 +1,8 @@
1
+ require_relative 'array'
2
+
3
+ module Wordpress::Object
4
+ class Posts < Array
5
+ attr_parameter :found
6
+ attr_array :posts, 'Post'
7
+ end
8
+ end
@@ -0,0 +1,8 @@
1
+ require_relative 'meta_object'
2
+
3
+ module Wordpress::Object
4
+ class Site < MetaObject
5
+ attr_parameter :id, :name, :description, :url, :jetpack, :post_count, :lang
6
+ attr_meta_object :posts => 'Posts', :comments => 'Comments'
7
+ end
8
+ end
@@ -0,0 +1,7 @@
1
+ require_relative 'base'
2
+
3
+ module Wordpress::Object
4
+ class Test < Base
5
+ attr_parameter :method_id_matches_query_id, :method_id, :id, :default_string, :default_int, :boolean_whitelist_defaults_to_false, :boolean_whitelist_defaults_to_true, :string_whitelist_defaults_to_foo, :url, :datetime
6
+ end
7
+ end
@@ -0,0 +1,8 @@
1
+ require_relative 'meta_object'
2
+
3
+ module Wordpress::Object
4
+ class User < MetaObject
5
+ attr_parameter :id, :display_name, :username, :email, :primary_blog, :token_site_id, :avatar_url, :profile_url, :verified
6
+ attr_meta_object :site => 'Site'
7
+ end
8
+ end
@@ -0,0 +1,64 @@
1
+ require 'wordpress/base'
2
+
3
+ module Wordpress
4
+ class OpenStruct < Base
5
+ def_delegators :@hash, :map, :each, :any?, :all?, :size
6
+
7
+ def initialize(hash = {})
8
+ assign(hash)
9
+ end
10
+
11
+ def assign(hash = {})
12
+ @hash = Hash[hash.map{ |k, v| [k.to_s, v] }]
13
+ self
14
+ end
15
+
16
+ def respond_to_missing?(method_name, include_private = false)
17
+ key = method_name.to_s
18
+ if @hash.include?(key)
19
+ define_accessor(key)
20
+ else
21
+ super
22
+ end
23
+ end
24
+
25
+ def to_s
26
+ "#<#{self.class.name} #{@hash.keys.map{ |k| "#{k}=#{send(k).to_s}" }.join(" ")}>"
27
+ end
28
+
29
+ def [](k)
30
+ send(k.to_s)
31
+ end
32
+
33
+ def []=(k, v)
34
+ send("#{k}=", v)
35
+ end
36
+
37
+ def to_hash
38
+ @hash
39
+ end
40
+
41
+ private
42
+
43
+ def method_missing(method_name, *args, &block)
44
+ key = method_name.to_s
45
+ key = key[-1] == '=' ? key[0...-1] : key
46
+ if @hash.include?(key)
47
+ define_accessor(key)
48
+ send(method_name, *args, &block)
49
+ else
50
+ super
51
+ end
52
+ end
53
+
54
+ def define_accessor(key)
55
+ metaclass.send(:define_method, key, Proc.new{
56
+ v = @hash[key]
57
+ v.is_a?(Hash) ? Wordpress::OpenStruct.new(v) : v
58
+ })
59
+ metaclass.send(:define_method, "#{key}=", Proc.new{ |v|
60
+ @hash[key] = v
61
+ })
62
+ end
63
+ end
64
+ end
@@ -0,0 +1,29 @@
1
+ require 'uri'
2
+
3
+ module Wordpress
4
+ class Request < Base
5
+ END_POINT = "https://public-api.wordpress.com/"
6
+ attr_accessor :method, :url, :params, :body
7
+
8
+ def initialize(method, url, params = {}, body = {})
9
+ @method = method
10
+ @url = URI.join(end_point, url).to_s
11
+ if params
12
+ @params = params.dup
13
+ end
14
+
15
+ if body
16
+ @body = body.dup
17
+ end
18
+ end
19
+
20
+ def initialize_copy(other)
21
+ other.params = params.dup
22
+ other.body = body.dup
23
+ end
24
+
25
+ def end_point
26
+ END_POINT.freeze
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,14 @@
1
+ module Wordpress
2
+ class Version
3
+ MAJOR = 0 unless defined? Wordpress::Version::MAJOR
4
+ MINOR = 2 unless defined? Wordpress::Version::MINOR
5
+ PATCH = 10 unless defined? Wordpress::Version::PATCH
6
+ PRE = nil unless defined? Wordpress::Version::PRE
7
+
8
+ class << self
9
+ def to_s
10
+ [MAJOR, MINOR, PATCH, PRE].compact.join('.')
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,15 @@
1
+ require 'rubygems'
2
+ require 'bundler/setup'
3
+ require 'coveralls'
4
+ Coveralls.wear!
5
+
6
+ require 'wordpress-client'
7
+
8
+ RSpec.configure do |config|
9
+ config.mock_with :rspec
10
+
11
+ config.before :each do
12
+ Wordpress.logger = Logger.new("/dev/null")
13
+ end
14
+ end
15
+
@@ -0,0 +1,25 @@
1
+ require "spec_helper"
2
+
3
+ describe Wordpress do
4
+ describe "client" do
5
+ it "should return client instance" do
6
+ Wordpress.client.should be_an_instance_of(Wordpress::Client)
7
+ end
8
+
9
+ it "should return the same instance" do
10
+ client = Wordpress.client
11
+ Wordpress.client.should === client
12
+ end
13
+ end
14
+
15
+ describe "logger" do
16
+ it "should have default logger" do
17
+ Wordpress.logger.should be_an(Logger)
18
+ end
19
+
20
+ it "should have accessor" do
21
+ Wordpress.logger = 'logger'
22
+ Wordpress.logger.should == 'logger'
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,90 @@
1
+ require "spec_helper"
2
+ require 'wordpress/api'
3
+
4
+ describe Wordpress::API do
5
+ let :client do
6
+ Wordpress::Client.new
7
+ end
8
+
9
+ describe "\#exec_api" do
10
+ it "should raise error for error response" do
11
+ client.stub(:call).and_return({'error' => 'something wrong!'})
12
+ expect {
13
+ client.exec_api(nil)
14
+ }.to raise_error(Wordpress::ResponseError)
15
+ end
16
+ end
17
+
18
+ {
19
+ # Me
20
+ 'me' => {:args => [], :method => :get, :url => '/rest/v1/me', :response => Wordpress::Object::User},
21
+ 'get_my_likes' => {:args => [], :method => :get, :url => '/rest/v1/me/likes', :response => Wordpress::OpenStruct},
22
+ # Posts
23
+ 'get_posts' => {:args => ['sitename'], :method => :get, :url => '/rest/v1/sites/sitename/posts', :response => Wordpress::Object::Posts},
24
+ 'get_post' => {:args => ['sitename', 1], :method => :get, :url => '/rest/v1/sites/sitename/posts/1', :response => Wordpress::Object::Post},
25
+ 'update_post' => {:args => ['sitename', 1, {}], :method => :post, :url => '/rest/v1/sites/sitename/posts/1', :response => Wordpress::Object::Post},
26
+ 'get_post_by_slug' => {:args => ['sitename', 1], :method => :get, :url => '/rest/v1/sites/sitename/posts/slug:1', :response => Wordpress::Object::Post},
27
+ 'create_post' => {:args => ['sitename', {}], :method => :post, :url => '/rest/v1/sites/sitename/posts/new', :response => Wordpress::Object::Post},
28
+ 'delete_post' => {:args => ['sitename', 1, {}], :method => :post, :url => '/rest/v1/sites/sitename/posts/1/delete', :response => Wordpress::Object::Post},
29
+ 'get_likes' => {:args => ['sitename', 1], :method => :get, :url => '/rest/v1/sites/sitename/posts/1/likes', :response => Wordpress::OpenStruct},
30
+ 'create_like' => {:args => ['sitename', 1, {}], :method => :post, :url => '/rest/v1/sites/sitename/posts/1/likes/new', :response => Wordpress::OpenStruct},
31
+ 'delete_like' => {:args => ['sitename', 1, {}], :method => :post, :url => '/rest/v1/sites/sitename/posts/1/likes/mine/delete', :response => Wordpress::OpenStruct},
32
+ 'get_like_status' => {:args => ['sitename', 1], :method => :get, :url => '/rest/v1/sites/sitename/posts/1/likes/mine', :response => Wordpress::OpenStruct},
33
+ 'get_reblog_status' => {:args => ['sitename', 1], :method => :get, :url => '/rest/v1/sites/sitename/posts/1/reblogs/mine', :response => Wordpress::OpenStruct},
34
+ 'create_reblog' => {:args => ['sitename', 1, {}], :method => :post, :url => '/rest/v1/sites/sitename/posts/1/reblogs/new', :response => Wordpress::OpenStruct},
35
+ # Sites
36
+ 'get_site' => {:args => ['sitename'], :method => :get, :url => '/rest/v1/sites/sitename', :response => Wordpress::Object::Site},
37
+ # Comments
38
+ 'get_comments' => {:args => ['sitename'], :method => :get, :url => '/rest/v1/sites/sitename/comments', :response => Wordpress::Object::Comments},
39
+ 'get_post_comments' => {:args => ['sitename', 1], :method => :get, :url => '/rest/v1/sites/sitename/posts/1/replies', :response => Wordpress::Object::Comments},
40
+ 'get_comment' => {:args => ['sitename', 1], :method => :get, :url => '/rest/v1/sites/sitename/comments/1', :response => Wordpress::Object::Comment},
41
+ 'update_comment' => {:args => ['sitename', 1, {}], :method => :post, :url => '/rest/v1/sites/sitename/comments/1', :response => Wordpress::Object::Comment},
42
+ 'create_comment' => {:args => ['sitename', 1, {}], :method => :post, :url => '/rest/v1/sites/sitename/posts/1/replies/new', :response => Wordpress::Object::Comment},
43
+ 'delete_comment' => {:args => ['sitename', 1, {}], :method => :post, :url => '/rest/v1/sites/sitename/comments/1/delete', :response => Wordpress::Object::Comment},
44
+ # Tests
45
+ 'get_test' => {:args => [1], :method => :get, :url => '/rest/v1/test/1', :response => Wordpress::Object::Test},
46
+ 'post_test' => {:args => [1, {}], :method => :post, :url => '/rest/v1/test/1', :response => Wordpress::Object::Test},
47
+ # Taxonomy
48
+ 'get_category' => {:args => ['sitename', 'cat_name'], :method => :get, :url => '/rest/v1/sites/sitename/categories/slug:cat_name', :response => Wordpress::OpenStruct},
49
+ 'update_category' => {:args => ['sitename', 'cat_name', {}], :method => :post, :url => '/rest/v1/sites/sitename/categories/slug:cat_name', :response => Wordpress::OpenStruct},
50
+ 'get_tag' => {:args => ['sitename', 'tag_name'], :method => :get, :url => '/rest/v1/sites/sitename/tags/slug:tag_name', :response => Wordpress::OpenStruct},
51
+ 'update_tag' => {:args => ['sitename', 'tag_name', {}], :method => :post, :url => '/rest/v1/sites/sitename/tags/slug:tag_name', :response => Wordpress::OpenStruct},
52
+ 'create_category' => {:args => ['sitename', {}], :method => :post, :url => '/rest/v1/sites/sitename/categories/new', :response => Wordpress::OpenStruct},
53
+ 'create_tag' => {:args => ['sitename', {}], :method => :post, :url => '/rest/v1/sites/sitename/tags/new', :response => Wordpress::OpenStruct},
54
+ 'delete_category' => {:args => ['sitename', 'cat_name', {}], :method => :post, :url => '/rest/v1/sites/sitename/categories/slug:cat_name/delete', :response => Wordpress::OpenStruct},
55
+ 'delete_tag' => {:args => ['sitename', 'tag_name', {}], :method => :post, :url => '/rest/v1/sites/sitename/tags/slug:tag_name/delete', :response => Wordpress::OpenStruct},
56
+ # Follow
57
+ 'create_follow' => {:args => ['sitename', {}], :method => :post, :url => '/rest/v1/sites/sitename/follows/new', :response => Wordpress::OpenStruct},
58
+ 'delete_follow' => {:args => ['sitename', {}], :method => :post, :url => '/rest/v1/sites/sitename/follows/mine/delete', :response => Wordpress::OpenStruct},
59
+ 'get_follow' => {:args => ['sitename'], :method => :get, :url => '/rest/v1/sites/sitename/follows/mine', :response => Wordpress::OpenStruct},
60
+ # FreshlyPressed
61
+ 'freshly_pressed' => {:method => :get, :url => '/rest/v1/freshly-pressed', :response => Wordpress::OpenStruct},
62
+ # Notifications
63
+ 'get_notifications' => {:method => :get, :url => '/rest/v1/notifications', :response => Wordpress::OpenStruct},
64
+ 'get_notification' => {:args => [1], :method => :get, :url => '/rest/v1/notifications/1', :response => Wordpress::OpenStruct},
65
+ 'see_notifications' => {:args => [{}], :method => :post, :url => '/rest/v1/notifications/seen', :response => Wordpress::OpenStruct},
66
+ 'read_notifications' => {:args => [{}], :method => :post, :url => '/rest/v1/notifications/read', :response => Wordpress::OpenStruct},
67
+ }.each do |method, params|
68
+ describe "\##{method}" do
69
+ it "should return #{params[:response].name}" do
70
+ request = Wordpress::Request.new(params[:method], params[:url])
71
+ client.stub(:call).and_return({})
72
+ client.should_receive(:call).with do |*args|
73
+ req = args.shift
74
+ req.method.should == request.method
75
+ req.url.should == request.url
76
+ end
77
+ obj = client.send(method, *params[:args])
78
+ obj.should be_an(params[:response])
79
+ end
80
+
81
+ it "should raise error with invalid parameter" do
82
+ expect {
83
+ args = [method, *params[:args]]
84
+ args << {:invalid_key => 1}
85
+ obj = client.send(*args)
86
+ }.to raise_error(Wordpress::ArgumentError)
87
+ end
88
+ end
89
+ end
90
+ end
@@ -0,0 +1,63 @@
1
+ require "spec_helper"
2
+ require "wordpress/base"
3
+
4
+ describe Wordpress::Base do
5
+ describe "attr_accessor class method" do
6
+ it 'should overwrite attr_accessor class method' do
7
+ klass = Class.new(Wordpress::Base)
8
+ end
9
+
10
+ it 'should return default value' do
11
+ klass = Class.new(Wordpress::Base) do
12
+ attr_accessor :key => :default_value
13
+ end
14
+ ins = klass.new
15
+ ins.key.should == :default_value
16
+ ins.key = :new_value
17
+ ins.key.should == :new_value
18
+ ins.key = nil
19
+ ins.key.should be_nil
20
+ end
21
+ end
22
+
23
+ describe "logger instance" do
24
+ let :instance do
25
+ Wordpress::Base.new
26
+ end
27
+
28
+ it "should have logger accessor" do
29
+ instance.should respond_to(:logger)
30
+ end
31
+
32
+ it "should have logger method accessor" do
33
+ instance.should respond_to(:debug)
34
+ instance.should respond_to(:info)
35
+ instance.should respond_to(:warn)
36
+ instance.should respond_to(:error)
37
+ instance.should respond_to(:fatal)
38
+ end
39
+ end
40
+
41
+ describe "class_attribute" do
42
+
43
+ it "should define class attribute" do
44
+ klass1 = Class.new(Wordpress::Base) do
45
+ class_attribute :boo
46
+ end
47
+ klass1.boo = 1
48
+ klass2 = Class.new(klass1)
49
+ klass2.boo = 2
50
+ klass1.boo.should == 1
51
+ klass2.boo.should == 2
52
+ end
53
+
54
+ it "should define reader instance method to get the class attribute" do
55
+ klass1 = Class.new(Wordpress::Base) do
56
+ class_attribute :boo
57
+ end
58
+ klass1.boo = 1
59
+ klass1.boo.should == 1
60
+ klass1.new.boo.should == 1
61
+ end
62
+ end
63
+ end