hanami-model 0.6.0 → 0.6.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: a99014d711cf7b1e4fd9469acdee5a7fefb69d9f
4
- data.tar.gz: 71781d9d98ea8e5b5e75bd0df4527ed47f6e6b3a
3
+ metadata.gz: 29439a9ce3f9aa3cdd0600a6a04a0316209eb91d
4
+ data.tar.gz: fa6bb573a2e58f14cc3b09126168fdc4ed88f72a
5
5
  SHA512:
6
- metadata.gz: 312c76418b3d0e8a8c7c41125c009f03bfdd03c4102de60ed87806df705c9584922ff1afc952b6ae383a86805b209333c1ba31dbfb4706810028bcba598e88f9
7
- data.tar.gz: 5bba6c44f8cebef794b53c7b7a94d897f09098440feec568f293602fc46e0593c52ce090451cdcaee76e261fc0a908d731aa82ab552afb172b078f07e3be46ba
6
+ metadata.gz: 10a26d11cb59a13d93664a4e9fd29d35f8fa6ce788d95281b7b805ed04cf9a4ca390ace931c3a943ee65fc8a55b138f9931d5c351a50d09b19d8acf8b1845cae
7
+ data.tar.gz: 5d5ef5cf0bdee581b7d4d9272fd064c3c8973ea4a6da813fe318f49c24b00a285c6a4b2a410166b19560ddbc6a4a9a69f4a3221d79efc952f3d40e8234599a63
@@ -1,6 +1,10 @@
1
1
  # Hanami::Model
2
2
  A persistence layer for Hanami
3
3
 
4
+ ## v0.6.1 - 2016-02-05
5
+ ### Changed
6
+ - [Hélio Costa e Silva & Pascal Betz] Mapping SQL Adapter's errors as `Hanami::Model` errors
7
+
4
8
  ## v0.6.0 - 2016-01-22
5
9
  ### Changed
6
10
  - [Luca Guidi] Renamed the project
data/EXAMPLE.md CHANGED
@@ -58,7 +58,8 @@ We have two entities in our application: `Author` and `Article`.
58
58
  ```ruby
59
59
  Author = Struct.new(:id, :name) do
60
60
  def initialize(attributes = {})
61
- @id, @name = attributes.values_at(:id, :name)
61
+ self.id = attributes[:id]
62
+ self.name = attributes[:name]
62
63
  end
63
64
  end
64
65
 
@@ -159,7 +160,7 @@ We instantiate and persist an `Author` and a few `Articles` for our example:
159
160
 
160
161
  ```ruby
161
162
  author = Author.new(name: 'Luca')
162
- AuthorRepository.create(author)
163
+ author = AuthorRepository.create(author)
163
164
 
164
165
  articles = [
165
166
  Article.new(title: 'Announcing Hanami', author_id: author.id, comments_count: 123, published: true),
data/README.md CHANGED
@@ -19,8 +19,8 @@ Like all the other Hanami components, it can be used as a standalone framework o
19
19
 
20
20
  [![Gem Version](https://badge.fury.io/rb/hanami-model.svg)](http://badge.fury.io/rb/hanami-model)
21
21
  [![Build Status](https://secure.travis-ci.org/hanami/model.svg?branch=master)](http://travis-ci.org/hanami/model?branch=master)
22
- [![Coverage](https://img.shields.io/coveralls/hanami/model/master.svg)](https://coveralls.io/r/hanami/model)
23
- [![Code Climate](https://img.shields.io/codeclimate/github/hanami/model.svg)](https://codeclimate.com/github/hanami/model)
22
+ [![Coverage](https://coveralls.io/repos/github/hanami/model/badge.svg?branch=master)](https://coveralls.io/github/hanami/model?branch=master)
23
+ [![Code Climate](https://codeclimate.com/github/hanami/model/badges/gpa.svg)](https://codeclimate.com/github/hanami/model)
24
24
  [![Dependencies](https://gemnasium.com/hanami/model.svg)](https://gemnasium.com/hanami/model)
25
25
  [![Inline docs](http://inch-ci.org/github/hanami/model.png)](http://inch-ci.org/github/hanami/model)
26
26
 
@@ -470,6 +470,20 @@ If you need more information regarding those methods, you can use comments from
470
470
 
471
471
  Think of an adapter for Redis, it will probably employ different strategies to filter records than an SQL query object.
472
472
 
473
+ ### Model Error Coercions
474
+
475
+ All adapters' errors are encapsulated into Hanami error classes.
476
+
477
+ Hanami Model may raise the following exceptions:
478
+
479
+ * `Hanami::Model::UniqueConstraintViolationError`
480
+ * `Hanami::Model::ForeignKeyConstraintViolationError`
481
+ * `Hanami::Model::NotNullConstraintViolationError`
482
+ * `Hanami::Model::CheckConstraintViolationError`
483
+
484
+ For any other adapter's errors, Hanami will raise the `Hanami::Model::InvalidCommandError` object.
485
+ All errors contains the root cause and the full error message thrown by sql adapter.
486
+
473
487
  ### Conventions
474
488
 
475
489
  * A repository must be named after an entity, by appending `"Repository"` to the entity class name (eg. `Article` => `ArticleRepository`).
@@ -11,42 +11,6 @@ module Hanami
11
11
  #
12
12
  # @since 0.1.0
13
13
  module Model
14
- # Error for non persisted entity
15
- # It's raised when we try to update or delete a non persisted entity.
16
- #
17
- # @since 0.1.0
18
- #
19
- # @see Hanami::Repository.update
20
- class NonPersistedEntityError < Hanami::Model::Error
21
- end
22
-
23
- # Error for invalid mapper configuration
24
- # It's raised when mapping is not configured correctly
25
- #
26
- # @since 0.2.0
27
- #
28
- # @see Hanami::Configuration#mapping
29
- class InvalidMappingError < Hanami::Model::Error
30
- end
31
-
32
- # Error for invalid raw command syntax
33
- #
34
- # @since 0.5.0
35
- class InvalidCommandError < Hanami::Model::Error
36
- def initialize(message = "Invalid command")
37
- super
38
- end
39
- end
40
-
41
- # Error for invalid raw query syntax
42
- #
43
- # @since 0.3.1
44
- class InvalidQueryError < Hanami::Model::Error
45
- def initialize(message = "Invalid query")
46
- super
47
- end
48
- end
49
-
50
14
  include Utils::ClassAttribute
51
15
 
52
16
  # Framework configuration
@@ -204,6 +168,5 @@ module Hanami
204
168
  duplicated.configure(&blk) if block_given?
205
169
  end
206
170
  end
207
-
208
171
  end
209
172
  end
@@ -9,6 +9,15 @@ module Hanami
9
9
  # @api private
10
10
  # @since 0.1.0
11
11
  class Command
12
+ # @api private
13
+ # @since 0.6.1
14
+ SEQUEL_TO_HANAMI_ERROR_MAPPING = {
15
+ 'Sequel::UniqueConstraintViolation' => Hanami::Model::UniqueConstraintViolationError,
16
+ 'Sequel::ForeignKeyConstraintViolation' => Hanami::Model::ForeignKeyConstraintViolationError,
17
+ 'Sequel::NotNullConstraintViolation' => Hanami::Model::NotNullConstraintViolationError,
18
+ 'Sequel::CheckConstraintViolation' => Hanami::Model::CheckConstraintViolationError
19
+ }.freeze
20
+
12
21
  # Initialize a command
13
22
  #
14
23
  # @param query [Hanami::Model::Adapters::Sql::Query]
@@ -30,9 +39,7 @@ module Hanami
30
39
  # @api private
31
40
  # @since 0.1.0
32
41
  def create(entity)
33
- @collection.insert(entity)
34
- rescue Sequel::DatabaseError => e
35
- raise Hanami::Model::Error.new(e.message)
42
+ _handle_database_error { @collection.insert(entity) }
36
43
  end
37
44
 
38
45
  # Updates the corresponding record for the given entity.
@@ -44,9 +51,7 @@ module Hanami
44
51
  # @api private
45
52
  # @since 0.1.0
46
53
  def update(entity)
47
- @collection.update(entity)
48
- rescue Sequel::DatabaseError => e
49
- raise Hanami::Model::Error.new(e.message)
54
+ _handle_database_error { @collection.update(entity) }
50
55
  end
51
56
 
52
57
  # Deletes all the records for the current query.
@@ -59,15 +64,25 @@ module Hanami
59
64
  # @api private
60
65
  # @since 0.1.0
61
66
  def delete
62
- @collection.delete
63
- rescue Sequel::DatabaseError => e
64
- raise Hanami::Model::Error.new(e.message)
67
+ _handle_database_error { @collection.delete }
65
68
  end
66
69
 
67
70
  alias_method :clear, :delete
71
+
72
+ private
73
+
74
+ # Handles any possible Adapter's Database Error
75
+ #
76
+ # @api private
77
+ # @since 0.6.1
78
+ def _handle_database_error
79
+ yield
80
+ rescue Sequel::DatabaseError => e
81
+ error_class = SEQUEL_TO_HANAMI_ERROR_MAPPING.fetch(e.class.name, Hanami::Model::InvalidCommandError)
82
+ raise error_class, e.message
83
+ end
68
84
  end
69
85
  end
70
86
  end
71
87
  end
72
88
  end
73
-
@@ -1,7 +1,79 @@
1
1
  module Hanami
2
2
  module Model
3
+
4
+ # Default Error class
5
+ #
3
6
  # @since 0.5.1
4
- class Error < ::StandardError
7
+ Error = Class.new(::StandardError)
8
+
9
+ # Error for non persisted entity
10
+ # It's raised when we try to update or delete a non persisted entity.
11
+ #
12
+ # @since 0.1.0
13
+ #
14
+ # @see Hanami::Repository.update
15
+ NonPersistedEntityError = Class.new(Error)
16
+
17
+ # Error for invalid mapper configuration
18
+ # It's raised when mapping is not configured correctly
19
+ #
20
+ # @since 0.2.0
21
+ #
22
+ # @see Hanami::Configuration#mapping
23
+ InvalidMappingError = Class.new(Error)
24
+
25
+ # Error for invalid raw command syntax
26
+ #
27
+ # @since 0.5.0
28
+ class InvalidCommandError < Error
29
+ def initialize(message = "Invalid command")
30
+ super
31
+ end
32
+ end
33
+
34
+ # Error for invalid raw query syntax
35
+ #
36
+ # @since 0.3.1
37
+ class InvalidQueryError < Error
38
+ def initialize(message = "Invalid query")
39
+ super
40
+ end
41
+ end
42
+
43
+ # Error for Unique Constraint Violation
44
+ #
45
+ # @since 0.6.1
46
+ class UniqueConstraintViolationError < Error
47
+ def initialize(message = "Unique constraint has been violated")
48
+ super
49
+ end
50
+ end
51
+
52
+ # Error for Foreign Key Constraint Violation
53
+ #
54
+ # @since 0.6.1
55
+ class ForeignKeyConstraintViolationError < Error
56
+ def initialize(message = "Foreign key constraint has been violated")
57
+ super
58
+ end
59
+ end
60
+
61
+ # Error for Not Null Constraint Violation
62
+ #
63
+ # @since 0.6.1
64
+ class NotNullConstraintViolationError < Error
65
+ def initialize(message = "NOT NULL constraint has been violated")
66
+ super
67
+ end
68
+ end
69
+
70
+ # Error for Check Constraint Violation raised by Sequel
71
+ #
72
+ # @since 0.6.1
73
+ class CheckConstraintViolationError < Error
74
+ def initialize(message = "Check constraint has been violated")
75
+ super
76
+ end
5
77
  end
6
78
  end
7
79
  end
@@ -3,6 +3,6 @@ module Hanami
3
3
  # Defines the version
4
4
  #
5
5
  # @since 0.1.0
6
- VERSION = '0.6.0'.freeze
6
+ VERSION = '0.6.1'.freeze
7
7
  end
8
8
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: hanami-model
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.6.0
4
+ version: 0.6.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Luca Guidi
@@ -10,7 +10,7 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2016-01-22 00:00:00.000000000 Z
13
+ date: 2016-02-05 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: hanami-utils