rom-sql 0.3.2 → 0.4.0.beta1

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 (53) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +1 -0
  3. data/.rubocop.yml +55 -18
  4. data/.rubocop_todo.yml +15 -0
  5. data/.travis.yml +10 -5
  6. data/CHANGELOG.md +18 -0
  7. data/Gemfile +8 -1
  8. data/Guardfile +24 -0
  9. data/README.md +14 -22
  10. data/Rakefile +13 -5
  11. data/lib/rom/sql.rb +5 -5
  12. data/lib/rom/sql/commands.rb +7 -49
  13. data/lib/rom/sql/commands/create.rb +29 -0
  14. data/lib/rom/sql/commands/delete.rb +18 -0
  15. data/lib/rom/sql/commands/transaction.rb +17 -0
  16. data/lib/rom/sql/commands/update.rb +54 -0
  17. data/lib/rom/sql/commands_ext/postgres.rb +24 -0
  18. data/lib/rom/sql/header.rb +8 -9
  19. data/lib/rom/sql/migration.rb +26 -0
  20. data/lib/rom/sql/plugin/pagination.rb +93 -0
  21. data/lib/rom/sql/rake_task.rb +2 -0
  22. data/lib/rom/sql/relation.rb +320 -0
  23. data/lib/rom/sql/relation/associations.rb +104 -0
  24. data/lib/rom/sql/relation/class_methods.rb +47 -0
  25. data/lib/rom/sql/relation/inspection.rb +16 -0
  26. data/lib/rom/sql/repository.rb +59 -0
  27. data/lib/rom/sql/support/rails_log_subscriber.rb +1 -1
  28. data/lib/rom/sql/tasks/migration_tasks.rake +56 -0
  29. data/lib/rom/sql/version.rb +1 -1
  30. data/rom-sql.gemspec +2 -3
  31. data/spec/integration/commands/create_spec.rb +66 -8
  32. data/spec/integration/commands/delete_spec.rb +22 -3
  33. data/spec/integration/commands/update_spec.rb +57 -6
  34. data/spec/integration/read_spec.rb +42 -1
  35. data/spec/shared/database_setup.rb +10 -5
  36. data/spec/spec_helper.rb +17 -0
  37. data/spec/support/active_support_notifications_spec.rb +5 -4
  38. data/spec/support/rails_log_subscriber_spec.rb +2 -2
  39. data/spec/unit/logger_spec.rb +5 -3
  40. data/spec/unit/many_to_many_spec.rb +2 -2
  41. data/spec/unit/migration_spec.rb +34 -0
  42. data/spec/unit/migration_tasks_spec.rb +99 -0
  43. data/spec/unit/one_to_many_spec.rb +0 -2
  44. data/spec/unit/plugin/pagination_spec.rb +73 -0
  45. data/spec/unit/relation_spec.rb +49 -3
  46. data/spec/unit/repository_spec.rb +33 -0
  47. data/spec/unit/schema_spec.rb +5 -17
  48. metadata +32 -35
  49. data/lib/rom/sql/adapter.rb +0 -100
  50. data/lib/rom/sql/relation_inclusion.rb +0 -149
  51. data/lib/rom/sql/support/sequel_dataset_ext.rb +0 -33
  52. data/spec/unit/adapter_spec.rb +0 -48
  53. data/spec/unit/config_spec.rb +0 -54
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 2e002fcfac65061b46118390214d8731033307b4
4
- data.tar.gz: a13fd979244aee8b7a2c46ef4b522333534ecbd9
3
+ metadata.gz: 43358c16de1cbf1030d10052160c9a5a7e922216
4
+ data.tar.gz: 0c9950d51f83c690436f1ba9504435c2bad53d2c
5
5
  SHA512:
6
- metadata.gz: 27e70cf80b500a17af3d29ec60d10c9066caed57256a39f9f7acdc6955999b68d38b18e0356d2ac0518340280651ef5d08d15fd973753050cd66086e0bed2726
7
- data.tar.gz: 8b37d7213ff4a0330a3331969886d670a8a09d46dd0cea8145bd45a1959259d44b3fe4dfac5544df6cda76eb0718d6b3406b67d0b7953c90c04c1346ee80bd88
6
+ metadata.gz: 916eb01f87b7825519ec9d917ee1904e04fa75537e5e2e35ba470cdc6239f4a0f2037393b64cec97e77fd9f1ea322939cf919e00618a6fff628297bfd1d9ab34
7
+ data.tar.gz: d2a3fe1e9077a547b44938c3600d5586548a7a283fa4d46de8c2d73d8b51394f56e8691b88d6197a38de9662c2c3ec697d24ed5415ee48df522010877da70728
data/.gitignore CHANGED
@@ -12,3 +12,4 @@
12
12
  *.o
13
13
  *.a
14
14
  mkmf.log
15
+ log/*.log
data/.rubocop.yml CHANGED
@@ -1,41 +1,78 @@
1
- # FIXME: Lower by refactoring biggest offenders
2
- Metrics/AbcSize:
3
- Max: 27
1
+ # Generated by `rubocop --auto-gen-config`
2
+ inherit_from: .rubocop_todo.yml
4
3
 
5
- # FIXME: Lower by refactoring biggest offenders
6
- Metrics/MethodLength:
7
- Max: 32
4
+ # Exclude temporary files
5
+ AllCops:
6
+ Exclude:
7
+ - tmp/**/*
8
+
9
+ # It’s quite readable when we know what we are doing
10
+ Lint/AssignmentInCondition:
11
+ Enabled: false
8
12
 
9
- # FIXME: Lower by refactoring biggest offenders
10
- Metrics/PerceivedComplexity:
11
- Max: 9
13
+ # No need to handle LoadError in Rakefile
14
+ Lint/HandleExceptions:
15
+ Exclude:
16
+ - Rakefile
12
17
 
13
- # This file is not worth fixing
18
+ # gemspec is a special snowflake
14
19
  Metrics/LineLength:
15
20
  Exclude:
16
- - spec/support/active_support_notifications_spec.rb
21
+ - rom.gemspec
17
22
 
18
23
  # The enforced style doesn’t match Vim’s defaults
19
24
  Style/AlignParameters:
20
25
  Enabled: false
21
26
 
27
+ # UTF-8 is perfectly fine in comments
28
+ Style/AsciiComments:
29
+ Enabled: false
30
+
31
+ # Allow using braces for value-returning blocks
32
+ Style/Blocks:
33
+ Enabled: false
34
+
22
35
  # Documentation checked by Inch CI
23
36
  Style/Documentation:
24
37
  Enabled: false
25
38
 
26
- # This is a shim file for those who require 'rom-mongo'
27
- Style/FileName:
28
- Exclude:
29
- - lib/rom-sql.rb
39
+ # Early returns have their vices
40
+ Style/GuardClause:
41
+ Enabled: false
30
42
 
31
- # The default style doesn’t match Vim’s defaults
32
- Style/IndentHash:
33
- EnforcedStyle: consistent
43
+ # Need to be skipped for >-> usage
44
+ Style/Lambda:
45
+ Enabled: false
46
+
47
+ # Multiline block chains are ok
48
+ Style/MultilineBlockChain:
49
+ Enabled: false
50
+
51
+ # Result::Success and Result::Failure use > for callbacks
52
+ Style/OpMethod:
53
+ Exclude:
54
+ - lib/rom/command_registry.rb
34
55
 
35
56
  # Even a single escaped slash can be confusing
36
57
  Style/RegexpLiteral:
37
58
  MaxSlashes: 0
38
59
 
60
+ # Don’t introduce semantic fail/raise distinction
61
+ Style/SignalException:
62
+ EnforcedStyle: only_raise
63
+
64
+ # Need to be skipped for >-> usage
65
+ Style/SpaceAroundOperators:
66
+ Enabled: false
67
+
39
68
  # Accept both single and double quotes
40
69
  Style/StringLiterals:
41
70
  Enabled: false
71
+
72
+ # Allow def self.foo; @foo; end
73
+ Style/TrivialAccessors:
74
+ Enabled: false
75
+
76
+ # Allow rom-sql
77
+ Style/FileName:
78
+ Enabled: false
data/.rubocop_todo.yml ADDED
@@ -0,0 +1,15 @@
1
+ # This configuration was generated by `rubocop --auto-gen-config`
2
+ # on 2015-01-25 22:37:25 +0100 using RuboCop version 0.28.0.
3
+ # The point is for the user to remove these configuration records
4
+ # one by one as the offenses are removed from the code base.
5
+ # Note that changes in the inspected code, or installation of new
6
+ # versions of RuboCop, may require this file to be generated again.
7
+
8
+ # Offense count: 3
9
+ Metrics/AbcSize:
10
+ Max: 20
11
+
12
+ # Offense count: 2
13
+ # Configuration parameters: CountComments.
14
+ Metrics/MethodLength:
15
+ Max: 14
data/.travis.yml CHANGED
@@ -1,21 +1,26 @@
1
1
  language: ruby
2
- bundler_args: --without yard guard benchmarks
3
- env:
4
- - CODECLIMATE_REPO_TOKEN=03d7f66589572702b12426d2bc71c4de6281a96139e33b335b894264b1f8f0b0
2
+ sudo: false
3
+ cache: bundler
4
+ bundler_args: --without yard guard benchmarks tools
5
5
  before_script:
6
6
  - psql -c 'create database rom;' -U postgres
7
- script: "bundle exec rake spec"
7
+ script: "bundle exec rake ci"
8
8
  rvm:
9
9
  - 2.0
10
10
  - 2.1
11
11
  - 2.2
12
12
  - rbx-2
13
13
  - jruby
14
+ - jruby-head
14
15
  - ruby-head
16
+ env:
17
+ global:
18
+ - CODECLIMATE_REPO_TOKEN=03d7f66589572702b12426d2bc71c4de6281a96139e33b335b894264b1f8f0b0
19
+ - JRUBY_OPTS='--dev -J-Xmx1024M'
15
20
  matrix:
16
21
  allow_failures:
17
22
  - rvm: ruby-head
18
- - rvm: jruby
23
+ - rvm: jruby-head
19
24
  notifications:
20
25
  webhooks:
21
26
  urls:
data/CHANGELOG.md CHANGED
@@ -1,3 +1,21 @@
1
+ ## v0.4.0 to-be-released
2
+
3
+ ### Added
4
+
5
+ * `ROM::SQL::Relation` which explictly defines an interface on top of Sequel (solnic + mcls)
6
+ * Experimental migration API using sequel/migrations (gotar)
7
+ * Pagination plugin (solnic)
8
+
9
+ ### Changed
10
+
11
+ * Use ROM's own inflector which uses either ActiveSupport or Inflecto backends (mjtko)
12
+
13
+ ### Fixed
14
+
15
+ * Indentation in Rails logger (morgoth)
16
+
17
+ [Compare v0.3.2...master](https://github.com/rom-rb/rom-sql/compare/v0.3.2...master)
18
+
1
19
  ## v0.3.2 2015-01-01
2
20
 
3
21
  ### Fixed
data/Gemfile CHANGED
@@ -3,7 +3,7 @@ source 'https://rubygems.org'
3
3
  gemspec
4
4
 
5
5
  group :test do
6
- gem 'rom', '~> 0.5.0', github: 'rom-rb/rom', branch: 'master'
6
+ gem 'rom', '~> 0.6.0', github: 'rom-rb/rom', branch: 'master'
7
7
  gem 'virtus'
8
8
  gem 'activesupport'
9
9
  gem 'rspec', '~> 3.1'
@@ -11,3 +11,10 @@ group :test do
11
11
  gem 'pg', platforms: [:mri, :rbx]
12
12
  gem 'pg_jruby', platforms: :jruby
13
13
  end
14
+
15
+ group :tools do
16
+ gem 'guard'
17
+ gem 'guard-rspec'
18
+ gem 'guard-rubocop'
19
+ gem 'rubocop', '~> 0.28'
20
+ end
data/Guardfile ADDED
@@ -0,0 +1,24 @@
1
+ group :red_green_refactor, halt_on_fail: true do
2
+ guard :rspec, cmd: "rspec", all_on_start: true do
3
+ # run all specs if Gemfile.lock is modified
4
+ watch('Gemfile.lock') { 'spec' }
5
+
6
+ # run all specs if any library code is modified
7
+ watch(%r{\Alib/.+\.rb\z}) { 'spec' }
8
+
9
+ # run all specs if supporting files are modified
10
+ watch('spec/spec_helper.rb') { 'spec' }
11
+ watch(%r{\Aspec/(?:lib|support|shared)/.+\.rb\z}) { 'spec' }
12
+
13
+ # run a spec if it is modified
14
+ watch(%r{\Aspec/(?:unit|integration)/.+_spec\.rb\z})
15
+
16
+ notification :tmux, display_message: true if ENV.key?('TMUX')
17
+ end
18
+
19
+ guard :rubocop do
20
+ # run rubocop on modified file
21
+ watch(%r{\Alib/.+\.rb\z})
22
+ watch(%r{\Aspec/.+\.rb\z})
23
+ end
24
+ end
data/README.md CHANGED
@@ -41,15 +41,15 @@ in relation objects. For schema migrations you can use its
41
41
  which is available via repositories.
42
42
 
43
43
  ``` ruby
44
- setup = ROM.setup(sqlite: "sqlite::memory")
44
+ setup = ROM.setup(:sql, "sqlite::memory")
45
45
 
46
- setup.sqlite.connection.create_table(:users) do
46
+ setup.default.connection.create_table(:users) do
47
47
  primary_key :id
48
48
  String :name
49
49
  Boolean :admin
50
50
  end
51
51
 
52
- setup.sqlite.connection.create_table(:tasks) do
52
+ setup.default.connection.create_table(:tasks) do
53
53
  primary_key :id
54
54
  Integer :user_id
55
55
  String :title
@@ -60,15 +60,15 @@ end
60
60
 
61
61
  ``` ruby
62
62
 
63
- setup.relation(:tasks)
63
+ class Users < ROM::Relation[:sql]
64
+ base_name :users
64
65
 
65
- setup.relation(:users) do
66
66
  def by_name(name)
67
67
  where(name: name)
68
68
  end
69
69
  end
70
70
 
71
- rom = setup.finalize
71
+ rom = ROM.finalize.env
72
72
 
73
73
  users = rom.relations.users
74
74
  tasks = rom.relations.tasks
@@ -95,9 +95,9 @@ Sequel's association DSL is available in relation definitions which enables
95
95
  aggregate objects `wrap` and `group` mapping transformation can be used
96
96
 
97
97
  ``` ruby
98
- setup.relation(:tasks)
98
+ ROM.setup(:sql, "sqlite::memory")
99
99
 
100
- setup.relation(:users) do
100
+ class Users < ROM::Relation[:sql]
101
101
  one_to_many :tasks, key: :user_id
102
102
 
103
103
  def by_name(name)
@@ -109,15 +109,15 @@ setup.relation(:users) do
109
109
  end
110
110
  end
111
111
 
112
- setup.mappers do
113
- define(:users) do
114
- model name: 'User'
112
+ class UserMapper < ROM::Mapper
113
+ relation :users
115
114
 
116
- group tasks: [:title]
117
- end
115
+ model name: 'User'
116
+
117
+ group tasks: [:title]
118
118
  end
119
119
 
120
- rom = setup.finalize
120
+ rom = ROM.finalize.env
121
121
 
122
122
  users = rom.relations.users
123
123
  tasks = rom.relations.tasks
@@ -131,14 +131,6 @@ rom.read(:users).with_tasks.by_name("Piotr").to_a
131
131
 
132
132
  ## ROADMAP
133
133
 
134
- On a very high level:
135
-
136
- * Make it dead simple to join relations and support all types of joins
137
- * Make it dead simple to select and alias column names
138
- * Discover conventions for typical query scenarios and make common things trivial,
139
- less common things simple and super rare cases possible
140
- * Make mapper interface smart enough to figure out when columns are aliased
141
-
142
134
  For details please refer to [issues](https://github.com/rom-rb/rom-sql/issues).
143
135
 
144
136
  ## License
data/Rakefile CHANGED
@@ -1,10 +1,18 @@
1
1
  require "rspec/core/rake_task"
2
- require "rubocop/rake_task"
3
-
4
- task default: [:spec, :rubocop]
5
2
 
6
3
  RSpec::Core::RakeTask.new(:spec)
4
+ task default: [:ci]
5
+
6
+ desc "Run CI tasks"
7
+ task ci: [:spec]
8
+
9
+ begin
10
+ require "rubocop/rake_task"
11
+
12
+ Rake::Task[:default].enhance [:rubocop]
7
13
 
8
- RuboCop::RakeTask.new do |task|
9
- task.options << "--display-cop-names"
14
+ RuboCop::RakeTask.new do |task|
15
+ task.options << "--display-cop-names"
16
+ end
17
+ rescue LoadError
10
18
  end
data/lib/rom/sql.rb CHANGED
@@ -8,13 +8,13 @@ module ROM
8
8
  end
9
9
 
10
10
  require "rom/sql/version"
11
- require "rom/sql/header"
12
- require "rom/sql/relation_inclusion"
13
- require "rom/sql/adapter"
14
-
15
- require "rom/sql/support/sequel_dataset_ext"
11
+ require "rom/sql/relation"
12
+ require "rom/sql/repository"
13
+ require "rom/sql/migration"
16
14
 
17
15
  if defined?(Rails)
18
16
  require "rom/sql/support/active_support_notifications"
19
17
  require 'rom/sql/support/rails_log_subscriber'
20
18
  end
19
+
20
+ ROM.register_adapter(:sql, ROM::SQL)
@@ -1,3 +1,5 @@
1
+ require 'rom/commands'
2
+
1
3
  module ROM
2
4
  module SQL
3
5
  module Commands
@@ -5,55 +7,11 @@ module ROM
5
7
  Sequel::UniqueConstraintViolation,
6
8
  Sequel::NotNullConstraintViolation
7
9
  ].freeze
8
-
9
- module TupleCount
10
- # TODO: we need an interface for "target_count" here
11
- def assert_tuple_count
12
- if result == :one && target.count > 1
13
- raise TupleCountMismatchError, "#{inspect} expects one tuple"
14
- end
15
- end
16
- end
17
-
18
- class Create < ROM::Commands::Create
19
- include TupleCount
20
-
21
- def execute(tuples)
22
- pks = Array([tuples]).flatten.map do |tuple|
23
- attributes = input[tuple]
24
- validator.call(attributes)
25
- relation.insert(attributes.to_h)
26
- end
27
-
28
- relation.where(relation.model.primary_key => pks)
29
- rescue *ERRORS => e
30
- raise ConstraintError, e.message
31
- end
32
- end
33
-
34
- class Update < ROM::Commands::Update
35
- include TupleCount
36
-
37
- def execute(tuple)
38
- attributes = input[tuple]
39
- validator.call(attributes)
40
-
41
- pks = relation.map { |t| t[relation.model.primary_key] }
42
-
43
- relation.update(attributes.to_h)
44
- relation.unfiltered.where(relation.model.primary_key => pks)
45
- end
46
- end
47
-
48
- class Delete < ROM::Commands::Delete
49
- include TupleCount
50
-
51
- def execute
52
- deleted = target.to_a
53
- target.delete
54
- deleted
55
- end
56
- end
57
10
  end
58
11
  end
59
12
  end
13
+
14
+ require 'rom/sql/commands/create'
15
+ require 'rom/sql/commands/update'
16
+ require 'rom/sql/commands/delete'
17
+ require 'rom/sql/commands_ext/postgres'
@@ -0,0 +1,29 @@
1
+ require 'rom/sql/commands'
2
+ require 'rom/sql/commands/transaction'
3
+
4
+ module ROM
5
+ module SQL
6
+ module Commands
7
+ class Create < ROM::Commands::Create
8
+ include Transaction
9
+
10
+ def execute(tuples)
11
+ insert_tuples = Array([tuples]).flatten.map do |tuple|
12
+ attributes = input[tuple]
13
+ validator.call(attributes)
14
+ attributes.to_h
15
+ end
16
+
17
+ insert(insert_tuples)
18
+ rescue *ERRORS => e
19
+ raise ConstraintError, e.message
20
+ end
21
+
22
+ def insert(tuples)
23
+ pks = tuples.map { |tuple| relation.insert(tuple) }
24
+ relation.where(relation.primary_key => pks)
25
+ end
26
+ end
27
+ end
28
+ end
29
+ end