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.
- checksums.yaml +15 -0
- data/Rakefile +8 -0
- data/lib/faraday_middleware/gzip.rb +22 -0
- data/lib/wordpress-client.rb +2 -4
- data/lib/wordpress/api/comments.rb +6 -6
- data/lib/wordpress/api/me.rb +2 -2
- data/lib/wordpress/api/posts.rb +12 -12
- data/lib/wordpress/api/sites.rb +1 -1
- data/lib/wordpress/api/tests.rb +6 -6
- data/lib/wordpress/api/utils.rb +12 -14
- data/lib/wordpress/base.rb +24 -1
- data/lib/wordpress/client.rb +29 -31
- data/lib/wordpress/configuration.rb +1 -2
- data/lib/wordpress/errors.rb +10 -0
- data/lib/wordpress/object/array.rb +29 -0
- data/lib/wordpress/object/base.rb +94 -0
- data/lib/wordpress/object/comment.rb +11 -0
- data/lib/wordpress/object/comments.rb +8 -0
- data/lib/wordpress/object/meta_object.rb +62 -0
- data/lib/wordpress/{post.rb → object/post.rb} +6 -8
- data/lib/wordpress/object/posts.rb +8 -0
- data/lib/wordpress/object/site.rb +8 -0
- data/lib/wordpress/{test.rb → object/test.rb} +3 -3
- data/lib/wordpress/object/user.rb +8 -0
- data/lib/wordpress/ostruct.rb +28 -36
- data/lib/wordpress/request.rb +24 -0
- data/lib/wordpress/version.rb +2 -2
- data/spec/spec_helper.rb +13 -0
- data/spec/wordpress-client_spec.rb +20 -2
- data/spec/wordpress/base_spec.rb +54 -11
- data/spec/wordpress/client_spec.rb +50 -0
- data/spec/wordpress/object/base_spec.rb +56 -0
- data/spec/wordpress/ostruct_spec.rb +15 -9
- data/spec/wordpress/request_spec.rb +5 -0
- data/wordpress-client.gemspec +4 -3
- metadata +42 -38
- data/lib/wordpress/array.rb +0 -30
- data/lib/wordpress/comment.rb +0 -14
- data/lib/wordpress/comment_array.rb +0 -10
- data/lib/wordpress/like_array.rb +0 -9
- data/lib/wordpress/like_result.rb +0 -9
- data/lib/wordpress/object.rb +0 -34
- data/lib/wordpress/post_array.rb +0 -10
- data/lib/wordpress/site.rb +0 -9
- data/lib/wordpress/user.rb +0 -9
- 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,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
|
-
|
2
|
-
require 'wordpress/user'
|
3
|
-
require 'wordpress/ostruct'
|
1
|
+
require_relative 'meta_object'
|
4
2
|
|
5
|
-
module Wordpress
|
6
|
-
class Post <
|
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 { |
|
9
|
-
attr_parameter :author, :as =>
|
10
|
-
|
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
|
@@ -1,7 +1,7 @@
|
|
1
|
-
|
1
|
+
require_relative 'base'
|
2
2
|
|
3
|
-
module Wordpress
|
4
|
-
class Test <
|
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
|
data/lib/wordpress/ostruct.rb
CHANGED
@@ -1,62 +1,54 @@
|
|
1
1
|
require 'wordpress/base'
|
2
2
|
|
3
3
|
module Wordpress
|
4
|
-
class OpenStruct <
|
4
|
+
class OpenStruct < Base
|
5
5
|
def_delegators :@hash, :map, :each
|
6
6
|
|
7
|
-
def initialize(hash
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
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
|
-
|
29
|
-
@hash.include?(
|
16
|
+
key = method_name.to_s
|
17
|
+
@hash.include?(key) || super
|
30
18
|
end
|
31
|
-
|
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
|
-
|
37
|
+
|
46
38
|
def method_missing(method_name, *args, &block)
|
47
39
|
key = method_name.to_s
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
v =
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
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
|
data/lib/wordpress/version.rb
CHANGED
@@ -1,8 +1,8 @@
|
|
1
1
|
module Wordpress
|
2
2
|
class Version
|
3
3
|
MAJOR = 0 unless defined? Wordpress::Version::MAJOR
|
4
|
-
MINOR =
|
5
|
-
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
|
-
|
5
|
-
|
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
|
data/spec/wordpress/base_spec.rb
CHANGED
@@ -2,19 +2,62 @@ require "spec_helper"
|
|
2
2
|
require "wordpress/base"
|
3
3
|
|
4
4
|
describe Wordpress::Base do
|
5
|
-
|
6
|
-
|
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
|
-
|
10
|
-
|
11
|
-
|
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
|