couch_tap 0.0.2

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.
@@ -0,0 +1,55 @@
1
+ require 'test_helper'
2
+
3
+ module Destroyers
4
+ class CollectionTest < Test::Unit::TestCase
5
+
6
+ def setup
7
+ @parent = mock()
8
+ end
9
+
10
+ def test_initialize_collection
11
+ @collection = CouchTap::Destroyers::Collection.new(@parent) do
12
+ # nothing
13
+ end
14
+ assert_equal @collection.parent, @parent
15
+ end
16
+
17
+ def test_raise_error_if_no_block
18
+ assert_raise ArgumentError do
19
+ @collection = CouchTap::Destroyers::Collection.new(@parent)
20
+ end
21
+ end
22
+
23
+ def test_defining_table
24
+ @table = mock()
25
+ CouchTap::Destroyers::Table.expects(:new).with(@parent, :invoice_items, {}).returns(@table)
26
+ @collection = CouchTap::Destroyers::Collection.new(@parent) do
27
+ table :invoice_items
28
+ end
29
+ tables = @collection.instance_eval("@_tables")
30
+ assert_equal tables.length, 1
31
+ assert_equal tables.first, @table
32
+ end
33
+
34
+ def test_defining_tables
35
+ CouchTap::Destroyers::Table.expects(:new).twice
36
+ @collection = CouchTap::Destroyers::Collection.new(@parent) do
37
+ table :invoice_items
38
+ table :invoice_entries
39
+ end
40
+ tables = @collection.instance_eval("@_tables")
41
+ assert_equal tables.length, 2
42
+ end
43
+
44
+ def test_execution
45
+ @table = mock()
46
+ CouchTap::Destroyers::Table.expects(:new).returns(@table)
47
+ @collection = CouchTap::Destroyers::Collection.new(@parent) do
48
+ table :invoice_items
49
+ end
50
+ @table.expects(:execute)
51
+ @collection.execute
52
+ end
53
+
54
+ end
55
+ end
@@ -0,0 +1,120 @@
1
+
2
+ require 'test_helper'
3
+
4
+ module Destroyers
5
+ class TableTest < Test::Unit::TestCase
6
+
7
+ def setup
8
+ @database = create_database
9
+ @changes = mock()
10
+ @changes.stubs(:database).returns(@database)
11
+ @changes.stubs(:schema).returns(CouchTap::Schema.new(@database, :items))
12
+ @handler = CouchTap::DocumentHandler.new(@changes)
13
+ @handler.document = {'_id' => '12345'}
14
+ end
15
+
16
+ def test_init
17
+ keys = []
18
+ @handler.expects(:primary_keys).returns(keys)
19
+ @row = CouchTap::Destroyers::Table.new(@handler, 'items')
20
+
21
+ assert_not_equal keys, @row.primary_keys
22
+ assert_equal @row.primary_keys, [:item_id]
23
+ end
24
+
25
+ def test_init_override_primary_key
26
+ @row = CouchTap::Destroyers::Table.new(@handler, 'items', :primary_key => 'foo_item_id')
27
+ assert_equal @row.primary_keys, [:foo_item_id]
28
+ end
29
+
30
+ def test_handler
31
+ @row = CouchTap::Destroyers::Table.new(@handler, :items)
32
+ assert_equal @row.handler, @handler
33
+ end
34
+
35
+ def test_key_filter
36
+ @row = CouchTap::Destroyers::Table.new(@handler, :items)
37
+ assert_equal @row.key_filter, {:item_id => '12345'}
38
+ end
39
+
40
+ def test_defining_collections
41
+ @row = CouchTap::Destroyers::Table.new @handler, :groups do
42
+ collection :items do
43
+ # Nothing
44
+ end
45
+ end
46
+ assert_equal @row.instance_eval("@_collections.length"), 1
47
+ end
48
+
49
+ def test_defining_multiple_collections
50
+ @row = CouchTap::Destroyers::Table.new @handler, :groups do
51
+ collection :items do
52
+ # Nothing
53
+ end
54
+ collection :groups do
55
+ # Nothing
56
+ end
57
+ end
58
+ assert_equal @row.instance_eval("@_collections.length"), 2
59
+ end
60
+
61
+ def test_execution_deletes_rows
62
+ @database[:items].insert(:name => "Test Item 1", :item_id => "12345")
63
+ assert_equal @database[:items].count, 1, "Did not create sample row correctly!"
64
+ @row = CouchTap::Destroyers::Table.new(@handler, :items)
65
+ @row.execute
66
+ assert_equal 0, @database[:items].count
67
+ end
68
+
69
+ def test_execution_on_collections
70
+ @col = mock()
71
+ CouchTap::Destroyers::Collection.expects(:new).twice.returns(@col)
72
+ @row = CouchTap::Destroyers::Table.new @handler, :groups do
73
+ collection :items do
74
+ # Nothing
75
+ end
76
+ collection :groups do
77
+ # Nothing
78
+ end
79
+ end
80
+ @col.expects(:execute).twice
81
+ @row.execute
82
+ end
83
+
84
+ def test_column_returns_nil
85
+ @row = CouchTap::Destroyers::Table.new @handler, :item
86
+ assert_nil @row.column
87
+ end
88
+
89
+ def test_document_returns_empty
90
+ @row = CouchTap::Destroyers::Table.new @handler, :item
91
+ assert_empty @row.document
92
+ assert_empty @row.doc
93
+ end
94
+
95
+ def test_data_returns_empty
96
+ @row = CouchTap::Destroyers::Table.new @handler, :item
97
+ assert_empty @row.data
98
+ end
99
+
100
+
101
+ protected
102
+
103
+ def create_database
104
+ database = Sequel.sqlite
105
+ database.create_table :items do
106
+ String :item_id
107
+ String :name
108
+ Time :created_at
109
+ index :item_id, :unique => true
110
+ end
111
+ database.create_table :groups do
112
+ String :group_id
113
+ String :name
114
+ Time :created_at
115
+ index :group_id, :unique => true
116
+ end
117
+ database
118
+ end
119
+ end
120
+ end
@@ -0,0 +1,80 @@
1
+
2
+ require 'test_helper'
3
+
4
+ class DocumentHandlerTest < Test::Unit::TestCase
5
+
6
+ def test_init
7
+ @handler = CouchTap::DocumentHandler.new 'changes' do
8
+ #nothing
9
+ end
10
+ assert_equal @handler.changes, 'changes'
11
+ end
12
+
13
+ def test_handles_with_basic_hash
14
+ @handler = CouchTap::DocumentHandler.new 'changes', :type => 'Item'
15
+ doc = {'type' => 'Item', '_id' => '1234'}
16
+ assert @handler.handles?(doc)
17
+ doc = {'type' => 'Client', '_id' => '1234'}
18
+ assert !@handler.handles?(doc)
19
+ end
20
+
21
+ def test_handles_with_multi_level_hash
22
+ @handler = CouchTap::DocumentHandler.new 'changes', :type => 'Item', :foo => 'bar'
23
+ doc = {'type' => 'Item', 'foo' => 'bar', '_id' => '1234'}
24
+ assert @handler.handles?(doc)
25
+ doc = {'type' => 'Item', '_id' => '1234'}
26
+ assert !@handler.handles?(doc)
27
+ doc = {'foor' => 'bar', '_id' => '1234'}
28
+ assert !@handler.handles?(doc)
29
+ end
30
+
31
+ def test_id
32
+ @handler = CouchTap::DocumentHandler.new 'changes' do
33
+ table :items
34
+ end
35
+ @handler.document = {'_id' => '12345'}
36
+ assert_equal @handler.id, '12345'
37
+ end
38
+
39
+ def test_insert
40
+ @handler = CouchTap::DocumentHandler.new 'changes' do
41
+ table :items
42
+ end
43
+ @handler.expects(:table).with(:items)
44
+ doc = {'type' => 'Foo', '_id' => '1234'}
45
+ @handler.insert(doc)
46
+ assert_equal @handler.document, doc
47
+ end
48
+
49
+ def test_delete
50
+ @handler = CouchTap::DocumentHandler.new 'changes' do
51
+ table :items
52
+ end
53
+ @handler.expects(:table).with(:items)
54
+ @handler.delete('_id' => '1234')
55
+ assert_equal @handler.id, '1234'
56
+ end
57
+
58
+ def test_table_definition_on_delete
59
+ @handler = CouchTap::DocumentHandler.new 'changes' do
60
+ @mode = :delete # Force delete mode!
61
+ end
62
+ @handler.instance_eval("@mode = :delete")
63
+ @table = mock()
64
+ @table.expects(:execute)
65
+ CouchTap::Destroyers::Table.expects(:new).with(@handler, :items, {}).returns(@table)
66
+ @handler.table(:items)
67
+ end
68
+
69
+ def test_table_definition_on_insert
70
+ @handler = CouchTap::DocumentHandler.new 'changes' do
71
+ # Force insert mode!
72
+ end
73
+ @handler.instance_eval("@mode = :insert")
74
+ @table = mock()
75
+ @table.expects(:execute)
76
+ CouchTap::Builders::Table.expects(:new).with(@handler, :items, {}).returns(@table)
77
+ @handler.table(:items)
78
+ end
79
+
80
+ end
@@ -0,0 +1,52 @@
1
+ require 'test_helper'
2
+
3
+ class SchemaTest < Test::Unit::TestCase
4
+
5
+ def test_init
6
+ database = create_database
7
+ @schema = CouchTap::Schema.new(database, 'items')
8
+
9
+ assert_equal @schema.name, :items
10
+ assert_equal @schema.database, database
11
+ end
12
+
13
+ def test_init_when_table_does_not_exist
14
+ database = Sequel.sqlite
15
+ assert_raises Sequel::Error do
16
+ CouchTap::Schema.new(database, :items)
17
+ end
18
+ end
19
+
20
+ def test_dataset
21
+ database = create_database
22
+ @schema = CouchTap::Schema.new(database, 'items')
23
+ database.expects(:[]).with(:items)
24
+ @schema.dataset
25
+ end
26
+
27
+ def test_prepares_columns
28
+ database = create_database
29
+ @schema = CouchTap::Schema.new(database, 'items')
30
+ assert_equal @schema.columns.keys, [:id, :name]
31
+ obj = database.schema(:items)
32
+ assert_equal @schema.columns.values, [obj[0][1], obj[1][1]]
33
+ end
34
+
35
+ def test_prepares_column_names
36
+ database = create_database
37
+ @schema = CouchTap::Schema.new(database, 'items')
38
+ assert_equal @schema.column_names, [:id, :name]
39
+ end
40
+
41
+ protected
42
+
43
+ def create_database
44
+ database = Sequel.sqlite
45
+ database.create_table :items do
46
+ primary_key :id
47
+ String :name
48
+ end
49
+ database
50
+ end
51
+
52
+ end
metadata ADDED
@@ -0,0 +1,180 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: couch_tap
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.2
5
+ platform: ruby
6
+ authors:
7
+ - Sam Lown
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2014-04-25 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: couchrest
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ~>
18
+ - !ruby/object:Gem::Version
19
+ version: 1.1.3
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ~>
25
+ - !ruby/object:Gem::Version
26
+ version: 1.1.3
27
+ - !ruby/object:Gem::Dependency
28
+ name: em-http-request
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ~>
32
+ - !ruby/object:Gem::Version
33
+ version: 1.0.3
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ~>
39
+ - !ruby/object:Gem::Version
40
+ version: 1.0.3
41
+ - !ruby/object:Gem::Dependency
42
+ name: yajl-ruby
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ~>
46
+ - !ruby/object:Gem::Version
47
+ version: 1.1.0
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ~>
53
+ - !ruby/object:Gem::Version
54
+ version: 1.1.0
55
+ - !ruby/object:Gem::Dependency
56
+ name: sequel
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - '>='
60
+ - !ruby/object:Gem::Version
61
+ version: 3.45.0
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - '>='
67
+ - !ruby/object:Gem::Version
68
+ version: 3.45.0
69
+ - !ruby/object:Gem::Dependency
70
+ name: activesupport
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - '>='
74
+ - !ruby/object:Gem::Version
75
+ version: 3.0.0
76
+ type: :runtime
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - '>='
81
+ - !ruby/object:Gem::Version
82
+ version: 3.0.0
83
+ - !ruby/object:Gem::Dependency
84
+ name: mocha
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - '>='
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - '>='
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
97
+ - !ruby/object:Gem::Dependency
98
+ name: sqlite3
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - '>='
102
+ - !ruby/object:Gem::Version
103
+ version: '0'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - '>='
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
111
+ description: Couch Tap provides a DSL that allows complex CouchDB documents to be
112
+ converted into rows in a RDBMS' table. The stream of events received from the CouchDB
113
+ changes feed will trigger documents to be fed into a matching filter block and saved
114
+ in the database.
115
+ email: me@samlown.com
116
+ executables:
117
+ - couch_tap
118
+ extensions: []
119
+ extra_rdoc_files: []
120
+ files:
121
+ - .gitignore
122
+ - Gemfile
123
+ - Gemfile.lock
124
+ - README.md
125
+ - Rakefile
126
+ - VERSION
127
+ - bin/couch_tap
128
+ - couch_tap.gemspec
129
+ - examples/feed.rb
130
+ - lib/couch_tap.rb
131
+ - lib/couch_tap/builders/collection.rb
132
+ - lib/couch_tap/builders/table.rb
133
+ - lib/couch_tap/changes.rb
134
+ - lib/couch_tap/destroyers/collection.rb
135
+ - lib/couch_tap/destroyers/table.rb
136
+ - lib/couch_tap/document_handler.rb
137
+ - lib/couch_tap/schema.rb
138
+ - test/functional/functional_changes_test.rb
139
+ - test/test_helper.rb
140
+ - test/unit/builders/collection_test.rb
141
+ - test/unit/builders/table_test.rb
142
+ - test/unit/changes_test.rb
143
+ - test/unit/destroyers/collection_test.rb
144
+ - test/unit/destroyers/table_test.rb
145
+ - test/unit/document_handler_test.rb
146
+ - test/unit/schema_test.rb
147
+ homepage:
148
+ licenses: []
149
+ metadata: {}
150
+ post_install_message:
151
+ rdoc_options: []
152
+ require_paths:
153
+ - lib
154
+ required_ruby_version: !ruby/object:Gem::Requirement
155
+ requirements:
156
+ - - '>='
157
+ - !ruby/object:Gem::Version
158
+ version: '0'
159
+ required_rubygems_version: !ruby/object:Gem::Requirement
160
+ requirements:
161
+ - - '>='
162
+ - !ruby/object:Gem::Version
163
+ version: '0'
164
+ requirements: []
165
+ rubyforge_project:
166
+ rubygems_version: 2.0.3
167
+ signing_key:
168
+ specification_version: 4
169
+ summary: Listen to a CouchDB changes feed and create rows in a relational database
170
+ in real-time.
171
+ test_files:
172
+ - test/functional/functional_changes_test.rb
173
+ - test/test_helper.rb
174
+ - test/unit/builders/collection_test.rb
175
+ - test/unit/builders/table_test.rb
176
+ - test/unit/changes_test.rb
177
+ - test/unit/destroyers/collection_test.rb
178
+ - test/unit/destroyers/table_test.rb
179
+ - test/unit/document_handler_test.rb
180
+ - test/unit/schema_test.rb