rom-sql 0.3.2 → 0.4.0.beta1

Sign up to get free protection for your applications and to get access to all the features.
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