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