groonga-client-model 1.0.0 → 1.0.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.
Files changed (57) hide show
  1. checksums.yaml +4 -4
  2. data/doc/text/news.md +30 -0
  3. data/groonga-client-model.gemspec +1 -1
  4. data/lib/groonga_client_model/log_subscriber.rb +1 -3
  5. data/lib/groonga_client_model/migration.rb +493 -0
  6. data/lib/groonga_client_model/migrator.rb +240 -0
  7. data/lib/groonga_client_model/railtie.rb +4 -2
  8. data/lib/groonga_client_model/railties/groonga.rake +55 -2
  9. data/lib/groonga_client_model/record.rb +39 -1
  10. data/lib/groonga_client_model/schema.rb +8 -0
  11. data/lib/groonga_client_model/schema_loader.rb +4 -9
  12. data/lib/groonga_client_model/test/groonga_server_runner.rb +19 -3
  13. data/lib/groonga_client_model/version.rb +1 -1
  14. data/lib/rails/generators/groonga_client_model/migration/templates/create_table_migration.rb +14 -0
  15. data/lib/rails/generators/groonga_client_model/migration/templates/delete_config_migration.rb +9 -0
  16. data/lib/rails/generators/groonga_client_model/migration/templates/migration.rb +12 -0
  17. data/lib/rails/generators/groonga_client_model/migration/templates/set_config_migration.rb +10 -0
  18. data/lib/rails/generators/groonga_client_model/migration_generator.rb +125 -0
  19. data/lib/rails/generators/groonga_client_model/{model/model_generator.rb → model_generator.rb} +18 -4
  20. data/test/apps/rails4/Gemfile.lock +2 -2
  21. data/test/apps/rails4/db/groonga/migrate/20170303120517_create_posts.rb +8 -0
  22. data/test/apps/rails4/db/groonga/migrate/20170303120527_create_terms.rb +7 -0
  23. data/test/apps/rails4/db/groonga/migrate/20170303120536_create_ages.rb +6 -0
  24. data/test/apps/rails4/log/development.log +22 -0
  25. data/test/apps/rails4/log/test.log +1350 -0
  26. data/test/apps/rails4/test/generators/migration_generator_test.rb +103 -0
  27. data/test/apps/rails4/test/tmp/db/groonga/migrate/20170307045825_set_config_alias_column.rb +10 -0
  28. data/test/apps/rails5/Gemfile.lock +8 -8
  29. data/test/apps/rails5/db/groonga/migrate/20170301061420_create_posts.rb +8 -0
  30. data/test/apps/rails5/db/groonga/migrate/20170303115054_create_terms.rb +7 -0
  31. data/test/apps/rails5/db/groonga/migrate/20170303115135_create_ages.rb +6 -0
  32. data/test/apps/rails5/log/development.log +350 -0
  33. data/test/apps/rails5/log/test.log +3260 -0
  34. data/test/apps/rails5/test/generators/migration_generator_test.rb +103 -0
  35. data/test/apps/rails5/test/tmp/db/groonga/migrate/20170307081511_remove_title_from_posts.rb +5 -0
  36. data/test/apps/rails5/tmp/cache/assets/sprockets/v3.0/5C/5Cws9GLWcOju_f3tIpY01qSaj7zkLAU0a2bQmpf7sS8.cache +1 -0
  37. data/test/apps/rails5/tmp/cache/assets/sprockets/v3.0/XH/XH9pWZvGgK476BpPGID5z8hjzRmGJjtzV0cHBLXhIKc.cache +1 -0
  38. data/test/unit/fixtures/migrate/20170301061420_create_posts.rb +8 -0
  39. data/test/unit/fixtures/migrate/20170303115054_create_terms.rb +7 -0
  40. data/test/unit/fixtures/migrate/20170303115135_create_ages.rb +6 -0
  41. data/test/unit/migration/test_config.rb +62 -0
  42. data/test/unit/migration/test_copy.rb +117 -0
  43. data/test/unit/migration/test_create_table.rb +528 -0
  44. data/test/unit/migration/test_exist.rb +47 -0
  45. data/test/unit/migration/test_load.rb +83 -0
  46. data/test/unit/record/test_active_model.rb +31 -0
  47. data/test/unit/record/test_readers.rb +45 -0
  48. data/test/unit/record/test_timestamps.rb +76 -0
  49. data/test/unit/record/test_validators.rb +295 -0
  50. data/test/unit/run-test.rb +1 -2
  51. data/test/unit/test_helper.rb +109 -0
  52. data/test/unit/test_load_value_generator.rb +8 -7
  53. data/test/unit/test_migrator.rb +156 -0
  54. metadata +64 -11
  55. data/test/apps/rails4/db/schema.grn +0 -9
  56. data/test/apps/rails5/db/schema.grn +0 -11
  57. data/test/unit/test_record.rb +0 -345
@@ -0,0 +1,47 @@
1
+ # Copyright (C) 2017 Kouhei Sutou <kou@clear-code.com>
2
+ #
3
+ # This library is free software; you can redistribute it and/or
4
+ # modify it under the terms of the GNU Lesser General Public
5
+ # License as published by the Free Software Foundation; either
6
+ # version 2.1 of the License, or (at your option) any later version.
7
+ #
8
+ # This library is distributed in the hope that it will be useful,
9
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
10
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
11
+ # Lesser General Public License for more details.
12
+ #
13
+ # You should have received a copy of the GNU Lesser General Public
14
+ # License along with this library; if not, write to the Free Software
15
+ # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
16
+
17
+ class TestMigrationExist < Test::Unit::TestCase
18
+ include GroongaClientModel::TestHelper
19
+ include TestHelper::Migration
20
+
21
+ test("table") do
22
+ expected_up_report = <<-REPORT
23
+ -- create_table(:posts, {:type=>"TABLE_NO_KEY"})
24
+ -> 0.0s
25
+ -- add_column(:posts, :title, {:flags=>["COLUMN_SCALAR"], :value_type=>"ShortText"})
26
+ -> 0.0s
27
+ REPORT
28
+ expected_down_report = <<-REPORT
29
+ -- remove_table(:posts)
30
+ -> 0.0s
31
+ REPORT
32
+ expected_dump = <<-DUMP.chomp
33
+ table_create posts TABLE_NO_KEY
34
+ column_create posts title COLUMN_SCALAR ShortText
35
+ DUMP
36
+ assert_migrate(expected_up_report,
37
+ expected_down_report,
38
+ expected_dump) do |migration|
39
+ migration.instance_eval do
40
+ create_table(:posts)
41
+ unless reverting?
42
+ add_column(:posts, :title, :short_text) if exist?(:posts)
43
+ end
44
+ end
45
+ end
46
+ end
47
+ end
@@ -0,0 +1,83 @@
1
+ # Copyright (C) 2017 Kouhei Sutou <kou@clear-code.com>
2
+ #
3
+ # This library is free software; you can redistribute it and/or
4
+ # modify it under the terms of the GNU Lesser General Public
5
+ # License as published by the Free Software Foundation; either
6
+ # version 2.1 of the License, or (at your option) any later version.
7
+ #
8
+ # This library is distributed in the hope that it will be useful,
9
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
10
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
11
+ # Lesser General Public License for more details.
12
+ #
13
+ # You should have received a copy of the GNU Lesser General Public
14
+ # License along with this library; if not, write to the Free Software
15
+ # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
16
+
17
+ class TestMigrationLoad < Test::Unit::TestCase
18
+ include GroongaClientModel::TestHelper
19
+ include TestHelper::Migration
20
+
21
+ def assert_migrate_load(values, expected_values_dump)
22
+ expected_up_report = <<-REPORT
23
+ -- create_table(:posts, {:type=>"TABLE_HASH_KEY", :key_type=>"ShortText"})
24
+ -> 0.0s
25
+ -- add_column(:posts, :content, {:flags=>["COLUMN_SCALAR"], :value_type=>"Text"})
26
+ -> 0.0s
27
+ -- load(:posts)
28
+ -> 0.0s
29
+ REPORT
30
+ expected_down_report = nil
31
+ expected_dump = <<-DUMP.chomp
32
+ table_create posts TABLE_HASH_KEY ShortText
33
+ column_create posts content COLUMN_SCALAR Text
34
+
35
+ load --table posts
36
+ [
37
+ ["_key","content"],
38
+ #{expected_values_dump}
39
+ ]
40
+ DUMP
41
+ assert_migrate(expected_up_report,
42
+ expected_down_report,
43
+ expected_dump) do |migration|
44
+ migration.instance_eval do
45
+ create_table(:posts,
46
+ :type => :hash_table,
47
+ :key_type => :short_text) do |t|
48
+ t.text(:content)
49
+ end
50
+ load(:posts, values)
51
+ end
52
+ end
53
+ end
54
+
55
+ test("Hash") do
56
+ assert_migrate_load({"_key" => "Groonga", "content" => "Very good!"},
57
+ <<-DUMP.chomp)
58
+ ["Groonga","Very good!"]
59
+ DUMP
60
+ end
61
+
62
+ test("Array") do
63
+ assert_migrate_load([
64
+ {"_key" => "Groonga", "content" => "Very good!"},
65
+ {"_key" => "Ruby", "content" => "Very exciting!"},
66
+ ],
67
+ <<-DUMP.chomp)
68
+ ["Groonga","Very good!"],
69
+ ["Ruby","Very exciting!"]
70
+ DUMP
71
+ end
72
+
73
+ test("JSON") do
74
+ assert_migrate_load([
75
+ {"_key" => "Groonga", "content" => "Very good!"},
76
+ {"_key" => "Ruby", "content" => "Very exciting!"},
77
+ ].to_json,
78
+ <<-DUMP.chomp)
79
+ ["Groonga","Very good!"],
80
+ ["Ruby","Very exciting!"]
81
+ DUMP
82
+ end
83
+ end
@@ -0,0 +1,31 @@
1
+ # Copyright (C) 2016-2017 Kouhei Sutou <kou@clear-code.com>
2
+ #
3
+ # This library is free software; you can redistribute it and/or
4
+ # modify it under the terms of the GNU Lesser General Public
5
+ # License as published by the Free Software Foundation; either
6
+ # version 2.1 of the License, or (at your option) any later version.
7
+ #
8
+ # This library is distributed in the hope that it will be useful,
9
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
10
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
11
+ # Lesser General Public License for more details.
12
+ #
13
+ # You should have received a copy of the GNU Lesser General Public
14
+ # License along with this library; if not, write to the Free Software
15
+ # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
16
+
17
+ class TestRecordActiveModel < Test::Unit::TestCase
18
+ class EmptyModel < GroongaClientModel::Record
19
+ class << self
20
+ def columns
21
+ TestHelper::Columns.build
22
+ end
23
+ end
24
+ end
25
+
26
+ include ActiveModel::Lint::Tests
27
+
28
+ setup do
29
+ @model = EmptyModel.new
30
+ end
31
+ end
@@ -0,0 +1,45 @@
1
+ # Copyright (C) 2016-2017 Kouhei Sutou <kou@clear-code.com>
2
+ #
3
+ # This library is free software; you can redistribute it and/or
4
+ # modify it under the terms of the GNU Lesser General Public
5
+ # License as published by the Free Software Foundation; either
6
+ # version 2.1 of the License, or (at your option) any later version.
7
+ #
8
+ # This library is distributed in the hope that it will be useful,
9
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
10
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
11
+ # Lesser General Public License for more details.
12
+ #
13
+ # You should have received a copy of the GNU Lesser General Public
14
+ # License along with this library; if not, write to the Free Software
15
+ # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
16
+
17
+ class TestRecordReaders < Test::Unit::TestCase
18
+ class Memo < GroongaClientModel::Record
19
+ class << self
20
+ def columns
21
+ TestHelper::Columns.build("published" => {
22
+ "value_type" => {
23
+ "name" => "Bool",
24
+ },
25
+ })
26
+ end
27
+ end
28
+ end
29
+
30
+ setup do
31
+ @memo = Memo.new
32
+ end
33
+
34
+ test "#id" do
35
+ @memo._id = 29
36
+ assert_equal(29, @memo.id)
37
+ end
38
+
39
+ test "predicate" do
40
+ @memo.published = true
41
+ assert do
42
+ @memo.published?
43
+ end
44
+ end
45
+ end
@@ -0,0 +1,76 @@
1
+ # Copyright (C) 2016-2017 Kouhei Sutou <kou@clear-code.com>
2
+ #
3
+ # This library is free software; you can redistribute it and/or
4
+ # modify it under the terms of the GNU Lesser General Public
5
+ # License as published by the Free Software Foundation; either
6
+ # version 2.1 of the License, or (at your option) any later version.
7
+ #
8
+ # This library is distributed in the hope that it will be useful,
9
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
10
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
11
+ # Lesser General Public License for more details.
12
+ #
13
+ # You should have received a copy of the GNU Lesser General Public
14
+ # License along with this library; if not, write to the Free Software
15
+ # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
16
+
17
+ class TestRecordTimestamps < Test::Unit::TestCase
18
+ include GroongaClientModel::TestHelper
19
+
20
+ setup do
21
+ schema = <<-SCHEMA
22
+ table_create timestamps TABLE_NO_KEY
23
+ column_create timestamps created_at COLUMN_SCALAR Time
24
+ column_create timestamps created_on COLUMN_SCALAR Time
25
+ column_create timestamps updated_at COLUMN_SCALAR Time
26
+ column_create timestamps updated_on COLUMN_SCALAR Time
27
+ SCHEMA
28
+ schema_loader = GroongaClientModel::SchemaLoader.new(schema)
29
+ schema_loader.load
30
+ end
31
+
32
+ class Timestamp < GroongaClientModel::Record
33
+ end
34
+
35
+ test("created_at") do
36
+ now = Time.now
37
+ timestamp = Timestamp.create
38
+ saved_timestamp = Timestamp.find(timestamp)
39
+ assert do
40
+ saved_timestamp.created_at > now
41
+ end
42
+ end
43
+
44
+ test("created_on") do
45
+ now = Time.now
46
+ timestamp = Timestamp.create
47
+ saved_timestamp = Timestamp.find(timestamp)
48
+ assert do
49
+ saved_timestamp.created_on > now
50
+ end
51
+ end
52
+
53
+ test("updated_at") do
54
+ timestamp = Timestamp.create
55
+ saved_timestamp = Timestamp.find(timestamp)
56
+ created_at = saved_timestamp.created_at
57
+ saved_timestamp.save
58
+ updated_timestamp = Timestamp.find(timestamp)
59
+ updated_timestamp.save
60
+ assert do
61
+ saved_timestamp.updated_at > created_at
62
+ end
63
+ end
64
+
65
+ test("updated_on") do
66
+ timestamp = Timestamp.create
67
+ saved_timestamp = Timestamp.find(timestamp)
68
+ created_on = saved_timestamp.created_on
69
+ saved_timestamp.save
70
+ updated_timestamp = Timestamp.find(timestamp)
71
+ updated_timestamp.save
72
+ assert do
73
+ saved_timestamp.updated_on > created_on
74
+ end
75
+ end
76
+ end
@@ -0,0 +1,295 @@
1
+ # Copyright (C) 2016-2017 Kouhei Sutou <kou@clear-code.com>
2
+ #
3
+ # This library is free software; you can redistribute it and/or
4
+ # modify it under the terms of the GNU Lesser General Public
5
+ # License as published by the Free Software Foundation; either
6
+ # version 2.1 of the License, or (at your option) any later version.
7
+ #
8
+ # This library is distributed in the hope that it will be useful,
9
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
10
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
11
+ # Lesser General Public License for more details.
12
+ #
13
+ # You should have received a copy of the GNU Lesser General Public
14
+ # License along with this library; if not, write to the Free Software
15
+ # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
16
+
17
+ class TestRecordValidators < Test::Unit::TestCase
18
+ sub_test_case("_key") do
19
+ class NoKey < GroongaClientModel::Record
20
+ class << self
21
+ def columns
22
+ TestHelper::Columns.build
23
+ end
24
+ end
25
+ end
26
+
27
+ class Key < GroongaClientModel::Record
28
+ class << self
29
+ def columns
30
+ TestHelper::Columns.build("_key" => {
31
+ "value_type" => {
32
+ "name" => key_type,
33
+ },
34
+ })
35
+ end
36
+ end
37
+ end
38
+
39
+ class ShortTextKey < Key
40
+ class << self
41
+ def key_type
42
+ "ShortText"
43
+ end
44
+ end
45
+ end
46
+
47
+ class UInt8Key < Key
48
+ class << self
49
+ def key_type
50
+ "UInt8"
51
+ end
52
+ end
53
+ end
54
+
55
+ class UInt16Key < Key
56
+ class << self
57
+ def key_type
58
+ "UInt16"
59
+ end
60
+ end
61
+ end
62
+
63
+ class UInt32Key < Key
64
+ class << self
65
+ def key_type
66
+ "UInt32"
67
+ end
68
+ end
69
+ end
70
+
71
+ class UInt64Key < Key
72
+ class << self
73
+ def key_type
74
+ "UInt64"
75
+ end
76
+ end
77
+ end
78
+
79
+ class Int8Key < Key
80
+ class << self
81
+ def key_type
82
+ "Int8"
83
+ end
84
+ end
85
+ end
86
+
87
+ class Int16Key < Key
88
+ class << self
89
+ def key_type
90
+ "Int16"
91
+ end
92
+ end
93
+ end
94
+
95
+ class Int32Key < Key
96
+ class << self
97
+ def key_type
98
+ "Int32"
99
+ end
100
+ end
101
+ end
102
+
103
+ class Int64Key < Key
104
+ class << self
105
+ def key_type
106
+ "Int64"
107
+ end
108
+ end
109
+ end
110
+
111
+ class FloatKey < Key
112
+ class << self
113
+ def key_type
114
+ "Float"
115
+ end
116
+ end
117
+ end
118
+
119
+ class TimeKey < Key
120
+ class << self
121
+ def key_type
122
+ "Time"
123
+ end
124
+ end
125
+ end
126
+
127
+ sub_test_case("presence") do
128
+ test "no key" do
129
+ record = NoKey.new
130
+ assert do
131
+ record.valid?
132
+ end
133
+ assert_equal({}, record.errors.messages)
134
+ end
135
+
136
+ test "missing key" do
137
+ record = ShortTextKey.new
138
+ assert do
139
+ not record.valid?
140
+ end
141
+ message = record.errors.generate_message(:_key, :blank)
142
+ assert_equal({
143
+ :_key => [message],
144
+ },
145
+ record.errors.messages)
146
+ end
147
+
148
+ test "blank key" do
149
+ record = UInt32Key.new(_key: "")
150
+ assert do
151
+ not record.valid?
152
+ end
153
+ message = record.errors.generate_message(:_key, :blank)
154
+ assert_equal({
155
+ :_key => [message],
156
+ },
157
+ record.errors.messages)
158
+ end
159
+
160
+ test "have key" do
161
+ record = ShortTextKey.new(_key: "String")
162
+ assert do
163
+ record.valid?
164
+ end
165
+ assert_equal({},
166
+ record.errors.messages)
167
+ end
168
+ end
169
+
170
+ sub_test_case("type") do
171
+ def assert_invalid(klass, key, message_key)
172
+ record = klass.new(_key: key)
173
+ assert do
174
+ not record.valid?
175
+ end
176
+ options = {
177
+ inspected_value: key.inspect
178
+ }
179
+ message = record.errors.generate_message(:_key, message_key, options)
180
+ assert_equal({
181
+ :_key => [message],
182
+ },
183
+ record.errors.messages)
184
+ end
185
+
186
+ sub_test_case("UInt8") do
187
+ test("invalid") do
188
+ assert_invalid(UInt8Key, "String", :not_a_positive_integer)
189
+ end
190
+
191
+ test("too large") do
192
+ assert_invalid(UInt8Key, 2 ** 8, :invalid_uint8)
193
+ end
194
+ end
195
+
196
+ sub_test_case("UInt16") do
197
+ test("invalid") do
198
+ assert_invalid(UInt16Key, "String", :not_a_positive_integer)
199
+ end
200
+
201
+ test("too large") do
202
+ assert_invalid(UInt16Key, 2 ** 16, :invalid_uint16)
203
+ end
204
+ end
205
+
206
+ sub_test_case("UInt32") do
207
+ test("invalid") do
208
+ assert_invalid(UInt32Key, "String", :not_a_positive_integer)
209
+ end
210
+
211
+ test("too large") do
212
+ assert_invalid(UInt32Key, 2 ** 32, :invalid_uint32)
213
+ end
214
+ end
215
+
216
+ sub_test_case("UInt64") do
217
+ test("invalid") do
218
+ assert_invalid(UInt64Key, "String", :not_a_positive_integer)
219
+ end
220
+
221
+ test("too large") do
222
+ assert_invalid(UInt64Key, 2 ** 64, :invalid_uint64)
223
+ end
224
+ end
225
+
226
+ sub_test_case("Int8") do
227
+ test("invalid") do
228
+ assert_invalid(Int8Key, "String", :not_an_integer)
229
+ end
230
+
231
+ test("too small") do
232
+ assert_invalid(Int8Key, -(2 ** 7) - 1, :invalid_int8)
233
+ end
234
+
235
+ test("too large") do
236
+ assert_invalid(Int8Key, 2 ** 7, :invalid_int8)
237
+ end
238
+ end
239
+
240
+ sub_test_case("Int16") do
241
+ test("invalid") do
242
+ assert_invalid(Int16Key, "String", :not_an_integer)
243
+ end
244
+
245
+ test("too small") do
246
+ assert_invalid(Int16Key, -(2 ** 15) - 1, :invalid_int16)
247
+ end
248
+
249
+ test("too large") do
250
+ assert_invalid(Int16Key, 2 ** 15, :invalid_int16)
251
+ end
252
+ end
253
+
254
+ sub_test_case("Int32") do
255
+ test("invalid") do
256
+ assert_invalid(Int32Key, "String", :not_an_integer)
257
+ end
258
+
259
+ test("too small") do
260
+ assert_invalid(Int32Key, -(2 ** 31) - 1, :invalid_int32)
261
+ end
262
+
263
+ test("too large") do
264
+ assert_invalid(Int32Key, 2 ** 31, :invalid_int32)
265
+ end
266
+ end
267
+
268
+ sub_test_case("Int64") do
269
+ test("invalid") do
270
+ assert_invalid(Int64Key, "String", :not_an_integer)
271
+ end
272
+
273
+ test("too small") do
274
+ assert_invalid(Int64Key, -(2 ** 63) - 1, :invalid_int64)
275
+ end
276
+
277
+ test("too large") do
278
+ assert_invalid(Int64Key, 2 ** 63, :invalid_int64)
279
+ end
280
+ end
281
+
282
+ sub_test_case("Float") do
283
+ test("invalid") do
284
+ assert_invalid(FloatKey, "String", :not_a_number)
285
+ end
286
+ end
287
+
288
+ sub_test_case("Time") do
289
+ test("invalid") do
290
+ assert_invalid(TimeKey, "String", :not_a_time)
291
+ end
292
+ end
293
+ end
294
+ end
295
+ end