rets 0.9.0 → 0.10.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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +19 -0
- data/Manifest.txt +24 -0
- data/README.md +73 -1
- data/Rakefile +1 -1
- data/lib/rets.rb +202 -1
- data/lib/rets/client.rb +83 -94
- data/lib/rets/http_client.rb +42 -0
- data/lib/rets/metadata.rb +15 -3
- data/lib/rets/metadata/caching.rb +59 -0
- data/lib/rets/metadata/file_cache.rb +29 -0
- data/lib/rets/metadata/json_serializer.rb +27 -0
- data/lib/rets/metadata/lookup_table.rb +65 -0
- data/lib/rets/metadata/lookup_type.rb +3 -4
- data/lib/rets/metadata/marshal_serializer.rb +27 -0
- data/lib/rets/metadata/multi_lookup_table.rb +70 -0
- data/lib/rets/metadata/null_cache.rb +24 -0
- data/lib/rets/metadata/resource.rb +39 -29
- data/lib/rets/metadata/rets_class.rb +27 -23
- data/lib/rets/metadata/rets_object.rb +32 -0
- data/lib/rets/metadata/table.rb +9 -101
- data/lib/rets/metadata/table_factory.rb +19 -0
- data/lib/rets/metadata/yaml_serializer.rb +27 -0
- data/lib/rets/parser/compact.rb +61 -18
- data/lib/rets/parser/error_checker.rb +8 -1
- data/test/fixtures.rb +58 -0
- data/test/test_caching.rb +89 -0
- data/test/test_client.rb +44 -24
- data/test/test_error_checker.rb +18 -0
- data/test/test_file_cache.rb +42 -0
- data/test/test_http_client.rb +96 -60
- data/test/test_json_serializer.rb +26 -0
- data/test/test_marshal_serializer.rb +26 -0
- data/test/test_metadata.rb +62 -450
- data/test/test_metadata_class.rb +50 -0
- data/test/test_metadata_lookup_table.rb +21 -0
- data/test/test_metadata_lookup_type.rb +12 -0
- data/test/test_metadata_multi_lookup_table.rb +60 -0
- data/test/test_metadata_object.rb +20 -0
- data/test/test_metadata_resource.rb +140 -0
- data/test/test_metadata_root.rb +151 -0
- data/test/test_metadata_table.rb +21 -0
- data/test/test_metadata_table_factory.rb +24 -0
- data/test/test_parser_compact.rb +23 -28
- data/test/test_yaml_serializer.rb +26 -0
- metadata +29 -5
@@ -0,0 +1,21 @@
|
|
1
|
+
require_relative "helper"
|
2
|
+
|
3
|
+
class TestMetadataTable < MiniTest::Test
|
4
|
+
def test_table_resolve_returns_empty_string_when_value_nil
|
5
|
+
table = Rets::Metadata::Table.new({}, "resource_id")
|
6
|
+
|
7
|
+
assert_equal "", table.resolve(nil)
|
8
|
+
end
|
9
|
+
|
10
|
+
def test_table_resolve_passes_values_straight_through
|
11
|
+
table = Rets::Metadata::Table.new({}, "resource_id")
|
12
|
+
|
13
|
+
assert_equal "Foo", table.resolve("Foo")
|
14
|
+
end
|
15
|
+
|
16
|
+
def test_table_resolve_passes_values_strips_extra_whitspace
|
17
|
+
table = Rets::Metadata::Table.new({}, "resource_id")
|
18
|
+
|
19
|
+
assert_equal "Foo", table.resolve(" Foo ")
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
require_relative "helper"
|
2
|
+
|
3
|
+
class TestMetadataTableFactory < MiniTest::Test
|
4
|
+
def test_table_factory_creates_mutli_lookup_table
|
5
|
+
table_fragment = {"LookupName" => "Foo", "Interpretation" => "LookupMulti"}
|
6
|
+
resource_id = "id"
|
7
|
+
lookup_types = {}
|
8
|
+
assert_instance_of Rets::Metadata::MultiLookupTable, Rets::Metadata::TableFactory.build(table_fragment, resource_id, lookup_types)
|
9
|
+
end
|
10
|
+
|
11
|
+
def test_table_factory_creates_lookup_table
|
12
|
+
table_fragment = {"LookupName" => "Foo", "Interpretation" => "Lookup"}
|
13
|
+
resource_id = "id"
|
14
|
+
lookup_types = {}
|
15
|
+
assert_instance_of Rets::Metadata::LookupTable, Rets::Metadata::TableFactory.build(table_fragment, resource_id, lookup_types)
|
16
|
+
end
|
17
|
+
|
18
|
+
def test_table_factory_creates_table
|
19
|
+
table_fragment = {"LookupName" => "", "Interpretation" => ""}
|
20
|
+
resource_id = "id"
|
21
|
+
lookup_types = {}
|
22
|
+
assert_instance_of Rets::Metadata::Table, Rets::Metadata::TableFactory.build(table_fragment, resource_id, lookup_types)
|
23
|
+
end
|
24
|
+
end
|
data/test/test_parser_compact.rb
CHANGED
@@ -7,14 +7,6 @@ class TestParserCompact < MiniTest::Test
|
|
7
7
|
end
|
8
8
|
end
|
9
9
|
|
10
|
-
def test_parse_document_uses_default_delimiter_when_none_provided
|
11
|
-
# we assert that the delimeter character getting to parse is a tab
|
12
|
-
# even though COMPACT defines no delimiter tag
|
13
|
-
Rets::Parser::Compact.expects(:parse_row).with(%w(A B), "1\t2", /\t/)
|
14
|
-
Rets::Parser::Compact.expects(:parse_row).with(%w(A B), "4\t5", /\t/)
|
15
|
-
Rets::Parser::Compact.parse_document(COMPACT)
|
16
|
-
end
|
17
|
-
|
18
10
|
def test_parse_document_delegates_to_parse
|
19
11
|
result = Rets::Parser::Compact.parse_document(COMPACT)
|
20
12
|
|
@@ -29,33 +21,19 @@ class TestParserCompact < MiniTest::Test
|
|
29
21
|
end
|
30
22
|
end
|
31
23
|
|
32
|
-
def test_parse_returns_key_value_pairs
|
33
|
-
result = Rets::Parser::Compact.parse_row(%w(A B), "1\t2")
|
34
|
-
|
35
|
-
assert_equal({"A" => "1", "B" => "2"}, result)
|
36
|
-
end
|
37
|
-
|
38
24
|
# RMLS does this. :|
|
39
25
|
def test_remaining_columns_produce_empty_string_values
|
40
|
-
column_names =
|
26
|
+
column_names = "A B C D"
|
41
27
|
data = "1 2"
|
42
28
|
|
43
|
-
assert_equal({"A" => "1", "B" => "2", "C" => "", "D" => ""},
|
44
|
-
Rets::Parser::Compact.parse_row(column_names, data, / /))
|
29
|
+
assert_equal({"A" => "1", "B" => "2", "C" => "", "D" => ""}, Rets::Parser::Compact.parse(column_names, data, ' '))
|
45
30
|
end
|
46
31
|
|
47
32
|
def test_leading_empty_columns_are_preserved_with_delimiter
|
48
|
-
column_names =
|
33
|
+
column_names = "A\tB\tC\tD"
|
49
34
|
data = "\t\t3\t4" # first two columns are empty data.
|
50
35
|
|
51
|
-
assert_equal({"A" => "", "B" => "", "C" => "3", "D" => "4"},
|
52
|
-
Rets::Parser::Compact.parse_row(column_names, data, /\t/))
|
53
|
-
end
|
54
|
-
|
55
|
-
def test_parse_only_accepts_regexp
|
56
|
-
assert_raises ArgumentError do
|
57
|
-
Rets::Parser::Compact.parse_row(["a"], "b", " ")
|
58
|
-
end
|
36
|
+
assert_equal({"A" => "", "B" => "", "C" => "3", "D" => "4"}, Rets::Parser::Compact.parse(column_names, data, "\t"))
|
59
37
|
end
|
60
38
|
|
61
39
|
def test_parse_empty_document
|
@@ -73,18 +51,29 @@ class TestParserCompact < MiniTest::Test
|
|
73
51
|
assert_equal 0, count
|
74
52
|
end
|
75
53
|
|
54
|
+
def test_get_count_with_unrecognized_document
|
55
|
+
count = Rets::Parser::Compact.get_count("")
|
56
|
+
assert_equal 0, count
|
57
|
+
end
|
58
|
+
|
76
59
|
def test_parse_example
|
77
|
-
rows = Rets::Parser::Compact.parse_document(
|
60
|
+
rows = Rets::Parser::Compact.parse_document(SAMPLE_COMPACT)
|
78
61
|
|
79
62
|
assert_equal "7", rows.first["MetadataEntryID"]
|
80
63
|
end
|
81
64
|
|
82
65
|
def test_parse_example_2
|
83
|
-
rows = Rets::Parser::Compact.parse_document(
|
66
|
+
rows = Rets::Parser::Compact.parse_document(SAMPLE_COMPACT_2)
|
84
67
|
|
85
68
|
assert_equal "", rows.first["ModTimeStamp"]
|
86
69
|
end
|
87
70
|
|
71
|
+
def test_parse_with_changed_delimiter
|
72
|
+
rows = Rets::Parser::Compact.parse_document(CHANGED_DELIMITER)
|
73
|
+
|
74
|
+
assert_equal [{"A" => "1", "B" => "2"}, {"A" => "4", "B" => "5"}], rows
|
75
|
+
end
|
76
|
+
|
88
77
|
def test_parse_html_encoded_chars
|
89
78
|
rows = Rets::Parser::Compact.parse_document(SAMPLE_COMPACT_WITH_SPECIAL_CHARS)
|
90
79
|
|
@@ -96,4 +85,10 @@ class TestParserCompact < MiniTest::Test
|
|
96
85
|
|
97
86
|
assert_equal "text with <tag>", rows.last["PublicRemarksNew"]
|
98
87
|
end
|
88
|
+
|
89
|
+
def test_parse_property_with_lots_of_columns
|
90
|
+
row = Rets::Parser::Compact.parse_document(SAMPLE_PROPERTY_WITH_LOTS_OF_COLUMNS).first
|
91
|
+
assert_equal 800, row.keys.size
|
92
|
+
assert_equal 800.times.map { |x| "K%03d" % x }, row.keys
|
93
|
+
end
|
99
94
|
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
require_relative "helper"
|
2
|
+
|
3
|
+
require "stringio"
|
4
|
+
|
5
|
+
class TestYamlSerializer < MiniTest::Test
|
6
|
+
|
7
|
+
def setup
|
8
|
+
@serializer = Rets::Metadata::YamlSerializer.new
|
9
|
+
end
|
10
|
+
|
11
|
+
def test_round_trip
|
12
|
+
metadata = {"foo" => "bar"}
|
13
|
+
file = StringIO.new
|
14
|
+
@serializer.save(file, metadata)
|
15
|
+
file.rewind
|
16
|
+
loaded = @serializer.load(file)
|
17
|
+
assert_equal metadata, loaded
|
18
|
+
end
|
19
|
+
|
20
|
+
def test_bad_data
|
21
|
+
file = StringIO.new("\x01")
|
22
|
+
loaded = @serializer.load(file)
|
23
|
+
assert_nil loaded
|
24
|
+
end
|
25
|
+
|
26
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rets
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.10.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Estately, Inc. Open Source
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2016-02-29 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: httpclient
|
@@ -16,14 +16,14 @@ dependencies:
|
|
16
16
|
requirements:
|
17
17
|
- - "~>"
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: 2.
|
19
|
+
version: 2.7.0
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
24
|
- - "~>"
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version: 2.
|
26
|
+
version: 2.7.0
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: http-cookie
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
@@ -153,24 +153,48 @@ files:
|
|
153
153
|
- lib/rets/locking_http_client.rb
|
154
154
|
- lib/rets/measuring_http_client.rb
|
155
155
|
- lib/rets/metadata.rb
|
156
|
+
- lib/rets/metadata/caching.rb
|
156
157
|
- lib/rets/metadata/containers.rb
|
158
|
+
- lib/rets/metadata/file_cache.rb
|
159
|
+
- lib/rets/metadata/json_serializer.rb
|
160
|
+
- lib/rets/metadata/lookup_table.rb
|
157
161
|
- lib/rets/metadata/lookup_type.rb
|
162
|
+
- lib/rets/metadata/marshal_serializer.rb
|
163
|
+
- lib/rets/metadata/multi_lookup_table.rb
|
164
|
+
- lib/rets/metadata/null_cache.rb
|
158
165
|
- lib/rets/metadata/resource.rb
|
159
166
|
- lib/rets/metadata/rets_class.rb
|
167
|
+
- lib/rets/metadata/rets_object.rb
|
160
168
|
- lib/rets/metadata/root.rb
|
161
169
|
- lib/rets/metadata/table.rb
|
170
|
+
- lib/rets/metadata/table_factory.rb
|
171
|
+
- lib/rets/metadata/yaml_serializer.rb
|
162
172
|
- lib/rets/parser/compact.rb
|
163
173
|
- lib/rets/parser/error_checker.rb
|
164
174
|
- lib/rets/parser/multipart.rb
|
165
175
|
- test/fixtures.rb
|
166
176
|
- test/helper.rb
|
177
|
+
- test/test_caching.rb
|
167
178
|
- test/test_client.rb
|
168
179
|
- test/test_error_checker.rb
|
180
|
+
- test/test_file_cache.rb
|
169
181
|
- test/test_http_client.rb
|
182
|
+
- test/test_json_serializer.rb
|
170
183
|
- test/test_locking_http_client.rb
|
184
|
+
- test/test_marshal_serializer.rb
|
171
185
|
- test/test_metadata.rb
|
186
|
+
- test/test_metadata_class.rb
|
187
|
+
- test/test_metadata_lookup_table.rb
|
188
|
+
- test/test_metadata_lookup_type.rb
|
189
|
+
- test/test_metadata_multi_lookup_table.rb
|
190
|
+
- test/test_metadata_object.rb
|
191
|
+
- test/test_metadata_resource.rb
|
192
|
+
- test/test_metadata_root.rb
|
193
|
+
- test/test_metadata_table.rb
|
194
|
+
- test/test_metadata_table_factory.rb
|
172
195
|
- test/test_parser_compact.rb
|
173
196
|
- test/test_parser_multipart.rb
|
197
|
+
- test/test_yaml_serializer.rb
|
174
198
|
- test/vcr_cassettes/unauthorized_response.yml
|
175
199
|
homepage: http://github.com/estately/rets
|
176
200
|
licenses:
|
@@ -194,7 +218,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
194
218
|
version: '0'
|
195
219
|
requirements: []
|
196
220
|
rubyforge_project:
|
197
|
-
rubygems_version: 2.
|
221
|
+
rubygems_version: 2.4.5.1
|
198
222
|
signing_key:
|
199
223
|
specification_version: 4
|
200
224
|
summary: "[](http://travis-ci.org/estately/rets)
|