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