rets 0.5.0 → 0.5.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.
- checksums.yaml +7 -0
- data/Manifest.txt +5 -0
- data/lib/rets.rb +1 -1
- data/lib/rets/client.rb +3 -0
- data/lib/rets/client_progress_reporter.rb +44 -0
- data/lib/rets/http_client.rb +75 -0
- data/lib/rets/locking_http_client.rb +34 -0
- data/lib/rets/measuring_http_client.rb +27 -0
- metadata +14 -28
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
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.
|
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-
|
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.
|
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.
|
110
|
+
version: '3.7'
|
126
111
|
description: ! '[](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.
|
177
|
+
rubygems_version: 2.1.10
|
192
178
|
signing_key:
|
193
|
-
specification_version:
|
179
|
+
specification_version: 4
|
194
180
|
summary: ! '[](http://travis-ci.org/estately/rets)
|
195
181
|
A pure-ruby library for fetching data from [RETS] servers'
|
196
182
|
test_files:
|