lotus-model 0.2.4 → 0.3.0

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: d9b8be05452d72973dfe52baddeb52b8510c65f2
4
- data.tar.gz: 4786325b8907e16e408259da3e1ff56846739d32
3
+ metadata.gz: aa3a89ff8d50e481fffb8cbd68c8cc38bb97e52a
4
+ data.tar.gz: c1205c925a3cadac434c381d8f80dd5a15846544
5
5
  SHA512:
6
- metadata.gz: 2a98aa092e3e74a6a15ec494b51360142ed6cdf1d1f153a9b70c769f68eae47b54af4e0c74c3de6bbe8b1abeda6abf9eb0c6d23c47859f14b8b3337208f8abb7
7
- data.tar.gz: a41f041635936b946c3f0870839457e25d33cfaa7af81e2f03f6434cc7c38d21cf7d9562897001d2fd54061c6a11ed7531da66df37d6b69d93629a7d5dc7aeb5
6
+ metadata.gz: 573a4b357ec946e3945e819279fe646f72b22144da46e3d8a1f7adf140d6845e9811fad860bd33cd97afcc5587bac93a470489c73ae7e5355be7e463c453d5cd
7
+ data.tar.gz: 2d380bd41f0f1d3f934d1d4b74e036126f34f5fc0207a3066549c0ab9f31fd5c930f06ffea5baa081734b9dd02de19a34028e3a51cc3094ba99f1e1e9a260f46
data/CHANGELOG.md CHANGED
@@ -1,9 +1,19 @@
1
1
  # Lotus::Model
2
2
  A persistence layer for Lotus
3
3
 
4
+ ## v0.3.0 - 2015-03-23
5
+ ### Added
6
+ - [Linus Pettersson] Database console
7
+
8
+ ### Fixed
9
+ - [Alfonso Uceda Pompa] Don't send unwanted null values to the database, while coercing entities
10
+ - [Jan Lelis] Do not define top-level `Boolean`, because it is already defined by `lotus-utils`
11
+ - [Vsevolod Romashov] Fix entity class resolving in `Coercer#from_record`
12
+ - [Jason Harrelson] Add file and line to `instance_eval` in `Coercer` to make backtrace more usable
13
+
4
14
  ## v0.2.4 - 2015-02-20
5
15
  ### Fixed
6
- - [Luca Guidi] When duplicate the framework don't copy over the original `Lotus::Model` configuration.
16
+ - [Luca Guidi] When duplicate the framework don't copy over the original `Lotus::Model` configuration
7
17
 
8
18
  ## v0.2.3 - 2015-02-13
9
19
  ### Added
@@ -12,6 +12,17 @@ module Lotus
12
12
  class DatabaseAdapterNotFound < ::StandardError
13
13
  end
14
14
 
15
+ # It's raised when an adapter does not support a feature.
16
+ #
17
+ # Example: When we try to get a connection string for the current database
18
+ # but the adapter has not implemented it.
19
+ #
20
+ # @see Lotus::Model::Adapters::Abstract#connection_string
21
+ #
22
+ # @since 0.3.0
23
+ class NotSupportedError < ::StandardError
24
+ end
25
+
15
26
  # Abstract adapter.
16
27
  #
17
28
  # An adapter is a concrete implementation that allows a repository to
@@ -180,6 +191,16 @@ module Lotus
180
191
  def transaction(options = {})
181
192
  raise NotImplementedError
182
193
  end
194
+
195
+ # Returns a string which can be executed to start a console suitable
196
+ # for the configured database.
197
+ #
198
+ # @return [String] to be executed to start a database console
199
+ #
200
+ # @since 0.3.0
201
+ def connection_string
202
+ raise NotSupportedError
203
+ end
183
204
  end
184
205
  end
185
206
  end
@@ -100,7 +100,7 @@ module Lotus
100
100
  # .where(framework: 'lotus')
101
101
  def where(condition)
102
102
  column, value = _expand_condition(condition)
103
- conditions.push([:where, Proc.new{ find_all{|r| r.fetch(column) == value} }])
103
+ conditions.push([:where, Proc.new{ find_all{|r| r.fetch(column, nil) == value} }])
104
104
  self
105
105
  end
106
106
 
@@ -0,0 +1,33 @@
1
+ module Lotus
2
+ module Model
3
+ module Adapters
4
+ module Sql
5
+ class Console
6
+ extend Forwardable
7
+
8
+ def_delegator :console, :connection_string
9
+
10
+ def initialize(uri)
11
+ @uri = URI.parse(uri)
12
+ end
13
+
14
+ private
15
+
16
+ def console
17
+ case @uri.scheme
18
+ when 'sqlite'
19
+ require 'lotus/model/adapters/sql/consoles/sqlite'
20
+ Consoles::Sqlite.new(@uri)
21
+ when 'postgres'
22
+ require 'lotus/model/adapters/sql/consoles/postgresql'
23
+ Consoles::Postgresql.new(@uri)
24
+ when 'mysql', 'mysql2'
25
+ require 'lotus/model/adapters/sql/consoles/mysql'
26
+ Consoles::Mysql.new(@uri)
27
+ end
28
+ end
29
+ end
30
+ end
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,49 @@
1
+ require 'shellwords'
2
+ module Lotus
3
+ module Model
4
+ module Adapters
5
+ module Sql
6
+ module Consoles
7
+ class Mysql
8
+ def initialize(uri)
9
+ @uri = uri
10
+ end
11
+
12
+ def connection_string
13
+ str = 'mysql'
14
+ str << host
15
+ str << database
16
+ str << port if port
17
+ str << username if username
18
+ str << password if password
19
+ str
20
+ end
21
+
22
+ private
23
+
24
+ def host
25
+ " -h #{@uri.host}"
26
+ end
27
+
28
+ def database
29
+ " -D #{@uri.path.sub(/^\//, '')}"
30
+ end
31
+
32
+ def port
33
+ " -P #{@uri.port}" if @uri.port
34
+ end
35
+
36
+ def username
37
+ " -u #{@uri.user}" if @uri.user
38
+ end
39
+
40
+ def password
41
+ " -p #{@uri.password}" if @uri.password
42
+ end
43
+ end
44
+ end
45
+ end
46
+ end
47
+ end
48
+ end
49
+
@@ -0,0 +1,48 @@
1
+ require 'shellwords'
2
+ module Lotus
3
+ module Model
4
+ module Adapters
5
+ module Sql
6
+ module Consoles
7
+ class Postgresql
8
+ def initialize(uri)
9
+ @uri = uri
10
+ end
11
+
12
+ def connection_string
13
+ configure_password
14
+ str = 'psql'
15
+ str << host
16
+ str << database
17
+ str << port if port
18
+ str << username if username
19
+ str
20
+ end
21
+
22
+ private
23
+
24
+ def host
25
+ " -h #{@uri.host}"
26
+ end
27
+
28
+ def database
29
+ " -d #{@uri.path.sub(/^\//, '')}"
30
+ end
31
+
32
+ def port
33
+ " -p #{@uri.port}" if @uri.port
34
+ end
35
+
36
+ def username
37
+ " -U #{@uri.user}" if @uri.user
38
+ end
39
+
40
+ def configure_password
41
+ ENV['PGPASSWORD'] = @uri.password if @uri.password
42
+ end
43
+ end
44
+ end
45
+ end
46
+ end
47
+ end
48
+ end
@@ -0,0 +1,26 @@
1
+ require 'shellwords'
2
+ module Lotus
3
+ module Model
4
+ module Adapters
5
+ module Sql
6
+ module Consoles
7
+ class Sqlite
8
+ def initialize(uri)
9
+ @uri = uri
10
+ end
11
+
12
+ def connection_string
13
+ "sqlite3 #{@uri.host}#{database}"
14
+ end
15
+
16
+ private
17
+
18
+ def database
19
+ Shellwords.escape(@uri.path)
20
+ end
21
+ end
22
+ end
23
+ end
24
+ end
25
+ end
26
+ end
@@ -3,6 +3,7 @@ require 'lotus/model/adapters/implementation'
3
3
  require 'lotus/model/adapters/sql/collection'
4
4
  require 'lotus/model/adapters/sql/command'
5
5
  require 'lotus/model/adapters/sql/query'
6
+ require 'lotus/model/adapters/sql/console'
6
7
  require 'sequel'
7
8
 
8
9
  module Lotus
@@ -215,6 +216,17 @@ module Lotus
215
216
  end
216
217
  end
217
218
 
219
+ # Returns a string which can be executed to start a console suitable
220
+ # for the configured database, adding the necessary CLI flags, such as
221
+ # url, password, port number etc.
222
+ #
223
+ # @return [String]
224
+ #
225
+ # @since 0.3.0
226
+ def connection_string
227
+ Sql::Console.new(@uri).connection_string
228
+ end
229
+
218
230
  private
219
231
 
220
232
  # Returns a collection from the given name.
@@ -28,7 +28,7 @@ module Lotus
28
28
  # adapter type: :sql, uri: 'postgres://localhost/database'
29
29
  # end
30
30
  #
31
- # Lotus::Model.adapter_config
31
+ # Lotus::Model.configuration.adapter_config
32
32
  # # => Lotus::Model::Config::Adapter(type: :sql, uri: 'postgres://localhost/database')
33
33
  #
34
34
  # By convention, Lotus inflects type to find the adapter class
@@ -91,7 +91,7 @@ module Lotus
91
91
  # adapter type: :sql, uri: 'sqlite3://localhost/database'
92
92
  # end
93
93
  #
94
- # Lotus::Model.adapter_config
94
+ # Lotus::Model.configuration.adapter_config
95
95
  #
96
96
  # @since 0.2.0
97
97
  def adapter(options = nil)
@@ -60,12 +60,14 @@ module Lotus
60
60
  if entity.id
61
61
  Hash[#{ @collection.attributes.map{|name,(klass,mapped)| ":#{mapped},Lotus::Model::Mapping::Coercions.#{klass}(entity.#{name})"}.join(',') }]
62
62
  else
63
- Hash[#{ @collection.attributes.reject{|name,_| name == @collection.identity }.map{|name,(klass,mapped)| ":#{mapped},Lotus::Model::Mapping::Coercions.#{klass}(entity.#{name})"}.join(',') }]
63
+ Hash[].tap do |record|
64
+ #{ @collection.attributes.reject{|name,_| name == @collection.identity }.map{|name,(klass,mapped)| "value = Lotus::Model::Mapping::Coercions.#{klass}(entity.#{name}); record[:#{mapped}] = value unless value.nil?"}.join('; ') }
65
+ end
64
66
  end
65
67
  end
66
68
 
67
69
  def from_record(record)
68
- #{ @collection.entity }.new(
70
+ ::#{ @collection.entity }.new(
69
71
  Hash[#{ @collection.attributes.map{|name,(klass,mapped)| ":#{name},Lotus::Model::Mapping::Coercions.#{klass}(record[:#{mapped}])"}.join(',') }]
70
72
  )
71
73
  end
@@ -77,4 +79,3 @@ module Lotus
77
79
  end
78
80
  end
79
81
  end
80
-
@@ -35,25 +35,6 @@ module Lotus
35
35
  # @see Lotus::Repository
36
36
  REPOSITORY_SUFFIX = 'Repository'.freeze
37
37
 
38
- # Defines top level constant for attribute usage.
39
- #
40
- # @since 0.1.0
41
- #
42
- # @see Lotus::Model::Mapping::Collection#attribute
43
- #
44
- # @example
45
- # require 'lotus/model'
46
- #
47
- # mapper = Lotus::Model::Mapper.new do
48
- # collection :articles do
49
- # entity Article
50
- #
51
- # attribute :published, Boolean
52
- # end
53
- # end
54
- class ::Boolean
55
- end
56
-
57
38
  # @attr_reader name [Symbol] the name of the collection
58
39
  #
59
40
  # @since 0.1.0
@@ -3,6 +3,6 @@ module Lotus
3
3
  # Defines the version
4
4
  #
5
5
  # @since 0.1.0
6
- VERSION = '0.2.4'.freeze
6
+ VERSION = '0.3.0'.freeze
7
7
  end
8
8
  end
data/lotus-model.gemspec CHANGED
@@ -19,7 +19,7 @@ Gem::Specification.new do |spec|
19
19
  spec.require_paths = ['lib']
20
20
  spec.required_ruby_version = '>= 2.0.0'
21
21
 
22
- spec.add_runtime_dependency 'lotus-utils', '~> 0.3', '>= 0.3.2'
22
+ spec.add_runtime_dependency 'lotus-utils', '~> 0.4'
23
23
  spec.add_runtime_dependency 'sequel', '~> 4.9'
24
24
 
25
25
  spec.add_development_dependency 'bundler', '~> 1.6'
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: lotus-model
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.4
4
+ version: 0.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Luca Guidi
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2015-02-20 00:00:00.000000000 Z
12
+ date: 2015-03-23 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: lotus-utils
@@ -17,20 +17,14 @@ dependencies:
17
17
  requirements:
18
18
  - - "~>"
19
19
  - !ruby/object:Gem::Version
20
- version: '0.3'
21
- - - ">="
22
- - !ruby/object:Gem::Version
23
- version: 0.3.2
20
+ version: '0.4'
24
21
  type: :runtime
25
22
  prerelease: false
26
23
  version_requirements: !ruby/object:Gem::Requirement
27
24
  requirements:
28
25
  - - "~>"
29
26
  - !ruby/object:Gem::Version
30
- version: '0.3'
31
- - - ">="
32
- - !ruby/object:Gem::Version
33
- version: 0.3.2
27
+ version: '0.4'
34
28
  - !ruby/object:Gem::Dependency
35
29
  name: sequel
36
30
  requirement: !ruby/object:Gem::Requirement
@@ -113,6 +107,10 @@ files:
113
107
  - lib/lotus/model/adapters/null_adapter.rb
114
108
  - lib/lotus/model/adapters/sql/collection.rb
115
109
  - lib/lotus/model/adapters/sql/command.rb
110
+ - lib/lotus/model/adapters/sql/console.rb
111
+ - lib/lotus/model/adapters/sql/consoles/mysql.rb
112
+ - lib/lotus/model/adapters/sql/consoles/postgresql.rb
113
+ - lib/lotus/model/adapters/sql/consoles/sqlite.rb
116
114
  - lib/lotus/model/adapters/sql/query.rb
117
115
  - lib/lotus/model/adapters/sql_adapter.rb
118
116
  - lib/lotus/model/config/adapter.rb