rom-sql 1.0.1 → 1.0.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (60) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +10 -0
  3. data/Gemfile +1 -0
  4. data/lib/rom/sql/attribute.rb +1 -1
  5. data/lib/rom/sql/projection_dsl.rb +6 -0
  6. data/lib/rom/sql/version.rb +1 -1
  7. data/rom-sql.gemspec +1 -1
  8. data/spec/integration/association/many_to_many/custom_fks_spec.rb +9 -13
  9. data/spec/integration/association/many_to_many/from_view_spec.rb +9 -8
  10. data/spec/integration/association/many_to_many_spec.rb +103 -102
  11. data/spec/integration/association/many_to_one/custom_fks_spec.rb +6 -7
  12. data/spec/integration/association/many_to_one/from_view_spec.rb +8 -4
  13. data/spec/integration/association/many_to_one_spec.rb +61 -54
  14. data/spec/integration/association/one_to_many/custom_fks_spec.rb +7 -6
  15. data/spec/integration/association/one_to_many/from_view_spec.rb +7 -10
  16. data/spec/integration/association/one_to_many/self_ref_spec.rb +6 -6
  17. data/spec/integration/association/one_to_many_spec.rb +0 -3
  18. data/spec/integration/association/one_to_one_spec.rb +17 -11
  19. data/spec/integration/association/one_to_one_through_spec.rb +3 -5
  20. data/spec/integration/commands/create_spec.rb +33 -22
  21. data/spec/integration/commands/update_spec.rb +3 -3
  22. data/spec/integration/commands/upsert_spec.rb +1 -1
  23. data/spec/integration/gateway_spec.rb +12 -8
  24. data/spec/integration/migration_spec.rb +4 -3
  25. data/spec/integration/plugins/associates/many_to_many_spec.rb +2 -2
  26. data/spec/integration/plugins/associates_spec.rb +1 -1
  27. data/spec/integration/relation_schema_spec.rb +4 -5
  28. data/spec/integration/schema/call_spec.rb +1 -1
  29. data/spec/integration/schema/inferrer/mysql_spec.rb +22 -23
  30. data/spec/integration/schema/inferrer/postgres_spec.rb +83 -82
  31. data/spec/integration/schema/inferrer/sqlite_spec.rb +18 -19
  32. data/spec/integration/schema/inferrer_spec.rb +54 -33
  33. data/spec/integration/schema/prefix_spec.rb +9 -11
  34. data/spec/integration/schema/qualified_spec.rb +9 -11
  35. data/spec/integration/schema/rename_spec.rb +13 -15
  36. data/spec/integration/schema/view_spec.rb +2 -2
  37. data/spec/integration/sequel_api_spec.rb +1 -1
  38. data/spec/integration/setup_spec.rb +5 -5
  39. data/spec/integration/support/active_support_notifications_spec.rb +2 -2
  40. data/spec/integration/support/rails_log_subscriber_spec.rb +2 -2
  41. data/spec/shared/accounts.rb +44 -0
  42. data/spec/shared/database_setup.rb +42 -81
  43. data/spec/shared/notes.rb +21 -0
  44. data/spec/shared/posts.rb +32 -0
  45. data/spec/shared/puppies.rb +13 -0
  46. data/spec/shared/relations.rb +1 -1
  47. data/spec/shared/users.rb +29 -0
  48. data/spec/shared/users_and_tasks.rb +32 -18
  49. data/spec/spec_helper.rb +18 -30
  50. data/spec/support/env_helper.rb +25 -0
  51. data/spec/support/oracle/create_users.sql +7 -0
  52. data/spec/support/oracle/set_sys_passwords.sql +2 -0
  53. data/spec/unit/plugin/pagination_spec.rb +2 -2
  54. data/spec/unit/plugin/timestamp_spec.rb +1 -1
  55. data/spec/unit/projection_dsl_spec.rb +8 -0
  56. data/spec/unit/relation/group_spec.rb +5 -3
  57. data/spec/unit/relation/max_spec.rb +1 -1
  58. data/spec/unit/relation/select_spec.rb +7 -0
  59. metadata +33 -5
  60. data/spec/shared/users_and_accounts.rb +0 -10
@@ -0,0 +1,21 @@
1
+ RSpec.shared_context 'notes' do
2
+ include_context 'database setup'
3
+
4
+ before do
5
+ inferrable_relations.concat %i(notes)
6
+ end
7
+
8
+ before do |example|
9
+ ctx = self
10
+
11
+ conn.create_table :notes do
12
+ primary_key :id
13
+ String :text, null: false
14
+ # TODO: Remove Oracle's workarounds once inferer can infer not-null timestamps
15
+ DateTime :created_at, null: ctx.oracle?(example)
16
+ DateTime :updated_at, null: ctx.oracle?(example)
17
+ DateTime :completed_at
18
+ Date :written
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,32 @@
1
+ RSpec.shared_context 'posts' do
2
+ before do
3
+ inferrable_relations.concat %i(posts)
4
+ end
5
+
6
+ before do |example|
7
+ conn.create_table :posts do
8
+ primary_key :post_id
9
+ foreign_key :author_id, :users
10
+ String :title
11
+ String :body
12
+ end
13
+ end
14
+
15
+ before do |example|
16
+ next if example.metadata[:seeds] == false
17
+
18
+ conn[:posts].insert(
19
+ post_id: 1,
20
+ author_id: 2,
21
+ title: "Joe's post",
22
+ body: 'Joe wrote sutin'
23
+ )
24
+
25
+ conn[:posts].insert(
26
+ post_id: 2,
27
+ author_id: 1,
28
+ title: "Jane's post",
29
+ body: 'Jane wrote sutin'
30
+ )
31
+ end
32
+ end
@@ -0,0 +1,13 @@
1
+ RSpec.shared_context 'puppies' do
2
+ before do
3
+ inferrable_relations.concat %i(puppies)
4
+ end
5
+
6
+ before do
7
+ conn.create_table :puppies do
8
+ primary_key :id
9
+ String :name, null: false
10
+ boolean :cute, null: false, default: true
11
+ end
12
+ end
13
+ end
@@ -1,5 +1,5 @@
1
1
  RSpec.shared_context 'relations' do
2
- include_context 'database setup'
2
+ include_context 'users and tasks'
3
3
 
4
4
  before do
5
5
  conf.relation(:users)
@@ -0,0 +1,29 @@
1
+ RSpec.shared_context 'users' do
2
+ include_context 'database setup'
3
+
4
+ before do
5
+ inferrable_relations.concat %i(users)
6
+ end
7
+
8
+ let(:users) { container.relations[:users] }
9
+
10
+ let(:jane_id) { 1 }
11
+ let(:joe_id) { 2 }
12
+
13
+ before do |example|
14
+ ctx = self
15
+
16
+ conn.create_table :users do
17
+ primary_key :id
18
+ String :name, null: false
19
+ check { char_length(name) > 2 } if ctx.postgres?(example)
20
+ end
21
+ end
22
+
23
+ before do |example|
24
+ next if example.metadata[:seeds] == false
25
+
26
+ conn[:users].insert name: 'Jane'
27
+ conn[:users].insert name: 'Joe'
28
+ end
29
+ end
@@ -1,28 +1,42 @@
1
- shared_context 'users and tasks' do
2
- include_context 'database setup'
1
+ RSpec.shared_context 'users and tasks' do
2
+ include_context 'users'
3
+
4
+ let(:tasks) { container.relations[:tasks] }
3
5
 
4
6
  before do
5
- conn[:users].insert id: 1, name: 'Jane'
6
- conn[:users].insert id: 2, name: 'Joe'
7
+ inferrable_relations.concat %i(tasks tags task_tags)
8
+ end
9
+
10
+ before do |example|
11
+ ctx = self
12
+
13
+ conn.create_table :tasks do
14
+ primary_key :id
15
+ foreign_key :user_id, :users
16
+ String :title, unique: true
17
+ constraint(:title_length) { char_length(title) > 1 } if ctx.postgres?(example)
18
+ constraint(:title_length) { length(title) > 1 } if ctx.sqlite?(example)
19
+ end
20
+
21
+ conn.create_table :tags do
22
+ primary_key :id
23
+ String :name
24
+ end
25
+
26
+ conn.create_table :task_tags do
27
+ primary_key [:tag_id, :task_id]
28
+ Integer :tag_id
29
+ Integer :task_id
30
+ end
31
+ end
32
+
33
+ before do |example|
34
+ next if example.metadata[:seeds] == false
7
35
 
8
36
  conn[:tasks].insert id: 1, user_id: 2, title: "Joe's task"
9
37
  conn[:tasks].insert id: 2, user_id: 1, title: "Jane's task"
10
38
 
11
39
  conn[:tags].insert id: 1, name: 'important'
12
40
  conn[:task_tags].insert(tag_id: 1, task_id: 1)
13
-
14
- conn[:posts].insert(
15
- post_id: 1,
16
- author_id: 2,
17
- title: "Joe's post",
18
- body: 'Joe wrote sutin'
19
- )
20
-
21
- conn[:posts].insert(
22
- post_id: 2,
23
- author_id: 1,
24
- title: "Jane's post",
25
- body: 'Jane wrote sutin'
26
- )
27
41
  end
28
42
  end
data/spec/spec_helper.rb CHANGED
@@ -21,22 +21,32 @@ rescue LoadError
21
21
  end
22
22
 
23
23
  LOGGER = Logger.new(File.open('./log/test.log', 'a'))
24
+ ENV['TZ'] ||= 'UTC'
25
+
26
+ oracle_settings = {
27
+ db_name: ENV.fetch('ROM_ORACLE_DATABASE', 'xe'),
28
+ host: ENV.fetch('ROM_ORACLE_HOST', 'localhost'),
29
+ port: Integer(ENV.fetch('ROM_ORACLE_PORT', '1521'))
30
+ }
24
31
 
25
32
  if defined? JRUBY_VERSION
26
33
  DB_URIS = {
27
34
  sqlite: 'jdbc:sqlite:::memory',
28
35
  postgres: 'jdbc:postgresql://localhost/rom_sql',
29
- mysql: 'jdbc:mysql://localhost/rom_sql?user=root'
36
+ mysql: 'jdbc:mysql://localhost/rom_sql?user=root',
37
+ oracle: ENV['ROM_USE_ORACLE'] ? fail('Setup Oracle for JRuby!') : nil
30
38
  }
31
39
  else
32
40
  DB_URIS = {
33
41
  sqlite: 'sqlite::memory',
34
42
  postgres: 'postgres://localhost/rom_sql',
35
- mysql: 'mysql2://root@localhost/rom_sql'
43
+ mysql: 'mysql2://root@localhost/rom_sql',
44
+ oracle: "oracle://#{ oracle_settings[:host] }:#{ oracle_settings[:port] }/" \
45
+ "#{ oracle_settings[:db_name] }?username=rom_sql&password=rom_sql&autosequence=true"
36
46
  }
37
47
  end
38
48
 
39
- ADAPTERS = DB_URIS.keys
49
+ ADAPTERS = ENV['ROM_USE_ORACLE'] ? DB_URIS.keys : DB_URIS.keys - %i(oracle)
40
50
  PG_LTE_95 = ENV.fetch('PG_LTE_95', 'true') == 'true'
41
51
 
42
52
  SPEC_ROOT = root = Pathname(__FILE__).dirname
@@ -49,9 +59,6 @@ class ROM::SQL::Schema::Inferrer
49
59
  end
50
60
  end
51
61
 
52
- Dir[root.join('shared/**/*')].each { |f| require f }
53
- Dir[root.join('support/**/*')].each { |f| require f }
54
-
55
62
  require 'dry/core/deprecations'
56
63
  Dry::Core::Deprecations.set_logger!(root.join('../log/deprecations.log'))
57
64
 
@@ -62,30 +69,8 @@ module Types
62
69
  include Dry::Types.module
63
70
  end
64
71
 
65
- module ENVHelper
66
- def db?(type, example)
67
- example.metadata[type]
68
- end
69
-
70
- def postgres?(example)
71
- db?(:postgres, example)
72
- end
73
-
74
- def mysql?(example)
75
- db?(:mysql, example)
76
- end
77
-
78
- def sqlite?(example)
79
- db?(:sqlite, example)
80
- end
81
-
82
- def jruby?
83
- defined? JRUBY_VERSION
84
- end
85
- end
86
-
87
72
  def with_adapters(*args, &block)
88
- reset_adapter = { postgres: false, mysql: false, sqlite: false }
73
+ reset_adapter = Hash[*ADAPTERS.flat_map { |a| [a, false] }]
89
74
  adapters = args.empty? || args[0] == :all ? ADAPTERS : args
90
75
 
91
76
  adapters.each do |adapter|
@@ -96,7 +81,6 @@ end
96
81
  RSpec.configure do |config|
97
82
  config.disable_monkey_patching!
98
83
 
99
- config.include ENVHelper
100
84
 
101
85
  config.before(:suite) do
102
86
  tmp_test_dir = TMP_PATH.join('test')
@@ -113,5 +97,9 @@ RSpec.configure do |config|
113
97
  Object.send(:remove_const, :Test)
114
98
  end
115
99
 
100
+ Dir[root.join('shared/**/*.rb')].each { |f| require f }
101
+ Dir[root.join('support/**/*.rb')].each { |f| require f }
102
+
116
103
  config.include(Helpers, helpers: true)
104
+ config.include ENVHelper
117
105
  end
@@ -0,0 +1,25 @@
1
+ module ENVHelper
2
+ def db?(type, example)
3
+ example.metadata[type]
4
+ end
5
+
6
+ def postgres?(example)
7
+ db?(:postgres, example)
8
+ end
9
+
10
+ def mysql?(example)
11
+ db?(:mysql, example)
12
+ end
13
+
14
+ def sqlite?(example)
15
+ db?(:sqlite, example)
16
+ end
17
+
18
+ def oracle?(example)
19
+ db?(:oracle, example)
20
+ end
21
+
22
+ def jruby?
23
+ defined? JRUBY_VERSION
24
+ end
25
+ end
@@ -0,0 +1,7 @@
1
+ alter database default tablespace USERS;
2
+
3
+ CREATE USER rom_sql IDENTIFIED BY rom_sql;
4
+
5
+ GRANT unlimited tablespace, create session, create table, create sequence,
6
+ create procedure, create trigger, create view, create materialized view,
7
+ create database link, create synonym, create type, ctxapp TO rom_sql;
@@ -0,0 +1,2 @@
1
+ -- alter user sys identified by admin;
2
+ -- alter user system identified by admin;
@@ -1,7 +1,7 @@
1
1
  require 'rom/sql/plugin/pagination'
2
2
 
3
- RSpec.describe 'Plugin / Pagination' do
4
- include_context 'database setup'
3
+ RSpec.describe 'Plugin / Pagination', seeds: false do
4
+ include_context 'users'
5
5
 
6
6
  with_adapters do
7
7
  before do
@@ -1,7 +1,7 @@
1
1
  require 'rom/sql/plugin/timestamps'
2
2
 
3
3
  RSpec.describe 'Plugin / Timestamp' do
4
- include_context 'database setup'
4
+ include_context 'notes'
5
5
 
6
6
  with_adapters do
7
7
  before do
@@ -63,6 +63,14 @@ RSpec.describe ROM::SQL::ProjectionDSL, :postgres, helpers: true do
63
63
 
64
64
  expect(literals).to eql([%(COUNT("users"."id") AS "count")])
65
65
  end
66
+
67
+ it 'supports selecting literal strings' do
68
+ literals = dsl
69
+ .call { `'event'`.as(:type) }
70
+ .map { |attr| attr.sql_literal(ds) }
71
+
72
+ expect(literals).to eql([%('event' AS "type")])
73
+ end
66
74
  end
67
75
 
68
76
  describe '#method_missing' do
@@ -6,11 +6,13 @@ RSpec.describe ROM::Relation, '#group' do
6
6
  include_context 'users and tasks'
7
7
 
8
8
  with_adapters do
9
- it 'groups by provided attribute name' do
9
+ it 'groups by provided attribute name' do |example|
10
+ # Oracle doesn't support concise GROUP BY
11
+ group_by = oracle?(example) ? %i(id name) : %i(id)
10
12
  grouped = relation.
11
13
  qualified.
12
14
  left_join(:tasks, tasks[:user_id].qualified => relation[:id].qualified).
13
- group(:id)
15
+ group(*group_by)
14
16
 
15
17
  expect(grouped.to_a).to eql([{ id: 1, name: 'Jane' }, { id: 2, name: 'Joe'}])
16
18
  end
@@ -19,7 +21,7 @@ RSpec.describe ROM::Relation, '#group' do
19
21
  grouped = relation.
20
22
  qualified.
21
23
  left_join(:tasks, tasks[:user_id].qualified => relation[:id].qualified).
22
- group { id.qualified }
24
+ group { [id.qualified, name.qualified] }
23
25
 
24
26
  expect(grouped.to_a).to eql([{ id: 1, name: 'Jane' }, { id: 2, name: 'Joe'}])
25
27
  end
@@ -1,7 +1,7 @@
1
1
  RSpec.describe ROM::Relation, '#max' do
2
2
  subject(:relation) { container.relations.users }
3
3
 
4
- include_context 'users and tasks'
4
+ include_context 'users'
5
5
 
6
6
  with_adapters do
7
7
  it 'delegates to dataset and return value' do
@@ -29,5 +29,12 @@ RSpec.describe ROM::Relation, '#select' do
29
29
  it 'supports blocks' do
30
30
  expect(relation.select { [id, title] }.schema.map(&:name)).to eql(%i[id title])
31
31
  end
32
+
33
+ it 'supports selecting literal strings' do
34
+ new_rel = relation.select { `'event'`.as(:type) }
35
+
36
+ expect(new_rel.schema[:type].primitive).to be(String)
37
+ expect(new_rel.first).to eql(type: 'event')
38
+ end
32
39
  end
33
40
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rom-sql
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.1
4
+ version: 1.0.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Piotr Solnica
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-02-09 00:00:00.000000000 Z
11
+ date: 2017-02-15 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: sequel
@@ -120,6 +120,20 @@ dependencies:
120
120
  - - "~>"
121
121
  - !ruby/object:Gem::Version
122
122
  version: '10.0'
123
+ - !ruby/object:Gem::Dependency
124
+ name: rspec
125
+ requirement: !ruby/object:Gem::Requirement
126
+ requirements:
127
+ - - "~>"
128
+ - !ruby/object:Gem::Version
129
+ version: '3.5'
130
+ type: :development
131
+ prerelease: false
132
+ version_requirements: !ruby/object:Gem::Requirement
133
+ requirements:
134
+ - - "~>"
135
+ - !ruby/object:Gem::Version
136
+ version: '3.5'
123
137
  description: SQL databases support for ROM
124
138
  email:
125
139
  - piotr.solnica@gmail.com
@@ -242,12 +256,19 @@ files:
242
256
  - spec/integration/setup_spec.rb
243
257
  - spec/integration/support/active_support_notifications_spec.rb
244
258
  - spec/integration/support/rails_log_subscriber_spec.rb
259
+ - spec/shared/accounts.rb
245
260
  - spec/shared/database_setup.rb
261
+ - spec/shared/notes.rb
262
+ - spec/shared/posts.rb
263
+ - spec/shared/puppies.rb
246
264
  - spec/shared/relations.rb
247
- - spec/shared/users_and_accounts.rb
265
+ - spec/shared/users.rb
248
266
  - spec/shared/users_and_tasks.rb
249
267
  - spec/spec_helper.rb
268
+ - spec/support/env_helper.rb
250
269
  - spec/support/helpers.rb
270
+ - spec/support/oracle/create_users.sql
271
+ - spec/support/oracle/set_sys_passwords.sql
251
272
  - spec/unit/association/many_to_many_spec.rb
252
273
  - spec/unit/association/many_to_one_spec.rb
253
274
  - spec/unit/association/name_spec.rb
@@ -320,7 +341,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
320
341
  version: '0'
321
342
  requirements: []
322
343
  rubyforge_project:
323
- rubygems_version: 2.5.2
344
+ rubygems_version: 2.6.9
324
345
  signing_key:
325
346
  specification_version: 4
326
347
  summary: SQL databases support for ROM
@@ -366,12 +387,19 @@ test_files:
366
387
  - spec/integration/setup_spec.rb
367
388
  - spec/integration/support/active_support_notifications_spec.rb
368
389
  - spec/integration/support/rails_log_subscriber_spec.rb
390
+ - spec/shared/accounts.rb
369
391
  - spec/shared/database_setup.rb
392
+ - spec/shared/notes.rb
393
+ - spec/shared/posts.rb
394
+ - spec/shared/puppies.rb
370
395
  - spec/shared/relations.rb
371
- - spec/shared/users_and_accounts.rb
396
+ - spec/shared/users.rb
372
397
  - spec/shared/users_and_tasks.rb
373
398
  - spec/spec_helper.rb
399
+ - spec/support/env_helper.rb
374
400
  - spec/support/helpers.rb
401
+ - spec/support/oracle/create_users.sql
402
+ - spec/support/oracle/set_sys_passwords.sql
375
403
  - spec/unit/association/many_to_many_spec.rb
376
404
  - spec/unit/association/many_to_one_spec.rb
377
405
  - spec/unit/association/name_spec.rb