webmaster 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.
@@ -0,0 +1,9 @@
1
+ class String # :nodoc:
2
+ def underscore
3
+ self.gsub(/::/, '/').
4
+ gsub(/([A-Z]+)([A-Z][a-z])/,'\1_\2').
5
+ gsub(/([a-z\d])([A-Z])/,'\1_\2').
6
+ tr("-", "_").
7
+ downcase
8
+ end unless method_defined?(:underscore)
9
+ end
@@ -0,0 +1,21 @@
1
+ # encoding: utf-8
2
+
3
+ module Webmaster
4
+ module Errors
5
+ class WebmasterError < StandardError
6
+ attr_reader :data
7
+
8
+ def initialize(data)
9
+ @data = data
10
+ super
11
+ end
12
+ end
13
+
14
+ class UnauthorizedError < WebmasterError; end
15
+ class GeneralError < WebmasterError; end
16
+ class AccessDeniedError < WebmasterError; end
17
+ class NoTokenError < WebmasterError; end
18
+ class NotFoundError < WebmasterError; end
19
+ class ResourceError < WebmasterError; end
20
+ end
21
+ end
@@ -0,0 +1,154 @@
1
+ # encoding: utf-8
2
+
3
+ require 'forwardable'
4
+
5
+ module Webmaster
6
+ class Host < Base
7
+ extend Forwardable
8
+ include Virtus
9
+
10
+ attribute :href, String
11
+ attribute :name, String
12
+ attribute :virused, Boolean
13
+ attribute :last_access, DateTime
14
+ attribute :tcy, Integer
15
+
16
+ attribute :url_count, Integer
17
+ attribute :url_errors, Integer
18
+
19
+ attribute :index_count, Integer
20
+ attribute :last_week_index_urls, Array
21
+
22
+ attribute :internal_links_count, Integer
23
+
24
+ attribute :links_count, Integer
25
+ attribute :last_week_links, Array
26
+
27
+ attr_reader :crawling
28
+
29
+ delegate :verified? => :verification
30
+
31
+ # Id of the host
32
+ # @return [Integer]
33
+ #
34
+ def id
35
+ return @id if defined?(@id)
36
+ @id = self.href.match(/\/(\d+)\z/)[1].to_i
37
+ end
38
+
39
+ # Load information about resources that are available for the host
40
+ # @return [Hash]
41
+ #
42
+ def resources
43
+ return @resources if defined?(@resources)
44
+
45
+ @resources = self.fetch_value(self.request(:get, self.href), :link).inject({}) do |h, resource|
46
+ h[resource[:rel].underscore.to_sym] = resource[:href]; h
47
+ end
48
+ end
49
+
50
+ # Delete information about the host from Yandex.Market
51
+ # [RU] http://api.yandex.ru/webmaster/doc/dg/reference/hosts-delete.xml
52
+ # [EN] http://api.yandex.com/webmaster/doc/dg/reference/hosts-delete.xml
53
+ #
54
+ def delete
55
+ response = self.request(:delete, self.href)
56
+ # @deleted = true if response.status.to_i == 204
57
+ @deleted = true if response.status.to_i == 405
58
+ self
59
+ end
60
+
61
+ # @return [Boolean]
62
+ #
63
+ def deleted?
64
+ !!@deleted
65
+ end
66
+
67
+ # Load information about verification for the host
68
+ #
69
+ def verify(type)
70
+ self.validate_resource!(:verify_host)
71
+
72
+ status = self.verification.run(type)
73
+ @verification = nil
74
+
75
+ status
76
+ end
77
+
78
+ # Information about verification for the host
79
+ # @return [Webmaster::Hosts::Verification]
80
+ # [RU] http://api.yandex.ru/webmaster/doc/dg/reference/hosts-verify.xml
81
+ # [EN] http://api.yandex.com/webmaster/doc/dg/reference/hosts-verify.xml
82
+ def verification(reload = false)
83
+ @verification = nil if reload
84
+
85
+ if @verification.nil?
86
+ self.validate_resource!(:verify_host)
87
+ self.verification = self.fetch_value(self.request(:get, self.resources[:verify_host]), :verification)
88
+ end
89
+
90
+ @verification
91
+ end
92
+
93
+ # Load stats for the host
94
+ # @return [Webmaster::Host]
95
+ # [RU] http://api.yandex.ru/webmaster/doc/dg/reference/hosts-stats.xml
96
+ # [EN] http://api.yandex.com/webmaster/doc/dg/reference/hosts-stats.xml
97
+ #
98
+ def stats
99
+ self.validate_resource!(:host_information)
100
+
101
+ self.attributes = self.request(:get, self.resources[:host_information]).body
102
+ self
103
+ end
104
+
105
+ # Load information about indexed urls for the host
106
+ # @return [Webmaster::Host]
107
+ # [RU] http://api.yandex.ru/webmaster/doc/dg/reference/hosts-indexed.xml
108
+ # [EN] http://api.yandex.com/webmaster/doc/dg/reference/hosts-indexed.xml
109
+ #
110
+ def indexed_urls
111
+ self.validate_resource!(:indexed_urls)
112
+
113
+ self.attributes = self.request(:get, self.resources[:indexed_urls]).body
114
+ self
115
+ end
116
+
117
+ # Load information about incoming links for the host
118
+ # @return [Webmaster::Host]
119
+ # [RU] http://api.yandex.ru/webmaster/doc/dg/reference/host-links.xml
120
+ # [EN] http://api.yandex.com/webmaster/doc/dg/reference/host-links.xml
121
+ #
122
+ def incoming_links
123
+ self.validate_resource!(:incoming_links)
124
+
125
+ self.attributes = self.request(:get, self.resources[:incoming_links]).body
126
+ self
127
+ end
128
+
129
+ protected
130
+
131
+ def validate_resource!(resource)
132
+ unless self.resources.keys.include?(resource)
133
+ raise Webmaster::Errors::ResourceError.new("Resource '#{resource.to_s}' is not available for the host")
134
+ end
135
+ end
136
+
137
+ private
138
+
139
+ def verification=(value)
140
+ @verification = value.is_a?(Webmaster::Hosts::Verification) ? value : Webmaster::Hosts::Verification.new(value)
141
+ @verification.host = self
142
+ @verification.configuration = self.configuration
143
+ @verification
144
+ end
145
+
146
+ def crawling=(value)
147
+ @crawling = Webmaster::Hosts::Crawling.new(value)
148
+ @crawling.host = self
149
+ @crawling.configuration = self.configuration
150
+ @crawling
151
+ end
152
+
153
+ end
154
+ end
@@ -0,0 +1,24 @@
1
+ # encoding: utf-8
2
+
3
+ module Webmaster
4
+ module Hosts
5
+ class Crawling < Base
6
+ include Virtus
7
+
8
+ STATES = [
9
+ 'indexed',
10
+ 'not_indexed',
11
+ 'waiting'
12
+ ].freeze
13
+
14
+ attribute :state, String
15
+
16
+ attr_accessor :host
17
+
18
+ def state=(value)
19
+ value = value.downcase.underscore
20
+ @state = value if STATES.include?(value)
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,77 @@
1
+ # encoding: utf-8
2
+
3
+ require 'xml/libxml'
4
+
5
+ module Webmaster
6
+ module Hosts
7
+ class Verification < Base
8
+ include Virtus
9
+
10
+ STATES = [
11
+ 'in_progress',
12
+ 'never_verified',
13
+ 'verification_failed',
14
+ 'verified',
15
+ 'waiting'
16
+ ].freeze
17
+
18
+ CHECKABLE_TYPES = [
19
+ 'dns_record',
20
+ 'html_file',
21
+ 'meta_tag',
22
+ 'txt_file',
23
+ 'whois'
24
+ ].freeze
25
+
26
+ NON_CHECKABLE_TYPES = [
27
+ 'auto',
28
+ 'manual',
29
+ 'pdd',
30
+ 'pdd_external',
31
+ 'delegation'
32
+ ].freeze
33
+
34
+ TYPES = (CHECKABLE_TYPES + NON_CHECKABLE_TYPES).flatten.freeze
35
+
36
+ attribute :state, String
37
+ attribute :type, String
38
+
39
+ attribute :possible_to_cancel, Boolean
40
+ attribute :date, Date
41
+ attribute :uin, String
42
+
43
+ attr_accessor :host
44
+
45
+ def initialize(attributes = {})
46
+ super(attributes)
47
+
48
+ self.state ||= 'never_verified'
49
+ end
50
+
51
+ # @return [Boolean]
52
+ #
53
+ def verified?
54
+ self.state == 'verified'
55
+ end
56
+
57
+ def run(type)
58
+ raise ArgumentError if !CHECKABLE_TYPES.include?(type.underscore.downcase)
59
+
60
+ # data = XML::Document.string("<host><type>#{type.underscore.upcase}</type></host>").to_s
61
+ data = "<host><type>#{type.underscore.upcase}</type></host>"
62
+ response = self.request(:put, self.host.resources[:verify_host], :data => data)
63
+ # return true if response.status.to_i == 204
64
+ end
65
+
66
+ def state=(value)
67
+ value = value.downcase.underscore
68
+ @state = value if STATES.include?(value)
69
+ end
70
+
71
+ def type=(value)
72
+ value = value.downcase.underscore
73
+ @type = value if TYPES.include?(value)
74
+ end
75
+ end
76
+ end
77
+ end
@@ -0,0 +1,26 @@
1
+ # encoding: utf-8
2
+
3
+ require 'faraday'
4
+
5
+ module Webmaster
6
+ module Request
7
+ class OAuth2 < Faraday::Middleware
8
+
9
+ AUTH_HEADER = 'Authorization'.freeze
10
+
11
+ dependency 'oauth2'
12
+
13
+ def call(env)
14
+ env[:request_headers].merge!(AUTH_HEADER => "OAuth #{@token}") if @token.present?
15
+
16
+ @app.call env
17
+ end
18
+
19
+ def initialize(app, *args)
20
+ super app
21
+ @app = app
22
+ @token = args.shift
23
+ end
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,59 @@
1
+ # encoding: utf-8
2
+
3
+ require 'faraday'
4
+ require 'xml/libxml'
5
+
6
+ module Webmaster
7
+ class Response::Hashify < Faraday::Response::Middleware
8
+ def parse(body)
9
+ self.from_xml(body) if body.present?
10
+ end
11
+
12
+ def from_xml(xml, strict = true)
13
+ begin
14
+ XML.default_load_external_dtd = false
15
+ XML.default_pedantic_parser = strict
16
+ result = XML::Parser.string(xml).parse
17
+ return xml_node_to_hash(result.root)
18
+ rescue Exception => e
19
+ # raise custom exception here
20
+ end
21
+ end
22
+
23
+ def xml_node_to_hash(node)
24
+ if node.element?
25
+ if node.children? || node.attributes?
26
+ result_hash = {}
27
+
28
+ node.each_child do |child|
29
+ result = xml_node_to_hash(child)
30
+
31
+ if child.name == "text"
32
+ if !child.next? and !child.prev?
33
+ return result
34
+ end
35
+ elsif result_hash[child.name.underscore.to_sym]
36
+ if result_hash[child.name.underscore.to_sym].is_a?(Object::Array)
37
+ result_hash[child.name.underscore.to_sym] << result
38
+ else
39
+ result_hash[child.name.underscore.to_sym] = [result_hash[child.name.to_sym]] << result
40
+ end
41
+ else
42
+ result_hash[child.name.underscore.to_sym] = result
43
+ end
44
+ end
45
+
46
+ node.each_attr do |attr|
47
+ result_hash[attr.name.underscore.to_sym] = attr.value
48
+ end
49
+
50
+ return result_hash
51
+ else
52
+ return nil
53
+ end
54
+ else
55
+ return node.content.to_s
56
+ end
57
+ end
58
+ end
59
+ end
@@ -0,0 +1,12 @@
1
+ # encoding: utf-8
2
+
3
+ module Webmaster
4
+ module Version
5
+ MAJOR = 0
6
+ MINOR = 1
7
+ PATCH = 0
8
+ BUILD = nil
9
+
10
+ STRING = [MAJOR, MINOR, PATCH, BUILD].compact.join('.')
11
+ end
12
+ end
@@ -0,0 +1,18 @@
1
+ require 'rubygems'
2
+ require 'bundler'
3
+ begin
4
+ Bundler.setup(:default, :development)
5
+ rescue Bundler::BundlerError => e
6
+ $stderr.puts e.message
7
+ $stderr.puts "Run `bundle install` to install missing gems"
8
+ exit e.status_code
9
+ end
10
+ require 'test/unit'
11
+ require 'shoulda'
12
+
13
+ $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
14
+ $LOAD_PATH.unshift(File.dirname(__FILE__))
15
+ require 'webmaster'
16
+
17
+ class Test::Unit::TestCase
18
+ end
@@ -0,0 +1,7 @@
1
+ require 'helper'
2
+
3
+ class TestWebmaster < Test::Unit::TestCase
4
+ should "probably rename this file and start testing for real" do
5
+ flunk "hey buddy, you should probably rename this file and start testing for real"
6
+ end
7
+ end
@@ -0,0 +1,196 @@
1
+ # Generated by jeweler
2
+ # DO NOT EDIT THIS FILE DIRECTLY
3
+ # Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
4
+ # -*- encoding: utf-8 -*-
5
+
6
+ Gem::Specification.new do |s|
7
+ s.name = "webmaster"
8
+ s.version = "0.1.0"
9
+
10
+ s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
+ s.authors = ["Igor Alexandrov"]
12
+ s.date = "2013-04-29"
13
+ s.email = "igor.alexandrov@gmail.com"
14
+ s.extra_rdoc_files = [
15
+ "LICENSE.txt",
16
+ "README.md"
17
+ ]
18
+ s.files = [
19
+ ".document",
20
+ "Gemfile",
21
+ "Gemfile.lock",
22
+ "LICENSE.txt",
23
+ "README.md",
24
+ "Rakefile",
25
+ "lib/webmaster.rb",
26
+ "lib/webmaster/api/authorization.rb",
27
+ "lib/webmaster/api/connection.rb",
28
+ "lib/webmaster/api/request.rb",
29
+ "lib/webmaster/base.rb",
30
+ "lib/webmaster/client.rb",
31
+ "lib/webmaster/configuration.rb",
32
+ "lib/webmaster/core_ext/hash.rb",
33
+ "lib/webmaster/core_ext/object.rb",
34
+ "lib/webmaster/core_ext/string.rb",
35
+ "lib/webmaster/errors.rb",
36
+ "lib/webmaster/host.rb",
37
+ "lib/webmaster/hosts/crawling.rb",
38
+ "lib/webmaster/hosts/verification.rb",
39
+ "lib/webmaster/request/oauth2.rb",
40
+ "lib/webmaster/response/hashify.rb",
41
+ "lib/webmaster/version.rb",
42
+ "test/helper.rb",
43
+ "test/test_webmaster.rb",
44
+ "webmaster.gemspec"
45
+ ]
46
+ s.homepage = "http://github.com/igor-alexandrov/webmaster"
47
+ s.licenses = ["MIT"]
48
+ s.require_paths = ["lib"]
49
+ s.rubygems_version = "1.8.24"
50
+ s.summary = "Ruby wrapper for Yandex.Webmaster API"
51
+
52
+ if s.respond_to? :specification_version then
53
+ s.specification_version = 3
54
+
55
+ if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
56
+ s.add_runtime_dependency(%q<faraday>, [">= 0"])
57
+ s.add_runtime_dependency(%q<oauth2>, [">= 0"])
58
+ s.add_runtime_dependency(%q<libxml-ruby>, [">= 0"])
59
+ s.add_runtime_dependency(%q<virtus>, [">= 0"])
60
+ s.add_runtime_dependency(%q<webmaster>, [">= 0"])
61
+ s.add_development_dependency(%q<shoulda>, [">= 0"])
62
+ s.add_development_dependency(%q<rdoc>, [">= 0"])
63
+ s.add_development_dependency(%q<bundler>, [">= 0"])
64
+ s.add_development_dependency(%q<jeweler>, [">= 0"])
65
+ s.add_development_dependency(%q<shoulda>, [">= 0"])
66
+ s.add_development_dependency(%q<rdoc>, [">= 0"])
67
+ s.add_development_dependency(%q<bundler>, [">= 0"])
68
+ s.add_development_dependency(%q<jeweler>, [">= 0"])
69
+ s.add_development_dependency(%q<shoulda>, [">= 0"])
70
+ s.add_development_dependency(%q<rdoc>, [">= 0"])
71
+ s.add_development_dependency(%q<bundler>, [">= 0"])
72
+ s.add_development_dependency(%q<jeweler>, [">= 0"])
73
+ s.add_development_dependency(%q<shoulda>, [">= 0"])
74
+ s.add_development_dependency(%q<rdoc>, [">= 0"])
75
+ s.add_development_dependency(%q<bundler>, [">= 0"])
76
+ s.add_development_dependency(%q<jeweler>, [">= 0"])
77
+ s.add_development_dependency(%q<shoulda>, [">= 0"])
78
+ s.add_development_dependency(%q<rdoc>, [">= 0"])
79
+ s.add_development_dependency(%q<bundler>, [">= 0"])
80
+ s.add_development_dependency(%q<jeweler>, [">= 0"])
81
+ s.add_development_dependency(%q<shoulda>, [">= 0"])
82
+ s.add_development_dependency(%q<rdoc>, [">= 0"])
83
+ s.add_development_dependency(%q<bundler>, [">= 0"])
84
+ s.add_development_dependency(%q<jeweler>, [">= 0"])
85
+ s.add_development_dependency(%q<shoulda>, [">= 0"])
86
+ s.add_development_dependency(%q<rdoc>, [">= 0"])
87
+ s.add_development_dependency(%q<bundler>, [">= 0"])
88
+ s.add_development_dependency(%q<jeweler>, [">= 0"])
89
+ s.add_development_dependency(%q<shoulda>, [">= 0"])
90
+ s.add_development_dependency(%q<rdoc>, [">= 0"])
91
+ s.add_development_dependency(%q<bundler>, [">= 0"])
92
+ s.add_development_dependency(%q<jeweler>, [">= 0"])
93
+ s.add_development_dependency(%q<shoulda>, [">= 0"])
94
+ s.add_development_dependency(%q<rdoc>, [">= 0"])
95
+ s.add_development_dependency(%q<bundler>, [">= 0"])
96
+ s.add_development_dependency(%q<jeweler>, [">= 0"])
97
+ s.add_development_dependency(%q<shoulda>, [">= 0"])
98
+ s.add_development_dependency(%q<rdoc>, [">= 0"])
99
+ s.add_development_dependency(%q<bundler>, [">= 0"])
100
+ s.add_development_dependency(%q<jeweler>, [">= 0"])
101
+ else
102
+ s.add_dependency(%q<faraday>, [">= 0"])
103
+ s.add_dependency(%q<oauth2>, [">= 0"])
104
+ s.add_dependency(%q<libxml-ruby>, [">= 0"])
105
+ s.add_dependency(%q<virtus>, [">= 0"])
106
+ s.add_dependency(%q<webmaster>, [">= 0"])
107
+ s.add_dependency(%q<shoulda>, [">= 0"])
108
+ s.add_dependency(%q<rdoc>, [">= 0"])
109
+ s.add_dependency(%q<bundler>, [">= 0"])
110
+ s.add_dependency(%q<jeweler>, [">= 0"])
111
+ s.add_dependency(%q<shoulda>, [">= 0"])
112
+ s.add_dependency(%q<rdoc>, [">= 0"])
113
+ s.add_dependency(%q<bundler>, [">= 0"])
114
+ s.add_dependency(%q<jeweler>, [">= 0"])
115
+ s.add_dependency(%q<shoulda>, [">= 0"])
116
+ s.add_dependency(%q<rdoc>, [">= 0"])
117
+ s.add_dependency(%q<bundler>, [">= 0"])
118
+ s.add_dependency(%q<jeweler>, [">= 0"])
119
+ s.add_dependency(%q<shoulda>, [">= 0"])
120
+ s.add_dependency(%q<rdoc>, [">= 0"])
121
+ s.add_dependency(%q<bundler>, [">= 0"])
122
+ s.add_dependency(%q<jeweler>, [">= 0"])
123
+ s.add_dependency(%q<shoulda>, [">= 0"])
124
+ s.add_dependency(%q<rdoc>, [">= 0"])
125
+ s.add_dependency(%q<bundler>, [">= 0"])
126
+ s.add_dependency(%q<jeweler>, [">= 0"])
127
+ s.add_dependency(%q<shoulda>, [">= 0"])
128
+ s.add_dependency(%q<rdoc>, [">= 0"])
129
+ s.add_dependency(%q<bundler>, [">= 0"])
130
+ s.add_dependency(%q<jeweler>, [">= 0"])
131
+ s.add_dependency(%q<shoulda>, [">= 0"])
132
+ s.add_dependency(%q<rdoc>, [">= 0"])
133
+ s.add_dependency(%q<bundler>, [">= 0"])
134
+ s.add_dependency(%q<jeweler>, [">= 0"])
135
+ s.add_dependency(%q<shoulda>, [">= 0"])
136
+ s.add_dependency(%q<rdoc>, [">= 0"])
137
+ s.add_dependency(%q<bundler>, [">= 0"])
138
+ s.add_dependency(%q<jeweler>, [">= 0"])
139
+ s.add_dependency(%q<shoulda>, [">= 0"])
140
+ s.add_dependency(%q<rdoc>, [">= 0"])
141
+ s.add_dependency(%q<bundler>, [">= 0"])
142
+ s.add_dependency(%q<jeweler>, [">= 0"])
143
+ s.add_dependency(%q<shoulda>, [">= 0"])
144
+ s.add_dependency(%q<rdoc>, [">= 0"])
145
+ s.add_dependency(%q<bundler>, [">= 0"])
146
+ s.add_dependency(%q<jeweler>, [">= 0"])
147
+ end
148
+ else
149
+ s.add_dependency(%q<faraday>, [">= 0"])
150
+ s.add_dependency(%q<oauth2>, [">= 0"])
151
+ s.add_dependency(%q<libxml-ruby>, [">= 0"])
152
+ s.add_dependency(%q<virtus>, [">= 0"])
153
+ s.add_dependency(%q<webmaster>, [">= 0"])
154
+ s.add_dependency(%q<shoulda>, [">= 0"])
155
+ s.add_dependency(%q<rdoc>, [">= 0"])
156
+ s.add_dependency(%q<bundler>, [">= 0"])
157
+ s.add_dependency(%q<jeweler>, [">= 0"])
158
+ s.add_dependency(%q<shoulda>, [">= 0"])
159
+ s.add_dependency(%q<rdoc>, [">= 0"])
160
+ s.add_dependency(%q<bundler>, [">= 0"])
161
+ s.add_dependency(%q<jeweler>, [">= 0"])
162
+ s.add_dependency(%q<shoulda>, [">= 0"])
163
+ s.add_dependency(%q<rdoc>, [">= 0"])
164
+ s.add_dependency(%q<bundler>, [">= 0"])
165
+ s.add_dependency(%q<jeweler>, [">= 0"])
166
+ s.add_dependency(%q<shoulda>, [">= 0"])
167
+ s.add_dependency(%q<rdoc>, [">= 0"])
168
+ s.add_dependency(%q<bundler>, [">= 0"])
169
+ s.add_dependency(%q<jeweler>, [">= 0"])
170
+ s.add_dependency(%q<shoulda>, [">= 0"])
171
+ s.add_dependency(%q<rdoc>, [">= 0"])
172
+ s.add_dependency(%q<bundler>, [">= 0"])
173
+ s.add_dependency(%q<jeweler>, [">= 0"])
174
+ s.add_dependency(%q<shoulda>, [">= 0"])
175
+ s.add_dependency(%q<rdoc>, [">= 0"])
176
+ s.add_dependency(%q<bundler>, [">= 0"])
177
+ s.add_dependency(%q<jeweler>, [">= 0"])
178
+ s.add_dependency(%q<shoulda>, [">= 0"])
179
+ s.add_dependency(%q<rdoc>, [">= 0"])
180
+ s.add_dependency(%q<bundler>, [">= 0"])
181
+ s.add_dependency(%q<jeweler>, [">= 0"])
182
+ s.add_dependency(%q<shoulda>, [">= 0"])
183
+ s.add_dependency(%q<rdoc>, [">= 0"])
184
+ s.add_dependency(%q<bundler>, [">= 0"])
185
+ s.add_dependency(%q<jeweler>, [">= 0"])
186
+ s.add_dependency(%q<shoulda>, [">= 0"])
187
+ s.add_dependency(%q<rdoc>, [">= 0"])
188
+ s.add_dependency(%q<bundler>, [">= 0"])
189
+ s.add_dependency(%q<jeweler>, [">= 0"])
190
+ s.add_dependency(%q<shoulda>, [">= 0"])
191
+ s.add_dependency(%q<rdoc>, [">= 0"])
192
+ s.add_dependency(%q<bundler>, [">= 0"])
193
+ s.add_dependency(%q<jeweler>, [">= 0"])
194
+ end
195
+ end
196
+