sequel-mysql_generated_columns 0.1.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 ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: cebd0e3d382ad56563cc96ab8f07ce0f4936455c
4
+ data.tar.gz: fa6d22d714976ed109e45a474936427141f6d06e
5
+ SHA512:
6
+ metadata.gz: 00a490e3c86c400f023612c92e54b4927ade888017d7be3c5773d719405ec6424d9b33b6040901475f7acd723e49bae4af1c96ae8ca9b6cc615ca91eae8b0d43
7
+ data.tar.gz: a8ce7cf5f97015e61f92d6bf2b581c60eaee234a24b70b08d47677ca3c71f64d47d240b6cdb5bcd06ed775e6f221b1f9524a886f1aff0707296425cfd49b16f4
data/.gitignore ADDED
@@ -0,0 +1,11 @@
1
+ /.bundle/
2
+ /.yardoc
3
+ /Gemfile.lock
4
+ /_yardoc/
5
+ /coverage/
6
+ /doc/
7
+ /pkg/
8
+ /spec/reports/
9
+ /tmp/
10
+ *.swp
11
+ *.swo
data/.travis.yml ADDED
@@ -0,0 +1,5 @@
1
+ sudo: false
2
+ language: ruby
3
+ rvm:
4
+ - 2.3.0
5
+ before_install: gem install bundler -v 1.12.5
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in sequel-mysql_generated_columns.gemspec
4
+ gemspec
data/README.md ADDED
@@ -0,0 +1,128 @@
1
+ # sequel-mysql_generated_columns [![Build Status](https://travis-ci.org/munshkr/sequel-mysql_generated_columns.svg?branch=master)](https://travis-ci.org/munshkr/sequel-mysql_generated_columns)
2
+
3
+ Sequel extension that adds support for MySQL generated columns (added first on
4
+ MySQL 5.7.5).
5
+
6
+ When enabled, use `#generated_column` method on `DB#create_table` blocks, and
7
+ `#add_generated_column` method on `DB#alter_table` blocks.
8
+
9
+ ## Example
10
+
11
+ ```ruby
12
+ create_table(:triangles) do
13
+ Integer :a
14
+ Integer :b
15
+ generated_column :c, Integer, :sqrt.sql_function(:a*:a + :b*:b)
16
+ end
17
+ ```
18
+
19
+ ```sql
20
+ CREATE TABLE `triangles` (
21
+ `a` integer,
22
+ `b` integer,
23
+ `c` integer AS (sqrt(((`a` * `a`) + (`b` * `b`))))
24
+ )
25
+ ```
26
+
27
+ ```ruby
28
+ create_table(:docs) do
29
+ json :doc
30
+ end
31
+
32
+ alter_table(:docs) do
33
+ add_generated_column :id, Integer, :json_extract.sql_function(:doc, '$.id'), primary_key: true, stored: true
34
+ end
35
+ ```
36
+
37
+ ```sql
38
+ CREATE TABLE `documents` (`doc` json)
39
+ ALTER TABLE `documents` ADD COLUMN `id` integer AS (json_extract(`doc`, '$.id')) STORED PRIMARY KEY
40
+ ```
41
+
42
+
43
+ ## Installation
44
+
45
+ Add this line to your application's Gemfile:
46
+
47
+ ```ruby
48
+ gem 'sequel-mysql_generated_columns'
49
+ ```
50
+
51
+ And then execute:
52
+
53
+ $ bundle
54
+
55
+ Or install it yourself as:
56
+
57
+ $ gem install sequel-mysql_generated_columns
58
+
59
+
60
+ ## Usage
61
+
62
+ To enable extension, call `DB.extension :mysql_generated_columns`.
63
+
64
+ Use `#generated_column(name, type, expression, opts)` or
65
+ `#add_generated_column(name, type, expression, opts)` on `create_table` and
66
+ `alter_table` blocks respectively.
67
+
68
+ Possible options:
69
+
70
+ * `:stored`: Whether generated column will be STORED or VIRTUAL. By default it
71
+ omits the STORED keyword, so this means generated column will be a virtual
72
+ column.
73
+
74
+ * `:unique`: Whether to add a unique constraint or not. By default it omits the
75
+ UNIQUE KEY keyword.
76
+
77
+ * `:null`: Allow null values or not. By default it omits keyword, meaning it
78
+ falls back to database default.
79
+
80
+ * `:primary_key`: If column has a primary key or not. By default it omits the
81
+ keyword PRIMARY KEY.
82
+
83
+ * `:index`: Whether to create an index after adding column or not. Same
84
+ arguments as `:index` option in conventional `#add_column`.
85
+
86
+
87
+ ## Development
88
+
89
+ After checking out the repo, install `bundler` with `gem install bundler`, and
90
+ run `bundle install` to install dependencies. Then, run `rake test` to run the
91
+ tests.
92
+
93
+ To install this gem onto your local machine, run `bundle exec rake install`. To
94
+ release a new version, update the version number in `version.rb`, and then run
95
+ `bundle exec rake release`, which will create a git tag for the version, push
96
+ git commits and tags, and push the `.gem` file to
97
+ [rubygems.org](https://rubygems.org).
98
+
99
+
100
+ ## Contributing
101
+
102
+ Bug reports and pull requests are welcome on GitHub at
103
+ https://github.com/munshkr/sequel-mysql_generated_columns.
104
+
105
+
106
+ ## License
107
+
108
+ MIT License
109
+
110
+ Copyright (c) 2016 Damián Silvani
111
+
112
+ Permission is hereby granted, free of charge, to any person obtaining a copy
113
+ of this software and associated documentation files (the "Software"), to deal
114
+ in the Software without restriction, including without limitation the rights
115
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
116
+ copies of the Software, and to permit persons to whom the Software is
117
+ furnished to do so, subject to the following conditions:
118
+
119
+ The above copyright notice and this permission notice shall be included in all
120
+ copies or substantial portions of the Software.
121
+
122
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
123
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
124
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
125
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
126
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
127
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
128
+ SOFTWARE.
data/Rakefile ADDED
@@ -0,0 +1,10 @@
1
+ require "bundler/gem_tasks"
2
+ require "rake/testtask"
3
+
4
+ Rake::TestTask.new(:spec) do |t|
5
+ t.libs << "spec"
6
+ t.libs << "lib"
7
+ t.test_files = FileList['spec/**/*_spec.rb']
8
+ end
9
+
10
+ task :default => :spec
@@ -0,0 +1,98 @@
1
+ module Sequel
2
+ module Mysql
3
+ module GeneratedColumns
4
+ # The order of column modifiers to use when defining a column.
5
+ GENERATED_COLUMN_DEFINITION_ORDER = [:stored, :unique, :null, :primary_key]
6
+ STORED = ' STORED'.freeze
7
+ UNIQUE = ' UNIQUE'.freeze
8
+ NULL = ' NULL'.freeze
9
+ NOT_NULL = ' NOT NULL'.freeze
10
+ PRIMARY_KEY = ' PRIMARY KEY'.freeze
11
+
12
+ # Additional methods for the create_table generator to support constraint validations.
13
+ module CreateTableGeneratorMethods
14
+ def generated_column(name, type, expr, opts={})
15
+ index_opts = opts.delete(:index)
16
+ columns << {:name => name, :type => type, :expr => expr, :gen => true}.merge!(opts)
17
+ if index_opts
18
+ index(name, index_opts.is_a?(Hash) ? index_opts : {})
19
+ end
20
+ end
21
+ end
22
+
23
+ # Additional methods for the alter_table generator to support constraint validations,
24
+ # used to give it a more similar API to the create_table generator.
25
+ module AlterTableGeneratorMethods
26
+ include CreateTableGeneratorMethods
27
+
28
+ # Add a generated column with the given name, type, and opts to the DDL for the table.
29
+ #
30
+ # add_generated_column(:name, String, Sequel.function(:sum, :a, :b)) # ADD COLUMN name varchar(255) AS (SUM(a, b))
31
+ def add_generated_column(name, type, expr, opts={})
32
+ @operations << {:op => :add_column, :name => name, :type => type, :expr => expr, :gen => true}.merge!(opts)
33
+ end
34
+ end
35
+
36
+ # Modify the default create_table generator to include
37
+ # the generated columns methods.
38
+ def create_table_generator(&block)
39
+ super do
40
+ extend CreateTableGeneratorMethods
41
+ @generated_columns = []
42
+ instance_eval(&block) if block
43
+ end
44
+ end
45
+
46
+ # Modify the default alter_table generator to include
47
+ # the generated columns methods.
48
+ def alter_table_generator(&block)
49
+ super do
50
+ extend AlterTableGeneratorMethods
51
+ instance_eval(&block) if block
52
+ end
53
+ end
54
+
55
+ # Modify column definition generator method to support generated columns
56
+ def column_definition_sql(column)
57
+ if column[:gen]
58
+ sql = String.new
59
+ sql << "#{quote_identifier(column[:name])} #{type_literal(column)}"
60
+ sql << " AS (#{literal(column[:expr])})"
61
+ generated_column_definition_order.each{|m| send(:"generated_column_definition_#{m}_sql", sql, column)}
62
+ sql
63
+ else
64
+ super
65
+ end
66
+ end
67
+
68
+ # The order of the generated column definition, as an array of symbols.
69
+ def generated_column_definition_order
70
+ GENERATED_COLUMN_DEFINITION_ORDER
71
+ end
72
+
73
+ # Add stored SQL fragment to column creation SQL.
74
+ def generated_column_definition_stored_sql(sql, column)
75
+ sql << STORED if column[:stored]
76
+ end
77
+
78
+ # Add unique SQL fragment to column creation SQL.
79
+ def generated_column_definition_unique_sql(sql, column)
80
+ sql << UNIQUE if column[:unique]
81
+ end
82
+
83
+ # Add null SQL fragment to column creation SQL.
84
+ def generated_column_definition_null_sql(sql, column)
85
+ null = column.fetch(:null, column[:allow_null])
86
+ sql << NOT_NULL if null == false
87
+ sql << NULL if null == true
88
+ end
89
+
90
+ # Add unique SQL fragment to column creation SQL.
91
+ def generated_column_definition_primary_key_sql(sql, column)
92
+ sql << PRIMARY_KEY if column[:primary_key]
93
+ end
94
+ end
95
+ end
96
+
97
+ Database.register_extension(:mysql_generated_columns, Mysql::GeneratedColumns)
98
+ end
@@ -0,0 +1,24 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+
5
+ Gem::Specification.new do |spec|
6
+ spec.name = "sequel-mysql_generated_columns"
7
+ spec.version = "0.1.0"
8
+ spec.authors = ["Damián Silvani"]
9
+ spec.email = ["munshkr@gmail.com"]
10
+
11
+ spec.summary = %q{Sequel extension that adds support for MySQL generated columns.}
12
+ spec.homepage = "https://github.com/munshkr/sequel-mysql_generated_columns"
13
+
14
+ spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
15
+ spec.bindir = "exe"
16
+ spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
17
+ spec.require_paths = ["lib"]
18
+
19
+ spec.add_development_dependency "bundler", "~> 1.12"
20
+ spec.add_development_dependency "rake", "~> 10.0"
21
+ spec.add_development_dependency "minitest", "~> 5.0"
22
+
23
+ spec.add_dependency "sequel", ">= 4"
24
+ end
metadata ADDED
@@ -0,0 +1,106 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: sequel-mysql_generated_columns
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Damián Silvani
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2016-09-11 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: bundler
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '1.12'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '1.12'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rake
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '10.0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '10.0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: minitest
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '5.0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '5.0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: sequel
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '4'
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '4'
69
+ description:
70
+ email:
71
+ - munshkr@gmail.com
72
+ executables: []
73
+ extensions: []
74
+ extra_rdoc_files: []
75
+ files:
76
+ - ".gitignore"
77
+ - ".travis.yml"
78
+ - Gemfile
79
+ - README.md
80
+ - Rakefile
81
+ - lib/sequel/extensions/mysql_generated_columns.rb
82
+ - sequel-mysql_generated_columns.gemspec
83
+ homepage: https://github.com/munshkr/sequel-mysql_generated_columns
84
+ licenses: []
85
+ metadata: {}
86
+ post_install_message:
87
+ rdoc_options: []
88
+ require_paths:
89
+ - lib
90
+ required_ruby_version: !ruby/object:Gem::Requirement
91
+ requirements:
92
+ - - ">="
93
+ - !ruby/object:Gem::Version
94
+ version: '0'
95
+ required_rubygems_version: !ruby/object:Gem::Requirement
96
+ requirements:
97
+ - - ">="
98
+ - !ruby/object:Gem::Version
99
+ version: '0'
100
+ requirements: []
101
+ rubyforge_project:
102
+ rubygems_version: 2.5.1
103
+ signing_key:
104
+ specification_version: 4
105
+ summary: Sequel extension that adds support for MySQL generated columns.
106
+ test_files: []