rets 0.5.0 → 0.5.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 56d0e6818b0033682fe65525f1c73a2eb4ae42bb
4
+ data.tar.gz: ee6fea4f6d3f028cd6247fb75896e5d70a6abe73
5
+ SHA512:
6
+ metadata.gz: 56b3c73c03e27236c1e99c13de713af4b45472e6853637bbfb77e90189c7e5a438ec13b8ad5cd0b9c2ada381f1d79bae72592cb3daab6067547a949f5fab51c0
7
+ data.tar.gz: 6b67b8bd34c923e54b49232f161d4daf8662c8fd86899f87b02951d75d6eae9bb5bd19c7f42e0c2667ce41d8dbf949794cd5748762315a3feae8c40052e8afb9
data/Manifest.txt CHANGED
@@ -5,6 +5,10 @@ Rakefile
5
5
  bin/rets
6
6
  lib/rets.rb
7
7
  lib/rets/client.rb
8
+ lib/rets/client_progress_reporter.rb
9
+ lib/rets/http_client.rb
10
+ lib/rets/locking_http_client.rb
11
+ lib/rets/measuring_http_client.rb
8
12
  lib/rets/metadata.rb
9
13
  lib/rets/metadata/containers.rb
10
14
  lib/rets/metadata/lookup_type.rb
@@ -17,6 +21,7 @@ lib/rets/parser/multipart.rb
17
21
  test/fixtures.rb
18
22
  test/helper.rb
19
23
  test/test_client.rb
24
+ test/test_locking_http_client.rb
20
25
  test/test_metadata.rb
21
26
  test/test_parser_compact.rb
22
27
  test/test_parser_multipart.rb
data/lib/rets.rb CHANGED
@@ -3,7 +3,7 @@ require 'digest/md5'
3
3
  require 'nokogiri'
4
4
 
5
5
  module Rets
6
- VERSION = '0.5.0'
6
+ VERSION = '0.5.1'
7
7
 
8
8
  MalformedResponse = Class.new(ArgumentError)
9
9
  UnknownResponse = Class.new(ArgumentError)
data/lib/rets/client.rb CHANGED
@@ -48,6 +48,9 @@ module Rets
48
48
  # RETS server provides, per http://retsdoc.onconfluence.com/display/rets172/4.10+Capability+URL+List.
49
49
  def login
50
50
  res = http_get(login_url)
51
+ unless res.status_code == 200
52
+ raise UnknownResponse, "bad response to login, expected a 200, but got #{res.status_code}. Body was #{res.body}."
53
+ end
51
54
  self.capabilities = extract_capabilities(Nokogiri.parse(res.body))
52
55
  raise UnknownResponse, "Cannot read rets server capabilities." unless @capabilities
53
56
  @capabilities
@@ -0,0 +1,44 @@
1
+ module Rets
2
+ class NullStatsReporter
3
+ def time(metric_name, &block)
4
+ block.call
5
+ end
6
+
7
+ def gauge(metric_name, measurement)
8
+ end
9
+
10
+ def count(metric_name, count=1)
11
+ end
12
+ end
13
+
14
+ class ClientProgressReporter
15
+ def initialize(logger, stats, stats_prefix)
16
+ @logger = logger
17
+ @stats = stats || NullStatsReporter.new
18
+ @stats_prefix = stats_prefix
19
+ end
20
+
21
+ def find_with_retries_failed_a_retry(exception, retries)
22
+ @stats.count("#{@stats_prefix}find_with_retries_failed_retry")
23
+ @logger.warn("Rets::Client: Failed with message: #{exception.message}")
24
+ @logger.info("Rets::Client: Retry #{retries}/3")
25
+ end
26
+
27
+ def find_with_retries_exceeded_retry_count(exception)
28
+ @stats.count("#{@stats_prefix}find_with_retries_exceeded_retry_count")
29
+ end
30
+
31
+ def could_not_resolve_find_metadata(key)
32
+ @stats.count("#{@stats_prefix}could_not_resolve_find_metadata")
33
+ @logger.warn "Rets::Client: Can't resolve find metadata for #{key.inspect}"
34
+ end
35
+
36
+ def use_cached_metadata
37
+ @logger.info "Rets::Client: Use cached metadata"
38
+ end
39
+
40
+ def bad_cached_metadata(cached_metadata)
41
+ @logger.info cached_metadata ? "Rets::Client: Cached metadata out of date" : "Rets::Client: Cached metadata unavailable"
42
+ end
43
+ end
44
+ end
@@ -0,0 +1,75 @@
1
+ module Rets
2
+ class HttpClient
3
+ attr_reader :http, :options, :logger, :login_url
4
+
5
+ def initialize(http, options, logger, login_url)
6
+ @http = http
7
+ @options = options
8
+ @logger = logger
9
+ @login_url = login_url
10
+ end
11
+
12
+ def http_get(url, params=nil, extra_headers={})
13
+ http.set_auth(url, options[:username], options[:password])
14
+ headers = extra_headers.merge(rets_extra_headers)
15
+ res = http.get(url, params, headers)
16
+ log_http_traffic("POST", url, params, headers, res)
17
+ Client::ErrorChecker.check(res)
18
+ res
19
+ end
20
+
21
+ def http_post(url, params, extra_headers = {})
22
+ http.set_auth(url, options[:username], options[:password])
23
+ headers = extra_headers.merge(rets_extra_headers)
24
+ res = http.post(url, params, headers)
25
+ log_http_traffic("POST", url, params, headers, res)
26
+ Client::ErrorChecker.check(res)
27
+ res
28
+ end
29
+
30
+ def save_cookie_store(force=nil)
31
+ if options[:cookie_store]
32
+ if force
33
+ @http.cookie_manager.save_all_cookies(true, true, true)
34
+ else
35
+ @http.save_cookie_store
36
+ end
37
+ end
38
+ end
39
+
40
+ def log_http_traffic(method, url, params, headers, res)
41
+ return unless logger.debug?
42
+ logger.debug "Rets::Client >> #{method} #{url}"
43
+ logger.debug "Rets::Client >> params = #{params.inspect}"
44
+ logger.debug "Rets::Client >> headers = #{headers.inspect}"
45
+ logger.debug "Rets::Client << Status #{res.status_code}"
46
+ res.headers.each { |k, v| logger.debug "Rets::Client << #{k}: #{v}" }
47
+ end
48
+
49
+ def rets_extra_headers
50
+ user_agent = options[:agent] || "Client/1.0"
51
+ rets_version = options[:version] || "RETS/1.7.2"
52
+
53
+ headers = {
54
+ "User-Agent" => user_agent,
55
+ "RETS-Version" => rets_version
56
+ }
57
+
58
+ if options[:ua_password]
59
+ up = Digest::MD5.hexdigest "#{user_agent}:#{options[:ua_password]}"
60
+ session_id = http_cookie('RETS-Session-ID') || ''
61
+ digest = Digest::MD5.hexdigest "#{up}::#{session_id}:#{rets_version}"
62
+ headers.merge!("RETS-UA-Authorization" => "Digest #{digest}")
63
+ end
64
+
65
+ headers
66
+ end
67
+
68
+ def http_cookie(name)
69
+ http.cookies.each do |c|
70
+ return c.value if c.name.downcase == name.downcase && c.match?(URI.parse(login_url))
71
+ end
72
+ nil
73
+ end
74
+ end
75
+ end
@@ -0,0 +1,34 @@
1
+ module Rets
2
+ class LockingHttpClient
3
+ def initialize(http_client, locker, lock_name, options={})
4
+ @http_client = http_client
5
+ @locker = locker
6
+ @lock_name = lock_name
7
+ @options = options
8
+ end
9
+
10
+ def http_get(url, params=nil, extra_headers={})
11
+ lock_around do
12
+ @http_client.http_get(url, params, extra_headers)
13
+ end
14
+ end
15
+
16
+ def http_post(url, params, extra_headers = {})
17
+ lock_around do
18
+ @http_client.http_post(url, params, extra_headers)
19
+ end
20
+ end
21
+
22
+ def save_cookie_store(force=nil)
23
+ @http_client.save_cookie_store(force)
24
+ end
25
+
26
+ def lock_around(&block)
27
+ result = nil
28
+ @locker.lock(@lock_name, @options) do
29
+ result = block.call
30
+ end
31
+ result
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,27 @@
1
+ module Rets
2
+ class MeasuringHttpClient
3
+ def initialize(http_client, stats, prefix)
4
+ @http_client = http_client
5
+ @stats = stats
6
+ @prefix = prefix
7
+ end
8
+
9
+ def http_get(url, params=nil, extra_headers={})
10
+ @stats.count("#{@prefix}.http_get_rate")
11
+ @stats.time("#{@prefix}.http_get") do
12
+ @http_client.http_get(url, params, extra_headers)
13
+ end
14
+ end
15
+
16
+ def http_post(url, params, extra_headers = {})
17
+ @stats.count("#{@prefix}.http_post_rate")
18
+ @stats.time("#{@prefix}.http_post") do
19
+ @http_client.http_post(url, params, extra_headers)
20
+ end
21
+ end
22
+
23
+ def save_cookie_store(force=nil)
24
+ @http_client.save_cookie_store(force)
25
+ end
26
+ end
27
+ end
metadata CHANGED
@@ -1,20 +1,18 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rets
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.0
5
- prerelease:
4
+ version: 0.5.1
6
5
  platform: ruby
7
6
  authors:
8
7
  - Estately, Inc. Open Source
9
8
  autorequire:
10
9
  bindir: bin
11
10
  cert_chain: []
12
- date: 2013-09-06 00:00:00.000000000 Z
11
+ date: 2013-10-30 00:00:00.000000000 Z
13
12
  dependencies:
14
13
  - !ruby/object:Gem::Dependency
15
14
  name: httpclient
16
15
  requirement: !ruby/object:Gem::Requirement
17
- none: false
18
16
  requirements:
19
17
  - - ~>
20
18
  - !ruby/object:Gem::Version
@@ -22,7 +20,6 @@ dependencies:
22
20
  type: :runtime
23
21
  prerelease: false
24
22
  version_requirements: !ruby/object:Gem::Requirement
25
- none: false
26
23
  requirements:
27
24
  - - ~>
28
25
  - !ruby/object:Gem::Version
@@ -30,7 +27,6 @@ dependencies:
30
27
  - !ruby/object:Gem::Dependency
31
28
  name: nokogiri
32
29
  requirement: !ruby/object:Gem::Requirement
33
- none: false
34
30
  requirements:
35
31
  - - ~>
36
32
  - !ruby/object:Gem::Version
@@ -38,7 +34,6 @@ dependencies:
38
34
  type: :runtime
39
35
  prerelease: false
40
36
  version_requirements: !ruby/object:Gem::Requirement
41
- none: false
42
37
  requirements:
43
38
  - - ~>
44
39
  - !ruby/object:Gem::Version
@@ -46,7 +41,6 @@ dependencies:
46
41
  - !ruby/object:Gem::Dependency
47
42
  name: rdoc
48
43
  requirement: !ruby/object:Gem::Requirement
49
- none: false
50
44
  requirements:
51
45
  - - ~>
52
46
  - !ruby/object:Gem::Version
@@ -54,7 +48,6 @@ dependencies:
54
48
  type: :development
55
49
  prerelease: false
56
50
  version_requirements: !ruby/object:Gem::Requirement
57
- none: false
58
51
  requirements:
59
52
  - - ~>
60
53
  - !ruby/object:Gem::Version
@@ -62,7 +55,6 @@ dependencies:
62
55
  - !ruby/object:Gem::Dependency
63
56
  name: mocha
64
57
  requirement: !ruby/object:Gem::Requirement
65
- none: false
66
58
  requirements:
67
59
  - - ~>
68
60
  - !ruby/object:Gem::Version
@@ -70,7 +62,6 @@ dependencies:
70
62
  type: :development
71
63
  prerelease: false
72
64
  version_requirements: !ruby/object:Gem::Requirement
73
- none: false
74
65
  requirements:
75
66
  - - ~>
76
67
  - !ruby/object:Gem::Version
@@ -78,7 +69,6 @@ dependencies:
78
69
  - !ruby/object:Gem::Dependency
79
70
  name: vcr
80
71
  requirement: !ruby/object:Gem::Requirement
81
- none: false
82
72
  requirements:
83
73
  - - ~>
84
74
  - !ruby/object:Gem::Version
@@ -86,7 +76,6 @@ dependencies:
86
76
  type: :development
87
77
  prerelease: false
88
78
  version_requirements: !ruby/object:Gem::Requirement
89
- none: false
90
79
  requirements:
91
80
  - - ~>
92
81
  - !ruby/object:Gem::Version
@@ -94,7 +83,6 @@ dependencies:
94
83
  - !ruby/object:Gem::Dependency
95
84
  name: webmock
96
85
  requirement: !ruby/object:Gem::Requirement
97
- none: false
98
86
  requirements:
99
87
  - - ~>
100
88
  - !ruby/object:Gem::Version
@@ -102,7 +90,6 @@ dependencies:
102
90
  type: :development
103
91
  prerelease: false
104
92
  version_requirements: !ruby/object:Gem::Requirement
105
- none: false
106
93
  requirements:
107
94
  - - ~>
108
95
  - !ruby/object:Gem::Version
@@ -110,19 +97,17 @@ dependencies:
110
97
  - !ruby/object:Gem::Dependency
111
98
  name: hoe
112
99
  requirement: !ruby/object:Gem::Requirement
113
- none: false
114
100
  requirements:
115
101
  - - ~>
116
102
  - !ruby/object:Gem::Version
117
- version: '3.6'
103
+ version: '3.7'
118
104
  type: :development
119
105
  prerelease: false
120
106
  version_requirements: !ruby/object:Gem::Requirement
121
- none: false
122
107
  requirements:
123
108
  - - ~>
124
109
  - !ruby/object:Gem::Version
125
- version: '3.6'
110
+ version: '3.7'
126
111
  description: ! '[![Build Status](https://secure.travis-ci.org/estately/rets.png?branch=master)](http://travis-ci.org/estately/rets)
127
112
 
128
113
  A pure-ruby library for fetching data from [RETS] servers.
@@ -146,6 +131,10 @@ files:
146
131
  - bin/rets
147
132
  - lib/rets.rb
148
133
  - lib/rets/client.rb
134
+ - lib/rets/client_progress_reporter.rb
135
+ - lib/rets/http_client.rb
136
+ - lib/rets/locking_http_client.rb
137
+ - lib/rets/measuring_http_client.rb
149
138
  - lib/rets/metadata.rb
150
139
  - lib/rets/metadata/containers.rb
151
140
  - lib/rets/metadata/lookup_type.rb
@@ -158,13 +147,15 @@ files:
158
147
  - test/fixtures.rb
159
148
  - test/helper.rb
160
149
  - test/test_client.rb
150
+ - test/test_locking_http_client.rb
161
151
  - test/test_metadata.rb
162
152
  - test/test_parser_compact.rb
163
153
  - test/test_parser_multipart.rb
164
- - test/test_locking_http_client.rb
165
154
  - .gemtest
166
155
  homepage: http://github.com/estately/rets
167
- licenses: []
156
+ licenses:
157
+ - MIT
158
+ metadata: {}
168
159
  post_install_message:
169
160
  rdoc_options:
170
161
  - --main
@@ -172,25 +163,20 @@ rdoc_options:
172
163
  require_paths:
173
164
  - lib
174
165
  required_ruby_version: !ruby/object:Gem::Requirement
175
- none: false
176
166
  requirements:
177
167
  - - ! '>='
178
168
  - !ruby/object:Gem::Version
179
169
  version: '0'
180
- segments:
181
- - 0
182
- hash: -2023944965655718483
183
170
  required_rubygems_version: !ruby/object:Gem::Requirement
184
- none: false
185
171
  requirements:
186
172
  - - ! '>='
187
173
  - !ruby/object:Gem::Version
188
174
  version: '0'
189
175
  requirements: []
190
176
  rubyforge_project: rets
191
- rubygems_version: 1.8.23
177
+ rubygems_version: 2.1.10
192
178
  signing_key:
193
- specification_version: 3
179
+ specification_version: 4
194
180
  summary: ! '[![Build Status](https://secure.travis-ci.org/estately/rets.png?branch=master)](http://travis-ci.org/estately/rets)
195
181
  A pure-ruby library for fetching data from [RETS] servers'
196
182
  test_files: