yandex-webmaster 0.1.1
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.
- data/.document +5 -0
- data/Gemfile +23 -0
- data/Gemfile.lock +72 -0
- data/LICENSE.txt +20 -0
- data/README.md +259 -0
- data/Rakefile +46 -0
- data/lib/yandex-webmaster.rb +80 -0
- data/lib/yandex-webmaster/api/attributes.rb +23 -0
- data/lib/yandex-webmaster/api/attributes/accessor_builder.rb +59 -0
- data/lib/yandex-webmaster/api/attributes/reader_builder.rb +35 -0
- data/lib/yandex-webmaster/api/attributes/types/base.rb +27 -0
- data/lib/yandex-webmaster/api/attributes/types/boolean.rb +22 -0
- data/lib/yandex-webmaster/api/attributes/types/date.rb +17 -0
- data/lib/yandex-webmaster/api/attributes/types/date_time.rb +17 -0
- data/lib/yandex-webmaster/api/attributes/types/float.rb +17 -0
- data/lib/yandex-webmaster/api/attributes/types/integer.rb +17 -0
- data/lib/yandex-webmaster/api/attributes/types/symbol.rb +17 -0
- data/lib/yandex-webmaster/api/attributes/types/time.rb +17 -0
- data/lib/yandex-webmaster/api/attributes/writer_builder.rb +36 -0
- data/lib/yandex-webmaster/api/attributes_builder.rb +65 -0
- data/lib/yandex-webmaster/api_factory.rb +32 -0
- data/lib/yandex-webmaster/authorization.rb +59 -0
- data/lib/yandex-webmaster/base.rb +120 -0
- data/lib/yandex-webmaster/client.rb +16 -0
- data/lib/yandex-webmaster/configuration.rb +99 -0
- data/lib/yandex-webmaster/connection.rb +87 -0
- data/lib/yandex-webmaster/core_ext/array.rb +23 -0
- data/lib/yandex-webmaster/core_ext/class.rb +55 -0
- data/lib/yandex-webmaster/core_ext/date.rb +7 -0
- data/lib/yandex-webmaster/core_ext/date_time.rb +7 -0
- data/lib/yandex-webmaster/core_ext/hash.rb +92 -0
- data/lib/yandex-webmaster/core_ext/nil_class.rb +7 -0
- data/lib/yandex-webmaster/core_ext/object.rb +19 -0
- data/lib/yandex-webmaster/core_ext/string.rb +23 -0
- data/lib/yandex-webmaster/errors.rb +23 -0
- data/lib/yandex-webmaster/host.rb +220 -0
- data/lib/yandex-webmaster/hosts/crawling.rb +26 -0
- data/lib/yandex-webmaster/hosts/sitemap.rb +73 -0
- data/lib/yandex-webmaster/hosts/sitemap_info.rb +55 -0
- data/lib/yandex-webmaster/hosts/top_info.rb +19 -0
- data/lib/yandex-webmaster/hosts/verification.rb +81 -0
- data/lib/yandex-webmaster/request.rb +62 -0
- data/lib/yandex-webmaster/request/oauth2.rb +28 -0
- data/lib/yandex-webmaster/response/hashify.rb +59 -0
- data/lib/yandex-webmaster/version.rb +14 -0
- data/test/helper.rb +18 -0
- data/test/test_webmaster.rb +7 -0
- data/yandex-webmaster.gemspec +167 -0
- metadata +546 -0
@@ -0,0 +1,19 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
class Object
|
4
|
+
def blank?
|
5
|
+
!self
|
6
|
+
end unless method_defined? :blank?
|
7
|
+
|
8
|
+
def present?
|
9
|
+
!blank?
|
10
|
+
end unless method_defined? :present?
|
11
|
+
|
12
|
+
def try(*a, &b)
|
13
|
+
if a.empty? && block_given?
|
14
|
+
yield self
|
15
|
+
else
|
16
|
+
__send__(*a, &b)
|
17
|
+
end
|
18
|
+
end unless method_defined? :try?
|
19
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
class String # :nodoc:
|
4
|
+
def underscore
|
5
|
+
self.gsub(/::/, '/').
|
6
|
+
gsub(/([A-Z]+)([A-Z][a-z])/,'\1_\2').
|
7
|
+
gsub(/([a-z\d])([A-Z])/,'\1_\2').
|
8
|
+
tr("-", "_").
|
9
|
+
downcase
|
10
|
+
end unless method_defined?(:underscore)
|
11
|
+
|
12
|
+
def camelize
|
13
|
+
self.split(/[^a-z0-9]/i).map{|w| w.capitalize}.join
|
14
|
+
end unless method_defined?(:camelize)
|
15
|
+
|
16
|
+
def demodulize
|
17
|
+
if i = self.rindex('::')
|
18
|
+
self[(i+2)..-1]
|
19
|
+
else
|
20
|
+
self
|
21
|
+
end
|
22
|
+
end unless method_defined?(:demodulize)
|
23
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
module Yandex
|
4
|
+
module Webmaster
|
5
|
+
module Errors
|
6
|
+
class WebmasterError < StandardError
|
7
|
+
attr_reader :data
|
8
|
+
|
9
|
+
def initialize(data)
|
10
|
+
@data = data
|
11
|
+
super
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
class UnauthorizedError < WebmasterError; end
|
16
|
+
class GeneralError < WebmasterError; end
|
17
|
+
class AccessDeniedError < WebmasterError; end
|
18
|
+
class NoTokenError < WebmasterError; end
|
19
|
+
class NotFoundError < WebmasterError; end
|
20
|
+
class ResourceError < WebmasterError; end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,220 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
require 'forwardable'
|
4
|
+
|
5
|
+
module Yandex
|
6
|
+
module Webmaster
|
7
|
+
class Host < Base
|
8
|
+
extend Forwardable
|
9
|
+
|
10
|
+
define_attributes :as => 'api_attributes' do
|
11
|
+
attr :href, String, :writer => :protected
|
12
|
+
attr :name, String, :writer => :protected
|
13
|
+
attr :virused, Boolean, :writer => :protected
|
14
|
+
attr :last_access, DateTime, :writer => :protected
|
15
|
+
attr :tcy, Integer, :writer => :protected
|
16
|
+
|
17
|
+
attr :url_count, Integer, :writer => :protected
|
18
|
+
attr :url_errors, Integer, :writer => :protected
|
19
|
+
|
20
|
+
attr :index_count, Integer, :writer => :protected
|
21
|
+
attr :last_week_index_urls, Array, :writer => :protected
|
22
|
+
|
23
|
+
attr :internal_links_count, Integer, :writer => :protected
|
24
|
+
|
25
|
+
attr :links_count, Integer, :writer => :protected
|
26
|
+
attr :last_week_links, Array, :writer => :protected
|
27
|
+
|
28
|
+
attr :total_shows_count, Integer, :writer => :protected
|
29
|
+
attr :top_shows_percent, Float, :writer => :protected
|
30
|
+
attr :top_shows, Array, :writer => :protected
|
31
|
+
|
32
|
+
attr :total_clicks_count, Integer, :writer => :protected
|
33
|
+
attr :top_clicks_percent, Float, :writer => :protected
|
34
|
+
attr :top_clicks, Array, :writer => :protected
|
35
|
+
|
36
|
+
attr :verification, Yandex::Webmaster::Hosts::Verification, :writer => :protected
|
37
|
+
attr :crawling, Yandex::Webmaster::Hosts::Crawling, :writer => :protected
|
38
|
+
|
39
|
+
attr :sitemaps, Array, :writer => :protected
|
40
|
+
end
|
41
|
+
|
42
|
+
delegate :verified? => :verification
|
43
|
+
|
44
|
+
def self.create(name, factory)
|
45
|
+
xml = "<host><name>#{name}</name></host>"
|
46
|
+
response = factory.request(:post, '/hosts', xml)
|
47
|
+
if response.status.to_i == 201
|
48
|
+
self.new({
|
49
|
+
:href => response.headers['Location'],
|
50
|
+
:configuration => factory.configuration
|
51
|
+
})
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
# Id of the host
|
56
|
+
# @return [Integer]
|
57
|
+
#
|
58
|
+
def id
|
59
|
+
return @id if defined?(@id)
|
60
|
+
@id = self.href.match(/\/(\d+)\z/)[1].to_i
|
61
|
+
end
|
62
|
+
|
63
|
+
# Load information about resources that are available for the host
|
64
|
+
# @return [Hash]
|
65
|
+
#
|
66
|
+
def resources
|
67
|
+
return @resources if defined?(@resources)
|
68
|
+
|
69
|
+
@resources = self.fetch_value(self.request(:get, self.href), :link).inject({}) do |h, resource|
|
70
|
+
h[resource[:rel].underscore.to_sym] = resource[:href]; h
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
# Delete information about the host from Yandex.Webmaster
|
75
|
+
# [RU] http://api.yandex.ru/webmaster/doc/dg/reference/hosts-delete.xml
|
76
|
+
# [EN] http://api.yandex.com/webmaster/doc/dg/reference/hosts-delete.xml
|
77
|
+
#
|
78
|
+
def delete
|
79
|
+
response = self.request(:delete, self.href)
|
80
|
+
@deleted = true if response.status.to_i == 204
|
81
|
+
self
|
82
|
+
end
|
83
|
+
|
84
|
+
# @return [Boolean]
|
85
|
+
#
|
86
|
+
def deleted?
|
87
|
+
!!@deleted
|
88
|
+
end
|
89
|
+
|
90
|
+
# Load information about verification for the host
|
91
|
+
#
|
92
|
+
def verify(type)
|
93
|
+
self.validate_resource!(:verify_host)
|
94
|
+
|
95
|
+
status = self.verification.run(type)
|
96
|
+
@verification = nil
|
97
|
+
|
98
|
+
status
|
99
|
+
end
|
100
|
+
|
101
|
+
# Information about verification for the host
|
102
|
+
# @return [Yandex::Webmaster::Hosts::Verification]
|
103
|
+
# [RU] http://api.yandex.ru/webmaster/doc/dg/reference/hosts-verify.xml
|
104
|
+
# [EN] http://api.yandex.com/webmaster/doc/dg/reference/hosts-verify.xml
|
105
|
+
def verification(reload = false)
|
106
|
+
self.load_verification if reload || @verification.nil?
|
107
|
+
@verification
|
108
|
+
end
|
109
|
+
|
110
|
+
def load_verification
|
111
|
+
self.validate_resource!(:verify_host)
|
112
|
+
|
113
|
+
self.verification = self.fetch_value(self.request(:get, self.resources[:verify_host]), :verification)
|
114
|
+
self
|
115
|
+
end
|
116
|
+
|
117
|
+
# Load stats for the host
|
118
|
+
# @return [Yandex::Webmaster::Host]
|
119
|
+
# [RU] http://api.yandex.ru/webmaster/doc/dg/reference/hosts-stats.xml
|
120
|
+
# [EN] http://api.yandex.com/webmaster/doc/dg/reference/hosts-stats.xml
|
121
|
+
#
|
122
|
+
def load_stats
|
123
|
+
self.validate_resource!(:host_information)
|
124
|
+
|
125
|
+
self.attributes = self.request(:get, self.resources[:host_information]).body
|
126
|
+
self
|
127
|
+
end
|
128
|
+
|
129
|
+
# Load information about indexed urls for the host
|
130
|
+
# @return [Yandex::Webmaster::Host]
|
131
|
+
# [RU] http://api.yandex.ru/webmaster/doc/dg/reference/hosts-indexed.xml
|
132
|
+
# [EN] http://api.yandex.com/webmaster/doc/dg/reference/hosts-indexed.xml
|
133
|
+
#
|
134
|
+
def load_indexed_urls
|
135
|
+
self.validate_resource!(:indexed_urls)
|
136
|
+
|
137
|
+
self.attributes = self.request(:get, self.resources[:indexed_urls]).body
|
138
|
+
self
|
139
|
+
end
|
140
|
+
|
141
|
+
# Load information about incoming links for the host
|
142
|
+
# @return [Yandex::Webmaster::Host]
|
143
|
+
# [RU] http://api.yandex.ru/webmaster/doc/dg/reference/host-links.xml
|
144
|
+
# [EN] http://api.yandex.com/webmaster/doc/dg/reference/host-links.xml
|
145
|
+
#
|
146
|
+
def load_incoming_links
|
147
|
+
self.validate_resource!(:incoming_links)
|
148
|
+
|
149
|
+
self.attributes = self.request(:get, self.resources[:incoming_links]).body
|
150
|
+
self
|
151
|
+
end
|
152
|
+
|
153
|
+
# Load information about top queries for the host
|
154
|
+
# @return [Yandex::Webmaster::Host]
|
155
|
+
# [RU] http://api.yandex.ru/webmaster/doc/dg/reference/host-tops.xml
|
156
|
+
# [EN] http://api.yandex.com/webmaster/doc/dg/reference/host-tops.xml
|
157
|
+
#
|
158
|
+
def load_top_queries
|
159
|
+
self.validate_resource!(:top_queries)
|
160
|
+
|
161
|
+
self.attributes = self.fetch_value(self.request(:get, self.resources[:top_queries]), :top_queries)
|
162
|
+
self
|
163
|
+
end
|
164
|
+
|
165
|
+
# Get(load) list of sitemap files for the host
|
166
|
+
# @return [Yandex::Webmaster::Host]
|
167
|
+
# [RU] http://api.yandex.ru/webmaster/doc/dg/reference/sitemaps.xml
|
168
|
+
# [EN] http://api.yandex.com/webmaster/doc/dg/reference/sitemaps.xml
|
169
|
+
#
|
170
|
+
def sitemaps(reload = false)
|
171
|
+
self.load_sitemaps if reload || @sitemaps.nil?
|
172
|
+
@sitemaps
|
173
|
+
end
|
174
|
+
|
175
|
+
def load_sitemaps
|
176
|
+
self.validate_resource!(:sitemaps)
|
177
|
+
|
178
|
+
self.sitemaps = self.fetch_value(self.request(:get, self.resources[:sitemaps]), :sitemap)
|
179
|
+
self
|
180
|
+
end
|
181
|
+
|
182
|
+
protected
|
183
|
+
|
184
|
+
def validate_resource!(resource)
|
185
|
+
unless self.resources.keys.include?(resource)
|
186
|
+
raise Yandex::Webmaster::Errors::ResourceError.new("Resource '#{resource.to_s}' is not available for the host")
|
187
|
+
end
|
188
|
+
end
|
189
|
+
|
190
|
+
def verification=(value)
|
191
|
+
@verification = value.is_a?(Yandex::Webmaster::Hosts::Verification) ? value : Yandex::Webmaster::Hosts::Verification.new(value)
|
192
|
+
@verification.host = self
|
193
|
+
@verification.configuration = self.configuration
|
194
|
+
@verification
|
195
|
+
end
|
196
|
+
|
197
|
+
def crawling=(value)
|
198
|
+
@crawling = Yandex::Webmaster::Hosts::Crawling.new(value)
|
199
|
+
@crawling.host = self
|
200
|
+
@crawling.configuration = self.configuration
|
201
|
+
@crawling
|
202
|
+
end
|
203
|
+
|
204
|
+
def top_shows=(value)
|
205
|
+
array = value.is_a?(Hash) ? value[:top_info] : value
|
206
|
+
@top_shows = self.objects_from_array(Yandex::Webmaster::Hosts::TopInfo, array)
|
207
|
+
end
|
208
|
+
|
209
|
+
def top_clicks=(value)
|
210
|
+
array = value.is_a?(Hash) ? value[:top_info] : value
|
211
|
+
@top_clicks = self.objects_from_array(Yandex::Webmaster::Hosts::TopInfo, array)
|
212
|
+
end
|
213
|
+
|
214
|
+
def sitemaps=(value)
|
215
|
+
array = Array.wrap(value).flatten
|
216
|
+
@sitemaps = self.objects_from_array(Yandex::Webmaster::Hosts::Sitemap, array)
|
217
|
+
end
|
218
|
+
end
|
219
|
+
end
|
220
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
module Yandex
|
4
|
+
module Webmaster
|
5
|
+
module Hosts
|
6
|
+
class Crawling < Base
|
7
|
+
STATES = [
|
8
|
+
'indexed',
|
9
|
+
'not_indexed',
|
10
|
+
'waiting'
|
11
|
+
].freeze
|
12
|
+
|
13
|
+
define_attributes :as => 'api_attributes' do
|
14
|
+
attr :state, String, :writer => :protected
|
15
|
+
end
|
16
|
+
|
17
|
+
attr_accessor :host
|
18
|
+
|
19
|
+
def state=(value)
|
20
|
+
value = value.downcase.underscore
|
21
|
+
@state = value if STATES.include?(value)
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,73 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
module Yandex
|
4
|
+
module Webmaster
|
5
|
+
module Hosts
|
6
|
+
class Sitemap < Base
|
7
|
+
|
8
|
+
define_attributes :as => 'api_attributes' do
|
9
|
+
attr :href, String, :writer => :protected
|
10
|
+
|
11
|
+
attr :latest_info, SitemapInfo, :writer => :protected
|
12
|
+
attr :in_search_info, SitemapInfo, :writer => :protected
|
13
|
+
end
|
14
|
+
|
15
|
+
attr_accessor :host
|
16
|
+
|
17
|
+
def resources
|
18
|
+
@resources ||= {}
|
19
|
+
end
|
20
|
+
|
21
|
+
# Load detailed information about the sitemap
|
22
|
+
# [RU] http://api.yandex.ru/webmaster/doc/dg/reference/sitemap-id.xml
|
23
|
+
# [EN] http://api.yandex.com/webmaster/doc/dg/reference/sitemap-id.xml
|
24
|
+
#
|
25
|
+
def load_details
|
26
|
+
self.attributes = self.request(:get, self.href).body
|
27
|
+
self
|
28
|
+
end
|
29
|
+
|
30
|
+
# Delete information about the sitemap from Yandex.Webmaster
|
31
|
+
# [RU] http://api.yandex.ru/webmaster/doc/dg/reference/sitemap-delete.xml
|
32
|
+
# [EN] http://api.yandex.com/webmaster/doc/dg/reference/sitemap-delete.xml
|
33
|
+
#
|
34
|
+
def delete
|
35
|
+
response = self.request(:delete, self.href)
|
36
|
+
@deleted = true if response.status.to_i == 204
|
37
|
+
self
|
38
|
+
end
|
39
|
+
|
40
|
+
# @return [Boolean]
|
41
|
+
#
|
42
|
+
def deleted?
|
43
|
+
!!@deleted
|
44
|
+
end
|
45
|
+
|
46
|
+
protected
|
47
|
+
|
48
|
+
def link=(value)
|
49
|
+
raise ArgumentError unless value.is_a?(Array)
|
50
|
+
|
51
|
+
value.each do |link|
|
52
|
+
link[:rel] == 'self' ? self.href = link[:href] : self.resources[link[:rel].underscore.to_sym] = link[:href]
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
def info=(value)
|
57
|
+
raise ArgumentError unless value.is_a?(Array)
|
58
|
+
|
59
|
+
value.each do |info|
|
60
|
+
if info[:type].present? && self.respond_to?("#{info[:type].downcase.underscore}_info=")
|
61
|
+
self.send("#{info[:type].downcase.underscore}_info=", info.merge({
|
62
|
+
:host => self.host,
|
63
|
+
:configuration => self.configuration
|
64
|
+
})
|
65
|
+
)
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end
|
@@ -0,0 +1,55 @@
|
|
1
|
+
module Yandex
|
2
|
+
module Webmaster
|
3
|
+
module Hosts
|
4
|
+
class SitemapInfo < Base
|
5
|
+
|
6
|
+
ADDED_BY = [
|
7
|
+
'user',
|
8
|
+
'robot_txt'
|
9
|
+
].freeze
|
10
|
+
|
11
|
+
FORMATS = [
|
12
|
+
'XML',
|
13
|
+
'RSS',
|
14
|
+
'TEXT'
|
15
|
+
].freeze
|
16
|
+
|
17
|
+
TYPES = [
|
18
|
+
'SITEMAP',
|
19
|
+
'SITEMAPINDX'
|
20
|
+
].freeze
|
21
|
+
|
22
|
+
define_attributes :as => 'api_attributes' do
|
23
|
+
attr :url_count, Integer, :writer => :protected
|
24
|
+
attr :url_error_count, Integer, :writer => :protected
|
25
|
+
attr :error_count, Integer, :writer => :protected
|
26
|
+
attr :submitted_on, DateTime, :writer => :protected
|
27
|
+
attr :added_by, Array, :writer => :protected
|
28
|
+
attr :processed_on, DateTime, :writer => :protected
|
29
|
+
attr :real_processed_on, DateTime, :writer => :protected
|
30
|
+
attr :format, String, :writer => :protected
|
31
|
+
attr :type, String, :writer => :protected
|
32
|
+
end
|
33
|
+
|
34
|
+
attr_accessor :host
|
35
|
+
|
36
|
+
protected
|
37
|
+
|
38
|
+
def added_by=(value)
|
39
|
+
@added_by = Array.wrap(value).flatten.map{ |v| v.downcase.underscore }.select{ |v| ADDED_BY.include?(v) }
|
40
|
+
end
|
41
|
+
|
42
|
+
def format=(value)
|
43
|
+
value = value.upcase
|
44
|
+
@format = value if FORMATS.include?(value)
|
45
|
+
end
|
46
|
+
|
47
|
+
def type=(value)
|
48
|
+
value = value.upcase
|
49
|
+
@type = value if TYPES.include?(value)
|
50
|
+
end
|
51
|
+
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|