spanner-translator 0.3.3 → 0.3.4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile.lock +1 -1
- data/lib/rubocop/ast/send_node.rb +2 -2
- data/lib/spanner/translator/cli.rb +4 -11
- data/lib/spanner/translator/configuration.rb +2 -1
- data/lib/spanner/translator/rules/translation/add_explicit_primary_key.rb +5 -3
- data/lib/spanner/translator/rules/translation/add_index_options.rb +1 -0
- data/lib/spanner/translator/rules/translation/add_timestamps.rb +1 -1
- data/lib/spanner/translator/rules/translation/ensure_primary_key_columns_exist.rb +71 -0
- data/lib/spanner/translator/rules/translation/enum_column_to_string_with_constraint.rb +3 -2
- data/lib/spanner/translator/rules/translation/time_columns_to_time.rb +1 -1
- data/lib/spanner/translator/rules/translation.rb +2 -0
- data/lib/spanner/translator/version.rb +1 -1
- metadata +2 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 5245a782dcce416f03a31c38710e8e5a3acb18a64d0082c44ebb004a1e8121ec
|
4
|
+
data.tar.gz: 264532835fce24060de4579d46cf95a09b777fb05b7d0c9e6f3c16aa02360ce1
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 06645ad45c11413b73284d32b5fed8dc6dbb9ba1f2c2d67b78c29dae3f188dac3bace1220fbe7342990777c2c608f6f8849deabc66ef92146e5187a81594cdf9
|
7
|
+
data.tar.gz: 846b937be1eb9b5e829216567b0070790d99cef0f1c2b1b889364de6c5bc93717970c023a1658002c6c7a3f36f44cb0cee4705b3cb7dcc2a7167eb815e7e3aa7
|
data/Gemfile.lock
CHANGED
@@ -4,7 +4,7 @@ module RuboCop
|
|
4
4
|
module AST
|
5
5
|
# Spanner-specific extensions for RuboCop::AST::SendNode objects
|
6
6
|
class SendNode
|
7
|
-
%i[index column bigint datetime timestamp timestamps].each do |t_method_name|
|
7
|
+
%i[index column bigint integer datetime timestamp timestamps].each do |t_method_name|
|
8
8
|
define_method(:"t_#{t_method_name}?") do
|
9
9
|
sending_t? && method_name == t_method_name
|
10
10
|
end
|
@@ -31,7 +31,7 @@ module RuboCop
|
|
31
31
|
find_hash_option(option_name.to_sym)&.source
|
32
32
|
end
|
33
33
|
|
34
|
-
%i[null name unique limit default].each do |option_name|
|
34
|
+
%i[null name unique limit default primary_key].each do |option_name|
|
35
35
|
define_method(:"#{option_name}_option") do
|
36
36
|
find_hash_option(option_name)
|
37
37
|
end
|
@@ -48,18 +48,11 @@ module Spanner
|
|
48
48
|
private
|
49
49
|
|
50
50
|
# dumb create_table block code formatting
|
51
|
-
def formatted_create_table(code)
|
51
|
+
def formatted_create_table(code)
|
52
52
|
code.lines.map do |l|
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
when /t\.index/
|
57
|
-
" #{l.strip}" unless Spanner::Translator.configuration.skip_indexes
|
58
|
-
when /^\s*$/
|
59
|
-
nil # remove blank lines
|
60
|
-
else
|
61
|
-
" #{l.strip}"
|
62
|
-
end
|
53
|
+
next if /^\s*$/ =~ l
|
54
|
+
|
55
|
+
/(create_table|end)/ =~ l ? l.strip : " #{l.strip}"
|
63
56
|
end.compact.join("\n")
|
64
57
|
end
|
65
58
|
end
|
@@ -4,7 +4,7 @@ module Spanner
|
|
4
4
|
module Translator
|
5
5
|
# Configuration
|
6
6
|
class Configuration
|
7
|
-
attr_accessor :rules, :checks, :db_schema, :skip_indexes
|
7
|
+
attr_accessor :rules, :checks, :db_schema, :skip_indexes, :primary_key_type
|
8
8
|
attr_reader :default_primary_keys
|
9
9
|
|
10
10
|
def initialize
|
@@ -17,6 +17,7 @@ module Spanner
|
|
17
17
|
@db_schema = "db/schema.rb"
|
18
18
|
@default_primary_keys = ["id"]
|
19
19
|
@skip_indexes = false
|
20
|
+
@primary_key_type = :integer
|
20
21
|
end
|
21
22
|
|
22
23
|
# Set primary key column(s), make sure it is an array of symbols
|
@@ -6,8 +6,9 @@ module Spanner
|
|
6
6
|
module Translator
|
7
7
|
module Rules
|
8
8
|
module Translation
|
9
|
-
# Based on the `create_table` statement, add an explicit column
|
10
|
-
#
|
9
|
+
# Based on the `create_table` statement, add an explicit column creation
|
10
|
+
# for the default primary key when the default is "id" and not already
|
11
|
+
# defined.
|
11
12
|
#
|
12
13
|
# Scenarios:
|
13
14
|
# create_table "users" do |t|
|
@@ -25,7 +26,8 @@ module Spanner
|
|
25
26
|
|
26
27
|
primary_key_name = "id"
|
27
28
|
|
28
|
-
@rewriter.insert_before(node.loc.expression,
|
29
|
+
@rewriter.insert_before(node.loc.expression,
|
30
|
+
"t.integer \"#{primary_key_name}\", null: false # generated\n ")
|
29
31
|
@seen["primary_key"] = true
|
30
32
|
end
|
31
33
|
end
|
@@ -14,6 +14,7 @@ module Spanner
|
|
14
14
|
def on_send(node)
|
15
15
|
capture_column_nullity(node)
|
16
16
|
return unless node.t_index?
|
17
|
+
return @rewriter.remove(node.loc.expression) if Spanner::Translator.configuration.skip_indexes
|
17
18
|
|
18
19
|
@rewriter.replace(node.loc.expression, "t.index #{new_arguments_for_column_definition(node)}")
|
19
20
|
end
|
@@ -8,7 +8,7 @@ module Spanner
|
|
8
8
|
# allow_commit_timestamp: true before the first t.index or at the end of
|
9
9
|
# the block if no t.index is found.
|
10
10
|
class AddTimestamps < BaseRule
|
11
|
-
COLUMN_DEF = "t.timestamps"
|
11
|
+
COLUMN_DEF = "t.timestamps # generated"
|
12
12
|
|
13
13
|
def on_send(node)
|
14
14
|
return unless node.t_datetime? && %w[created_at updated_at].include?(node.first_argument.value)
|
@@ -0,0 +1,71 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "json"
|
4
|
+
|
5
|
+
module Spanner
|
6
|
+
module Translator
|
7
|
+
module Rules
|
8
|
+
module Translation
|
9
|
+
# In the create_table block, add t.time :committed_at with
|
10
|
+
# allow_commit_timestamp: true before the first t.index or at the end of
|
11
|
+
# the block if no t.index is found.
|
12
|
+
class EnsurePrimaryKeyColumnsExist < BaseRule
|
13
|
+
ID_COLUMN_TEMPLATE = %(t.%<type>s "%<colname>s", null: false # generated\n )
|
14
|
+
|
15
|
+
def on_block(node)
|
16
|
+
# only pay attention to create_table blocks
|
17
|
+
return unless node.send_node.method_name == :create_table
|
18
|
+
|
19
|
+
# get primary_key hash argument value
|
20
|
+
specified_primary_keys = value_of(node.send_node.primary_key_option.value)
|
21
|
+
return unless specified_primary_keys
|
22
|
+
|
23
|
+
# get primary_key column name[s]
|
24
|
+
undefined_columns = undefined_primary_key_columns node.body.children, specified_primary_keys
|
25
|
+
|
26
|
+
# otherwise, insert at beginning of block
|
27
|
+
undefined_columns.each do |colname|
|
28
|
+
@rewriter.insert_before(node.body.loc.expression, id_column_source(colname))
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
private
|
33
|
+
|
34
|
+
def value_of(node)
|
35
|
+
case node
|
36
|
+
when RuboCop::AST::ArrayNode
|
37
|
+
node.children.map { |c| value_of(c) }
|
38
|
+
when RuboCop::AST::StrNode, RuboCop::AST::SymbolNode
|
39
|
+
node.value.to_s
|
40
|
+
else
|
41
|
+
raise "Unexpected node type in argument slot: #{node.class}"
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
def undefined_primary_key_columns(children, columns)
|
46
|
+
columns = Array(columns)
|
47
|
+
|
48
|
+
children.each do |child|
|
49
|
+
next unless string_argument_haver?(child)
|
50
|
+
|
51
|
+
colname = child.arguments.first.value.to_s
|
52
|
+
columns.delete(colname)
|
53
|
+
end
|
54
|
+
|
55
|
+
columns
|
56
|
+
end
|
57
|
+
|
58
|
+
def string_argument_haver?(child)
|
59
|
+
child.is_a?(RuboCop::AST::SendNode) &&
|
60
|
+
child.sending_t? &&
|
61
|
+
child.arguments.first.is_a?(RuboCop::AST::StrNode)
|
62
|
+
end
|
63
|
+
|
64
|
+
def id_column_source(colname)
|
65
|
+
format(ID_COLUMN_TEMPLATE, colname: colname, type: Spanner::Translator.configuration.primary_key_type)
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
@@ -14,10 +14,11 @@ module Spanner
|
|
14
14
|
|
15
15
|
constraint_name = generate_constraint_name(node)
|
16
16
|
unless_seen(constraint_name) do
|
17
|
-
@rewriter.replace(node.loc.expression,
|
17
|
+
@rewriter.replace(node.loc.expression,
|
18
|
+
"t.string #{new_arguments_for_column_definition(node)} # generated")
|
18
19
|
constraint = %["#{column_name(node)} IN (#{choices_for_enum_string(node)})"]
|
19
20
|
@rewriter.insert_after(node.last_sibling.source_range,
|
20
|
-
"\n t.check_constraint #{constraint}, name: \"#{constraint_name}\"")
|
21
|
+
"\n t.check_constraint #{constraint}, name: \"#{constraint_name}\" # generated")
|
21
22
|
end
|
22
23
|
end
|
23
24
|
|
@@ -13,7 +13,7 @@ module Spanner
|
|
13
13
|
conditionally_propagate_argument new_arguments, node, "null"
|
14
14
|
conditionally_propagate_argument new_arguments, node, "default"
|
15
15
|
|
16
|
-
@rewriter.replace(node.loc.expression, "t.time #{new_arguments.join(", ")}")
|
16
|
+
@rewriter.replace(node.loc.expression, "t.time #{new_arguments.join(", ")} # generated")
|
17
17
|
end
|
18
18
|
end
|
19
19
|
end
|
@@ -16,6 +16,7 @@ module Spanner
|
|
16
16
|
TimeColumnsToTime
|
17
17
|
BigintToInteger
|
18
18
|
ReplaceCreateTableArgs
|
19
|
+
EnsurePrimaryKeyColumnsExist
|
19
20
|
].freeze
|
20
21
|
|
21
22
|
autoload :AddExplicitPrimaryKey, "spanner/translator/rules/translation/add_explicit_primary_key"
|
@@ -26,6 +27,7 @@ module Spanner
|
|
26
27
|
autoload :BigintToInteger, "spanner/translator/rules/translation/bigint_to_integer"
|
27
28
|
autoload :EnumColumnToStringWithConstraint,
|
28
29
|
"spanner/translator/rules/translation/enum_column_to_string_with_constraint"
|
30
|
+
autoload :EnsurePrimaryKeyColumnsExist, "spanner/translator/rules/translation/ensure_primary_key_columns_exist"
|
29
31
|
autoload :ReplaceCreateTableArgs, "spanner/translator/rules/translation/replace_create_table_args"
|
30
32
|
autoload :ReplaceApplicationRecord, "spanner/translator/rules/translation/replace_application_record"
|
31
33
|
autoload :TimeColumnsToTime, "spanner/translator/rules/translation/time_columns_to_time"
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: spanner-translator
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.3.
|
4
|
+
version: 0.3.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Adam Bachman
|
@@ -60,6 +60,7 @@ files:
|
|
60
60
|
- lib/spanner/translator/rules/translation/add_timestamps.rb
|
61
61
|
- lib/spanner/translator/rules/translation/base_rule.rb
|
62
62
|
- lib/spanner/translator/rules/translation/bigint_to_integer.rb
|
63
|
+
- lib/spanner/translator/rules/translation/ensure_primary_key_columns_exist.rb
|
63
64
|
- lib/spanner/translator/rules/translation/enum_column_to_string_with_constraint.rb
|
64
65
|
- lib/spanner/translator/rules/translation/replace_application_record.rb
|
65
66
|
- lib/spanner/translator/rules/translation/replace_create_table_args.rb
|