yandex-webmaster 0.1.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (49) hide show
  1. data/.document +5 -0
  2. data/Gemfile +23 -0
  3. data/Gemfile.lock +72 -0
  4. data/LICENSE.txt +20 -0
  5. data/README.md +259 -0
  6. data/Rakefile +46 -0
  7. data/lib/yandex-webmaster.rb +80 -0
  8. data/lib/yandex-webmaster/api/attributes.rb +23 -0
  9. data/lib/yandex-webmaster/api/attributes/accessor_builder.rb +59 -0
  10. data/lib/yandex-webmaster/api/attributes/reader_builder.rb +35 -0
  11. data/lib/yandex-webmaster/api/attributes/types/base.rb +27 -0
  12. data/lib/yandex-webmaster/api/attributes/types/boolean.rb +22 -0
  13. data/lib/yandex-webmaster/api/attributes/types/date.rb +17 -0
  14. data/lib/yandex-webmaster/api/attributes/types/date_time.rb +17 -0
  15. data/lib/yandex-webmaster/api/attributes/types/float.rb +17 -0
  16. data/lib/yandex-webmaster/api/attributes/types/integer.rb +17 -0
  17. data/lib/yandex-webmaster/api/attributes/types/symbol.rb +17 -0
  18. data/lib/yandex-webmaster/api/attributes/types/time.rb +17 -0
  19. data/lib/yandex-webmaster/api/attributes/writer_builder.rb +36 -0
  20. data/lib/yandex-webmaster/api/attributes_builder.rb +65 -0
  21. data/lib/yandex-webmaster/api_factory.rb +32 -0
  22. data/lib/yandex-webmaster/authorization.rb +59 -0
  23. data/lib/yandex-webmaster/base.rb +120 -0
  24. data/lib/yandex-webmaster/client.rb +16 -0
  25. data/lib/yandex-webmaster/configuration.rb +99 -0
  26. data/lib/yandex-webmaster/connection.rb +87 -0
  27. data/lib/yandex-webmaster/core_ext/array.rb +23 -0
  28. data/lib/yandex-webmaster/core_ext/class.rb +55 -0
  29. data/lib/yandex-webmaster/core_ext/date.rb +7 -0
  30. data/lib/yandex-webmaster/core_ext/date_time.rb +7 -0
  31. data/lib/yandex-webmaster/core_ext/hash.rb +92 -0
  32. data/lib/yandex-webmaster/core_ext/nil_class.rb +7 -0
  33. data/lib/yandex-webmaster/core_ext/object.rb +19 -0
  34. data/lib/yandex-webmaster/core_ext/string.rb +23 -0
  35. data/lib/yandex-webmaster/errors.rb +23 -0
  36. data/lib/yandex-webmaster/host.rb +220 -0
  37. data/lib/yandex-webmaster/hosts/crawling.rb +26 -0
  38. data/lib/yandex-webmaster/hosts/sitemap.rb +73 -0
  39. data/lib/yandex-webmaster/hosts/sitemap_info.rb +55 -0
  40. data/lib/yandex-webmaster/hosts/top_info.rb +19 -0
  41. data/lib/yandex-webmaster/hosts/verification.rb +81 -0
  42. data/lib/yandex-webmaster/request.rb +62 -0
  43. data/lib/yandex-webmaster/request/oauth2.rb +28 -0
  44. data/lib/yandex-webmaster/response/hashify.rb +59 -0
  45. data/lib/yandex-webmaster/version.rb +14 -0
  46. data/test/helper.rb +18 -0
  47. data/test/test_webmaster.rb +7 -0
  48. data/yandex-webmaster.gemspec +167 -0
  49. metadata +546 -0
@@ -0,0 +1,7 @@
1
+ # encoding: utf-8
2
+
3
+ class NilClass
4
+ def try(*args)
5
+ nil
6
+ end
7
+ end
@@ -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