yandex-webmaster 0.1.1
Sign up to get free protection for your applications and to get access to all the features.
- 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
|