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.
Files changed (46) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +19 -0
  3. data/Manifest.txt +24 -0
  4. data/README.md +73 -1
  5. data/Rakefile +1 -1
  6. data/lib/rets.rb +202 -1
  7. data/lib/rets/client.rb +83 -94
  8. data/lib/rets/http_client.rb +42 -0
  9. data/lib/rets/metadata.rb +15 -3
  10. data/lib/rets/metadata/caching.rb +59 -0
  11. data/lib/rets/metadata/file_cache.rb +29 -0
  12. data/lib/rets/metadata/json_serializer.rb +27 -0
  13. data/lib/rets/metadata/lookup_table.rb +65 -0
  14. data/lib/rets/metadata/lookup_type.rb +3 -4
  15. data/lib/rets/metadata/marshal_serializer.rb +27 -0
  16. data/lib/rets/metadata/multi_lookup_table.rb +70 -0
  17. data/lib/rets/metadata/null_cache.rb +24 -0
  18. data/lib/rets/metadata/resource.rb +39 -29
  19. data/lib/rets/metadata/rets_class.rb +27 -23
  20. data/lib/rets/metadata/rets_object.rb +32 -0
  21. data/lib/rets/metadata/table.rb +9 -101
  22. data/lib/rets/metadata/table_factory.rb +19 -0
  23. data/lib/rets/metadata/yaml_serializer.rb +27 -0
  24. data/lib/rets/parser/compact.rb +61 -18
  25. data/lib/rets/parser/error_checker.rb +8 -1
  26. data/test/fixtures.rb +58 -0
  27. data/test/test_caching.rb +89 -0
  28. data/test/test_client.rb +44 -24
  29. data/test/test_error_checker.rb +18 -0
  30. data/test/test_file_cache.rb +42 -0
  31. data/test/test_http_client.rb +96 -60
  32. data/test/test_json_serializer.rb +26 -0
  33. data/test/test_marshal_serializer.rb +26 -0
  34. data/test/test_metadata.rb +62 -450
  35. data/test/test_metadata_class.rb +50 -0
  36. data/test/test_metadata_lookup_table.rb +21 -0
  37. data/test/test_metadata_lookup_type.rb +12 -0
  38. data/test/test_metadata_multi_lookup_table.rb +60 -0
  39. data/test/test_metadata_object.rb +20 -0
  40. data/test/test_metadata_resource.rb +140 -0
  41. data/test/test_metadata_root.rb +151 -0
  42. data/test/test_metadata_table.rb +21 -0
  43. data/test/test_metadata_table_factory.rb +24 -0
  44. data/test/test_parser_compact.rb +23 -28
  45. data/test/test_yaml_serializer.rb +26 -0
  46. 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
@@ -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 = %w(A B C D)
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 = %w(A B C D)
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(Nokogiri.parse(SAMPLE_COMPACT))
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(Nokogiri.parse(SAMPLE_COMPACT_2))
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.9.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: 2015-06-11 00:00:00.000000000 Z
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.6.0
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.6.0
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.2.3
221
+ rubygems_version: 2.4.5.1
198
222
  signing_key:
199
223
  specification_version: 4
200
224
  summary: "[![Build Status](https://secure.travis-ci.org/estately/rets.png?branch=master)](http://travis-ci.org/estately/rets)