vcr 1.10.0 → 1.10.2

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/.travis.yml CHANGED
@@ -1,11 +1,6 @@
1
1
  script: "bundle exec rake ci:build"
2
2
  rvm:
3
- - 1.8.6
4
3
  - 1.8.7
5
- - 1.9.1
6
4
  - 1.9.2
7
- - ree
8
- - jruby
9
- - rbx
10
5
  env:
11
6
  - CI=true
data/CHANGELOG.md CHANGED
@@ -1,6 +1,24 @@
1
1
  ## In git
2
2
 
3
- [Full Changelog](http://github.com/myronmarston/vcr/compare/v1.10.0...master)
3
+ [Full Changelog](http://github.com/myronmarston/vcr/compare/v1.10.2...master)
4
+
5
+ ## 1.10.2 (July 16, 2011)
6
+
7
+ [Full Changelog](http://github.com/myronmarston/vcr/compare/v1.10.1...v1.10.2)
8
+
9
+ * Yanked 1.10.1 and rebuilt gem on 1.8.7 to deal with syck/psych
10
+ incompatibilties in gemspec.
11
+
12
+ ## 1.10.1 (July 16, 2011)
13
+
14
+ [Full Changelog](http://github.com/myronmarston/vcr/compare/v1.10.0...v1.10.1)
15
+
16
+ * Fix typo in error message [Bradley](https://github.com/bradleyisotope).
17
+ * Fix excon adapter to properly handle queries specified as a hash.
18
+ * Fix excon adapter to stub a response with a hash as excon expects
19
+ [Wesley Beary](https://github.com/geemus).
20
+ * Fix excon adapter so that it records a response even when excon raises
21
+ an error due to an unexpected response.
4
22
 
5
23
  ## 1.10.0 (May 18, 2011)
6
24
 
data/Rakefile CHANGED
@@ -70,11 +70,15 @@ task :relish do
70
70
  end
71
71
 
72
72
  require 'vcr/version'
73
- sh "relish versions:add myronmarston/vcr:#{VCR.version}"
73
+ sh "relish versions:add myronmarston/vcr:#{VCR.version}" if ENV['NEW_RELISH_RELEASE']
74
74
  sh "relish push vcr:#{VCR.version}"
75
75
  end
76
76
 
77
- task :release => :relish
77
+ task :prep_relish_release do
78
+ ENV['NEW_RELISH_RELEASE'] = 'true'
79
+ end
80
+
81
+ task :release => [:prep_relish_release, :relish]
78
82
 
79
83
  # For gem-test: http://gem-testers.org/
80
84
  task :test => :spec
@@ -2,7 +2,7 @@ Feature: Filter sensitive data
2
2
 
3
3
  The `filter_sensitive_data` configuration option can be used to prevent
4
4
  sensitive data from being written to your cassette files. This may be
5
- important if you commit your cassettes files to source controla and do
5
+ important if you commit your cassettes files to source control and do
6
6
  not want your sensitive data exposed. Pass the following arguments to
7
7
  `filter_sensitive_data`:
8
8
 
@@ -146,7 +146,7 @@ Feature: Net::HTTP
146
146
  c.cassette_library_dir = 'cassettes'
147
147
  end
148
148
 
149
- uri = URI("https://gist.github.com/raw/fb555cb593f3349d53af/6921dd638337d3f6a51b0e02e7f30e3c414f70d6/vcr_gist")
149
+ uri = URI("https://raw.github.com/gist/fb555cb593f3349d53af/6921dd638337d3f6a51b0e02e7f30e3c414f70d6/vcr_gist")
150
150
 
151
151
  VCR.use_cassette('https', :record => :new_episodes) do
152
152
  http = Net::HTTP.new(uri.host, uri.port)
data/lib/vcr.rb CHANGED
@@ -58,7 +58,7 @@ module VCR
58
58
  cassette
59
59
  elsif !ignore_cassettes?
60
60
  message = "VCR is turned off. You must turn it on before you can insert a cassette. " +
61
- "Or you can use the `:ignore_cassette => true` option to completely ignore cassette insertions."
61
+ "Or you can use the `:ignore_cassettes => true` option to completely ignore cassette insertions."
62
62
  raise TurnedOffError.new(message)
63
63
  end
64
64
  end
@@ -8,7 +8,7 @@ module VCR
8
8
 
9
9
  class HttpConnectionNotAllowedError < StandardError; end
10
10
 
11
- MINIMUM_VERSION = '0.6.2'
11
+ MINIMUM_VERSION = '0.6.5'
12
12
  MAXIMUM_VERSION = '0.6'
13
13
 
14
14
  attr_writer :http_connections_allowed
@@ -119,24 +119,40 @@ module VCR
119
119
  end
120
120
 
121
121
  def stubbed_response
122
- unless defined?(@stubbed_response)
123
- @stubbed_response = VCR::HttpStubbingAdapters::Excon.stubbed_response_for(vcr_request)
124
-
125
- if @stubbed_response && @stubbed_response.headers
126
- @stubbed_response.headers = normalized_headers(@stubbed_response.headers)
122
+ @stubbed_response ||= begin
123
+ if stubbed_response = VCR::HttpStubbingAdapters::Excon.stubbed_response_for(vcr_request)
124
+ {
125
+ :body => stubbed_response.body,
126
+ :headers => normalized_headers(stubbed_response.headers || {}),
127
+ :status => stubbed_response.status.code
128
+ }
127
129
  end
128
130
  end
129
-
130
- @stubbed_response
131
131
  end
132
132
 
133
133
  def http_connections_allowed?
134
134
  VCR::HttpStubbingAdapters::Excon.http_connections_allowed?
135
135
  end
136
136
 
137
+ def response_from_excon_error(error)
138
+ if error.respond_to?(:response)
139
+ error.response
140
+ elsif error.respond_to?(:socket_error)
141
+ response_from_excon_error(error.socket_error)
142
+ else
143
+ warn "WARNING: VCR could not extract a response from Excon error (#{error.inspect})"
144
+ end
145
+ end
146
+
137
147
  def perform_real_request
138
148
  connection = ::Excon.new(uri)
139
- response = connection.request(params.merge(:mock => false))
149
+
150
+ response = begin
151
+ connection.request(params.merge(:mock => false))
152
+ rescue ::Excon::Errors::Error => e
153
+ yield response_from_excon_error(e) if block_given?
154
+ raise e
155
+ end
140
156
 
141
157
  yield response if block_given?
142
158
 
@@ -153,10 +169,27 @@ module VCR
153
169
  end
154
170
 
155
171
  def uri
156
- @uri ||= begin
157
- uri = "#{params[:scheme]}://#{params[:host]}:#{params[:port]}#{params[:path]}"
158
- uri << "?#{params[:query]}" if params[:query]
159
- uri
172
+ @uri ||= "#{params[:scheme]}://#{params[:host]}:#{params[:port]}#{params[:path]}#{query}"
173
+ end
174
+
175
+ def query
176
+ @query ||= case params[:query]
177
+ when String
178
+ "?#{params[:query]}"
179
+ when Hash
180
+ qry = '?'
181
+ for key, values in params[:query]
182
+ if values.nil?
183
+ qry << key.to_s << '&'
184
+ else
185
+ for value in [*values]
186
+ qry << key.to_s << '=' << CGI.escape(value.to_s) << '&'
187
+ end
188
+ end
189
+ end
190
+ qry.chop! # remove trailing '&'
191
+ else
192
+ ''
160
193
  end
161
194
  end
162
195
 
data/lib/vcr/version.rb CHANGED
@@ -3,7 +3,7 @@ module VCR
3
3
 
4
4
  def version
5
5
  @version ||= begin
6
- string = '1.10.0'
6
+ string = '1.10.2'
7
7
 
8
8
  def string.parts
9
9
  split('.').map { |p| p.to_i }
@@ -6,6 +6,10 @@ module VCR
6
6
  "GET to root"
7
7
  end
8
8
 
9
+ get '/search' do
10
+ "query: #{params[:q]}"
11
+ end
12
+
9
13
  get '/localhost_test' do
10
14
  "Localhost response"
11
15
  end
@@ -7,8 +7,8 @@ describe VCR::HttpStubbingAdapters::Excon, :without_monkey_patches => :vcr do
7
7
  :status_message_not_exposed
8
8
 
9
9
  it_performs('version checking',
10
- :valid => %w[ 0.6.2 0.6.99 ],
11
- :too_low => %w[ 0.5.99 0.6.1 ],
10
+ :valid => %w[ 0.6.5 0.6.99 ],
11
+ :too_low => %w[ 0.5.99 0.6.4 ],
12
12
  :too_high => %w[ 0.7.0 1.0.0 ]
13
13
  ) do
14
14
  before(:each) { @orig_version = Excon::VERSION }
@@ -19,5 +19,55 @@ describe VCR::HttpStubbingAdapters::Excon, :without_monkey_patches => :vcr do
19
19
  Excon::VERSION = version
20
20
  end
21
21
  end
22
+
23
+ context "when the query is specified as a hash option" do
24
+ let(:excon) { ::Excon.new("http://localhost:#{VCR::SinatraApp.port}/search") }
25
+
26
+ it 'properly records and plays back the response' do
27
+ described_class.http_connections_allowed = true
28
+ recorded, played_back = [1, 2].map do
29
+ VCR.use_cassette('excon_query', :record => :once) do
30
+ excon.request(:method => :get, :query => { :q => 'Tolkien' }).body
31
+ end
32
+ end
33
+
34
+ recorded.should == played_back
35
+ recorded.should == 'query: Tolkien'
36
+ end
37
+ end
38
+
39
+ context "when Excon's streaming API is used" do
40
+ it 'properly records and plays back the response' do
41
+ described_class.http_connections_allowed = true
42
+ recorded, played_back = [1, 2].map do
43
+ chunks = []
44
+
45
+ VCR.use_cassette('excon_streaming', :record => :once) do
46
+ Excon.get("http://localhost:#{VCR::SinatraApp.port}/foo") do |chunk, remaining_bytes, total_bytes|
47
+ chunks << chunk
48
+ end
49
+ end
50
+
51
+ chunks.join
52
+ end
53
+
54
+ recorded.should == played_back
55
+ recorded.should == "FOO!"
56
+ end
57
+ end
58
+
59
+ context 'when Excon raises an error due to an unexpected response status' do
60
+ it 'still records properly' do
61
+ described_class.http_connections_allowed = true
62
+
63
+ VCR.should_receive(:record_http_interaction) do |interaction|
64
+ interaction.response.status.code.should == 404
65
+ end
66
+
67
+ expect {
68
+ Excon.get("http://localhost:#{VCR::SinatraApp.port}/not_found", :expects => 200)
69
+ }.to raise_error(Excon::Errors::Error)
70
+ end
71
+ end
22
72
  end
23
73
 
data/vcr.gemspec CHANGED
@@ -30,9 +30,9 @@ Gem::Specification.new do |s|
30
30
  'webmock' => '~> 1.6.4',
31
31
  'addressable' => '~> 2.2.6',
32
32
 
33
- 'faraday' => '~> 0.6.0',
33
+ 'faraday' => '~> 0.7.2',
34
34
  'httpclient' => '~> 2.1.5.2',
35
- 'excon' => '~> 0.6.2',
35
+ 'excon' => '~> 0.6.5',
36
36
 
37
37
  'timecop' => '~> 0.3.5',
38
38
  'rack' => '1.1.0',
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: vcr
3
3
  version: !ruby/object:Gem::Version
4
- hash: 63
4
+ hash: 59
5
5
  prerelease:
6
6
  segments:
7
7
  - 1
8
8
  - 10
9
- - 0
10
- version: 1.10.0
9
+ - 2
10
+ version: 1.10.2
11
11
  platform: ruby
12
12
  authors:
13
13
  - Myron Marston
@@ -15,11 +15,11 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2011-05-19 00:00:00 Z
18
+ date: 2011-07-16 00:00:00 -07:00
19
+ default_executable:
19
20
  dependencies:
20
21
  - !ruby/object:Gem::Dependency
21
- type: :development
22
- requirement: &id001 !ruby/object:Gem::Requirement
22
+ version_requirements: &id001 !ruby/object:Gem::Requirement
23
23
  none: false
24
24
  requirements:
25
25
  - - ~>
@@ -27,15 +27,15 @@ dependencies:
27
27
  hash: 7
28
28
  segments:
29
29
  - 0
30
- - 6
31
- - 0
32
- version: 0.6.0
33
- version_requirements: *id001
34
- name: faraday
30
+ - 7
31
+ - 2
32
+ version: 0.7.2
33
+ requirement: *id001
35
34
  prerelease: false
36
- - !ruby/object:Gem::Dependency
35
+ name: faraday
37
36
  type: :development
38
- requirement: &id002 !ruby/object:Gem::Requirement
37
+ - !ruby/object:Gem::Dependency
38
+ version_requirements: &id002 !ruby/object:Gem::Requirement
39
39
  none: false
40
40
  requirements:
41
41
  - - ~>
@@ -46,12 +46,12 @@ dependencies:
46
46
  - 3
47
47
  - 0
48
48
  version: 1.3.0
49
- version_requirements: *id002
50
- name: fakeweb
49
+ requirement: *id002
51
50
  prerelease: false
52
- - !ruby/object:Gem::Dependency
51
+ name: fakeweb
53
52
  type: :development
54
- requirement: &id003 !ruby/object:Gem::Requirement
53
+ - !ruby/object:Gem::Dependency
54
+ version_requirements: &id003 !ruby/object:Gem::Requirement
55
55
  none: false
56
56
  requirements:
57
57
  - - ~>
@@ -63,12 +63,12 @@ dependencies:
63
63
  - 5
64
64
  - 2
65
65
  version: 2.1.5.2
66
- version_requirements: *id003
67
- name: httpclient
66
+ requirement: *id003
68
67
  prerelease: false
69
- - !ruby/object:Gem::Dependency
68
+ name: httpclient
70
69
  type: :development
71
- requirement: &id004 !ruby/object:Gem::Requirement
70
+ - !ruby/object:Gem::Dependency
71
+ version_requirements: &id004 !ruby/object:Gem::Requirement
72
72
  none: false
73
73
  requirements:
74
74
  - - ~>
@@ -79,12 +79,12 @@ dependencies:
79
79
  - 8
80
80
  - 7
81
81
  version: 0.8.7
82
- version_requirements: *id004
83
- name: rake
82
+ requirement: *id004
84
83
  prerelease: false
85
- - !ruby/object:Gem::Dependency
84
+ name: rake
86
85
  type: :development
87
- requirement: &id005 !ruby/object:Gem::Requirement
86
+ - !ruby/object:Gem::Dependency
87
+ version_requirements: &id005 !ruby/object:Gem::Requirement
88
88
  none: false
89
89
  requirements:
90
90
  - - ~>
@@ -95,12 +95,12 @@ dependencies:
95
95
  - 3
96
96
  - 5
97
97
  version: 0.3.5
98
- version_requirements: *id005
99
- name: timecop
98
+ requirement: *id005
100
99
  prerelease: false
101
- - !ruby/object:Gem::Dependency
100
+ name: timecop
102
101
  type: :development
103
- requirement: &id006 !ruby/object:Gem::Requirement
102
+ - !ruby/object:Gem::Dependency
103
+ version_requirements: &id006 !ruby/object:Gem::Requirement
104
104
  none: false
105
105
  requirements:
106
106
  - - ~>
@@ -111,12 +111,12 @@ dependencies:
111
111
  - 2
112
112
  - 6
113
113
  version: 2.2.6
114
- version_requirements: *id006
115
- name: addressable
114
+ requirement: *id006
116
115
  prerelease: false
117
- - !ruby/object:Gem::Dependency
116
+ name: addressable
118
117
  type: :development
119
- requirement: &id007 !ruby/object:Gem::Requirement
118
+ - !ruby/object:Gem::Dependency
119
+ version_requirements: &id007 !ruby/object:Gem::Requirement
120
120
  none: false
121
121
  requirements:
122
122
  - - ~>
@@ -127,12 +127,12 @@ dependencies:
127
127
  - 9
128
128
  - 2
129
129
  version: 2.9.2
130
- version_requirements: *id007
131
- name: shoulda
130
+ requirement: *id007
132
131
  prerelease: false
133
- - !ruby/object:Gem::Dependency
132
+ name: shoulda
134
133
  type: :development
135
- requirement: &id008 !ruby/object:Gem::Requirement
134
+ - !ruby/object:Gem::Dependency
135
+ version_requirements: &id008 !ruby/object:Gem::Requirement
136
136
  none: false
137
137
  requirements:
138
138
  - - ~>
@@ -142,12 +142,12 @@ dependencies:
142
142
  - 2
143
143
  - 6
144
144
  version: "2.6"
145
- version_requirements: *id008
146
- name: rspec
145
+ requirement: *id008
147
146
  prerelease: false
148
- - !ruby/object:Gem::Dependency
147
+ name: rspec
149
148
  type: :development
150
- requirement: &id009 !ruby/object:Gem::Requirement
149
+ - !ruby/object:Gem::Dependency
150
+ version_requirements: &id009 !ruby/object:Gem::Requirement
151
151
  none: false
152
152
  requirements:
153
153
  - - "="
@@ -158,12 +158,12 @@ dependencies:
158
158
  - 1
159
159
  - 0
160
160
  version: 1.1.0
161
- version_requirements: *id009
162
- name: rack
161
+ requirement: *id009
163
162
  prerelease: false
164
- - !ruby/object:Gem::Dependency
163
+ name: rack
165
164
  type: :development
166
- requirement: &id010 !ruby/object:Gem::Requirement
165
+ - !ruby/object:Gem::Dependency
166
+ version_requirements: &id010 !ruby/object:Gem::Requirement
167
167
  none: false
168
168
  requirements:
169
169
  - - "="
@@ -174,12 +174,12 @@ dependencies:
174
174
  - 2
175
175
  - 4
176
176
  version: 0.2.4
177
- version_requirements: *id010
178
- name: aruba
177
+ requirement: *id010
179
178
  prerelease: false
180
- - !ruby/object:Gem::Dependency
179
+ name: aruba
181
180
  type: :development
182
- requirement: &id011 !ruby/object:Gem::Requirement
181
+ - !ruby/object:Gem::Dependency
182
+ version_requirements: &id011 !ruby/object:Gem::Requirement
183
183
  none: false
184
184
  requirements:
185
185
  - - ~>
@@ -190,12 +190,12 @@ dependencies:
190
190
  - 1
191
191
  - 0
192
192
  version: 1.1.0
193
- version_requirements: *id011
194
- name: sinatra
193
+ requirement: *id011
195
194
  prerelease: false
196
- - !ruby/object:Gem::Dependency
195
+ name: sinatra
197
196
  type: :development
198
- requirement: &id012 !ruby/object:Gem::Requirement
197
+ - !ruby/object:Gem::Dependency
198
+ version_requirements: &id012 !ruby/object:Gem::Requirement
199
199
  none: false
200
200
  requirements:
201
201
  - - ~>
@@ -206,28 +206,28 @@ dependencies:
206
206
  - 0
207
207
  - 7
208
208
  version: 1.0.7
209
- version_requirements: *id012
210
- name: bundler
209
+ requirement: *id012
211
210
  prerelease: false
212
- - !ruby/object:Gem::Dependency
211
+ name: bundler
213
212
  type: :development
214
- requirement: &id013 !ruby/object:Gem::Requirement
213
+ - !ruby/object:Gem::Dependency
214
+ version_requirements: &id013 !ruby/object:Gem::Requirement
215
215
  none: false
216
216
  requirements:
217
217
  - - ~>
218
218
  - !ruby/object:Gem::Version
219
- hash: 3
219
+ hash: 13
220
220
  segments:
221
221
  - 0
222
222
  - 6
223
- - 2
224
- version: 0.6.2
225
- version_requirements: *id013
226
- name: excon
223
+ - 5
224
+ version: 0.6.5
225
+ requirement: *id013
227
226
  prerelease: false
228
- - !ruby/object:Gem::Dependency
227
+ name: excon
229
228
  type: :development
230
- requirement: &id014 !ruby/object:Gem::Requirement
229
+ - !ruby/object:Gem::Dependency
230
+ version_requirements: &id014 !ruby/object:Gem::Requirement
231
231
  none: false
232
232
  requirements:
233
233
  - - ~>
@@ -238,12 +238,12 @@ dependencies:
238
238
  - 9
239
239
  - 4
240
240
  version: 0.9.4
241
- version_requirements: *id014
242
- name: cucumber
241
+ requirement: *id014
243
242
  prerelease: false
244
- - !ruby/object:Gem::Dependency
243
+ name: cucumber
245
244
  type: :development
246
- requirement: &id015 !ruby/object:Gem::Requirement
245
+ - !ruby/object:Gem::Dependency
246
+ version_requirements: &id015 !ruby/object:Gem::Requirement
247
247
  none: false
248
248
  requirements:
249
249
  - - ~>
@@ -254,12 +254,12 @@ dependencies:
254
254
  - 6
255
255
  - 4
256
256
  version: 1.6.4
257
- version_requirements: *id015
258
- name: webmock
257
+ requirement: *id015
259
258
  prerelease: false
260
- - !ruby/object:Gem::Dependency
259
+ name: webmock
261
260
  type: :development
262
- requirement: &id016 !ruby/object:Gem::Requirement
261
+ - !ruby/object:Gem::Dependency
262
+ version_requirements: &id016 !ruby/object:Gem::Requirement
263
263
  none: false
264
264
  requirements:
265
265
  - - "="
@@ -270,12 +270,12 @@ dependencies:
270
270
  - 7
271
271
  - 8
272
272
  version: 0.7.8
273
- version_requirements: *id016
274
- name: curb
273
+ requirement: *id016
275
274
  prerelease: false
276
- - !ruby/object:Gem::Dependency
275
+ name: curb
277
276
  type: :development
278
- requirement: &id017 !ruby/object:Gem::Requirement
277
+ - !ruby/object:Gem::Dependency
278
+ version_requirements: &id017 !ruby/object:Gem::Requirement
279
279
  none: false
280
280
  requirements:
281
281
  - - "="
@@ -286,12 +286,12 @@ dependencies:
286
286
  - 4
287
287
  - 9
288
288
  version: 0.4.9
289
- version_requirements: *id017
290
- name: patron
289
+ requirement: *id017
291
290
  prerelease: false
292
- - !ruby/object:Gem::Dependency
291
+ name: patron
293
292
  type: :development
294
- requirement: &id018 !ruby/object:Gem::Requirement
293
+ - !ruby/object:Gem::Dependency
294
+ version_requirements: &id018 !ruby/object:Gem::Requirement
295
295
  none: false
296
296
  requirements:
297
297
  - - ~>
@@ -302,12 +302,12 @@ dependencies:
302
302
  - 3
303
303
  - 0
304
304
  version: 0.3.0
305
- version_requirements: *id018
306
- name: em-http-request
305
+ requirement: *id018
307
306
  prerelease: false
308
- - !ruby/object:Gem::Dependency
307
+ name: em-http-request
309
308
  type: :development
310
- requirement: &id019 !ruby/object:Gem::Requirement
309
+ - !ruby/object:Gem::Dependency
310
+ version_requirements: &id019 !ruby/object:Gem::Requirement
311
311
  none: false
312
312
  requirements:
313
313
  - - ~>
@@ -318,9 +318,10 @@ dependencies:
318
318
  - 2
319
319
  - 1
320
320
  version: 0.2.1
321
- version_requirements: *id019
322
- name: typhoeus
321
+ requirement: *id019
323
322
  prerelease: false
323
+ name: typhoeus
324
+ type: :development
324
325
  description: VCR provides a simple API to record and replay your test suite's HTTP interactions. It works with a variety of HTTP client libraries, HTTP stubbing libraries and testing frameworks.
325
326
  email: myron.marston@gmail.com
326
327
  executables: []
@@ -484,6 +485,7 @@ files:
484
485
  - spec/vcr/version_spec.rb
485
486
  - spec/vcr_spec.rb
486
487
  - vcr.gemspec
488
+ has_rdoc: true
487
489
  homepage: http://github.com/myronmarston/vcr
488
490
  licenses: []
489
491
 
@@ -517,7 +519,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
517
519
  requirements: []
518
520
 
519
521
  rubyforge_project:
520
- rubygems_version: 1.8.2
522
+ rubygems_version: 1.6.0
521
523
  signing_key:
522
524
  specification_version: 3
523
525
  summary: Record your test suite's HTTP interactions and replay them during future test runs for fast, deterministic, accurate tests.