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