wordpress-client 0.0.6 → 0.1.0

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