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
@@ -0,0 +1,94 @@
1
+ require 'wordpress/base'
2
+ require 'wordpress/request'
3
+ require 'wordpress/ostruct'
4
+ require 'date'
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
@@ -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 'base'
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,62 @@
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.object_from_response(self, request)
28
+ end
29
+ end
30
+
31
+ def save
32
+ raise NotImplementedError
33
+ end
34
+
35
+ def delete
36
+ raise NotImplementedError
37
+ end
38
+
39
+ private
40
+
41
+ def associated_object?(name)
42
+ name = name.to_s
43
+ @response['meta'] && @response['meta']['links'] && @response['meta']['links'].include?(name) && meta_objects.include?(name)
44
+ end
45
+
46
+ def available_object?(name)
47
+ associated_object?(name) || super
48
+ end
49
+
50
+ def get_object(name)
51
+ name = name.to_s
52
+ if associated_object?(name)
53
+ @cached_objects[name] ||= begin
54
+ request = Wordpress::Request.new(:get, meta.links.send(name))
55
+ client.object_from_response(Wordpress::Object.const_get(meta_objects[name]).new(client), request)
56
+ end
57
+ else
58
+ super
59
+ end
60
+ end
61
+ end
62
+ end
@@ -1,12 +1,10 @@
1
- require 'wordpress/object'
2
- require 'wordpress/user'
3
- require 'wordpress/ostruct'
1
+ require_relative 'meta_object'
4
2
 
5
- module Wordpress
6
- class Post < Wordpress::Object
3
+ module Wordpress::Object
4
+ class Post < MetaObject
7
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
8
- attr_parameter :date, :as => lambda { |t| DateTime.iso8601(t) }
9
- attr_parameter :author, :as => Wordpress::User
10
- attr_parameter :meta, :as => Wordpress::OpenStruct
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'
11
9
  end
12
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
@@ -1,7 +1,7 @@
1
- require 'wordpress/object'
1
+ require_relative 'base'
2
2
 
3
- module Wordpress
4
- class Test < Wordpress::Object
3
+ module Wordpress::Object
4
+ class Test < Base
5
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
6
  end
7
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, :avatar_url, :profile_url, :verified
6
+ attr_meta_object :site => 'Site'
7
+ end
8
+ end
@@ -1,62 +1,54 @@
1
1
  require 'wordpress/base'
2
2
 
3
3
  module Wordpress
4
- class OpenStruct < Wordpress::Base
4
+ class OpenStruct < Base
5
5
  def_delegators :@hash, :map, :each
6
6
 
7
- def initialize(hash = {})
8
- @hash = Hash[hash.map do |key, value|
9
- key = key.to_s
10
- unless respond_to?(key)
11
- metaclass.send(:define_method, key, Proc.new do
12
- v = @hash[key]
13
- @hash[key] = (v.is_a?(Hash) ? Wordpress::OpenStruct.new(v) : v)
14
- end)
15
- end
16
- unless respond_to?("#{key}=")
17
- metaclass.send(:define_method, "#{key}=", Proc.new do |v|
18
- @hash[key] = (v.is_a?(Hash) ? Wordpress::OpenStruct.new(v) : v)
19
- @hash[key]
20
- end)
21
- end
22
- [key, (value.is_a?(Hash) ? Wordpress::OpenStruct.new(value) : value)]
23
- end]
24
- end
25
-
26
- =begin
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
+ end
14
+
27
15
  def respond_to_missing?(method_name, include_private = false)
28
- method_name = method_name.to_s
29
- @hash.include?(method_name) || super
16
+ key = method_name.to_s
17
+ @hash.include?(key) || super
30
18
  end
31
- =end
19
+
32
20
  def to_s
33
21
  "#<#{self.class.name} #{map { |k, v| "#{k}=#{v}" }.join(" ")}>"
34
22
  end
35
23
 
36
24
  def [](k)
37
- send(k)
25
+ send(k.to_s)
38
26
  end
39
27
 
40
28
  def []=(k, v)
41
29
  send("#{k}=", v)
42
30
  end
43
31
 
32
+ def to_hash
33
+ @hash
34
+ end
35
+
44
36
  private
45
- =begin
37
+
46
38
  def method_missing(method_name, *args, &block)
47
39
  key = method_name.to_s
48
- if key[-1] == '='
49
- key = key[0..-2]
50
- if @hash.include?(key)
51
- v = args[0]
52
- return @hash[key] = (v.is_a?(Hash) ? Wordpress::OpenStruct.new(v) : v)
53
- end
54
- else
55
- v = @hash[key]
56
- return @hash[key] = (v.is_a?(Hash) ? Wordpress::OpenStruct.new(v) : v)
40
+ key = key[-1] == '=' ? key[0...-1] : key
41
+ if @hash.include?(key)
42
+ metaclass.send(:define_method, key, Proc.new{
43
+ v = @hash[key]
44
+ v.is_a?(Hash) ? Wordpress::OpenStruct.new(v) : v
45
+ })
46
+ metaclass.send(:define_method, "#{key}=", Proc.new{ |v|
47
+ @hash[key] = v
48
+ })
49
+ return send(method_name, *args, &block)
57
50
  end
58
51
  super
59
52
  end
60
- =end
61
53
  end
62
54
  end
@@ -0,0 +1,24 @@
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
+ @params = params.dup
12
+ @body = body.dup
13
+ end
14
+
15
+ def initialize_copy(other)
16
+ other.params = params.dup
17
+ other.body = body.dup
18
+ end
19
+
20
+ def end_point
21
+ END_POINT.freeze
22
+ end
23
+ end
24
+ end
@@ -1,8 +1,8 @@
1
1
  module Wordpress
2
2
  class Version
3
3
  MAJOR = 0 unless defined? Wordpress::Version::MAJOR
4
- MINOR = 0 unless defined? Wordpress::Version::MINOR
5
- PATCH = 6 unless defined? Wordpress::Version::PATCH
4
+ MINOR = 1 unless defined? Wordpress::Version::MINOR
5
+ PATCH = 0 unless defined? Wordpress::Version::PATCH
6
6
  PRE = nil unless defined? Wordpress::Version::PRE
7
7
 
8
8
  class << self
data/spec/spec_helper.rb CHANGED
@@ -1,9 +1,22 @@
1
1
  require 'rubygems'
2
2
  require 'bundler/setup'
3
3
 
4
+ if ENV["COVERAGE"]
5
+ require 'simplecov'
6
+ SimpleCov.start do
7
+ add_filter do |src|
8
+ src.filename !~ /#{File.join(root, 'lib')}\//
9
+ end
10
+ end
11
+ end
12
+
4
13
  require 'wordpress-client'
5
14
 
6
15
  RSpec.configure do |config|
16
+ config.mock_with :rspec
7
17
 
18
+ config.before :each do
19
+ Wordpress.logger = Logger.new("/dev/null")
20
+ end
8
21
  end
9
22
 
@@ -1,7 +1,25 @@
1
1
  require "spec_helper"
2
2
 
3
3
  describe Wordpress do
4
- it "should return client instance" do
5
- Wordpress.client.should be_an_instance_of(Wordpress::Client)
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
6
24
  end
7
25
  end
@@ -2,19 +2,62 @@ require "spec_helper"
2
2
  require "wordpress/base"
3
3
 
4
4
  describe Wordpress::Base do
5
- it 'should overwrite attr_accessor class method' do
6
- klass = Class.new(Wordpress::Base)
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
7
21
  end
8
22
 
9
- it 'should return default value' do
10
- klass = Class.new(Wordpress::Base) do
11
- attr_accessor :key => :default_value
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
12
61
  end
13
- ins = klass.new
14
- ins.key.should == :default_value
15
- ins.key = :new_value
16
- ins.key.should == :new_value
17
- ins.key = nil
18
- ins.key.should be_nil
19
62
  end
20
63
  end