sneaql 0.0.8-java
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 +7 -0
- data/bin/sneaql +273 -0
- data/lib/sneaql.rb +284 -0
- data/lib/sneaql_lib/base.rb +224 -0
- data/lib/sneaql_lib/core.rb +346 -0
- data/lib/sneaql_lib/database_manager.rb +79 -0
- data/lib/sneaql_lib/database_prefs/redshift.rb +22 -0
- data/lib/sneaql_lib/database_prefs/sqlite.rb +12 -0
- data/lib/sneaql_lib/database_prefs/vertica.rb +21 -0
- data/lib/sneaql_lib/exceptions.rb +78 -0
- data/lib/sneaql_lib/expressions.rb +238 -0
- data/lib/sneaql_lib/lock_manager.rb +176 -0
- data/lib/sneaql_lib/parser.rb +89 -0
- data/lib/sneaql_lib/recordset.rb +97 -0
- data/lib/sneaql_lib/repo_manager.rb +95 -0
- data/lib/sneaql_lib/standard.rb +30 -0
- data/lib/sneaql_lib/standard_db_objects.rb +232 -0
- data/lib/sneaql_lib/step_manager.rb +60 -0
- metadata +131 -0
@@ -0,0 +1,95 @@
|
|
1
|
+
require 'git'
|
2
|
+
require 'open-uri'
|
3
|
+
|
4
|
+
require_relative 'base.rb'
|
5
|
+
|
6
|
+
module Sneaql
|
7
|
+
# Classes to manage repositories full of SneaQL code.
|
8
|
+
module RepoManagers
|
9
|
+
|
10
|
+
# tells you the repo type based upon the url
|
11
|
+
# either git or http
|
12
|
+
# @param [String] repo_url
|
13
|
+
def self.repo_type_from_url(repo_url)
|
14
|
+
return 'git' if repo_url.match(/\.*git.*/i)
|
15
|
+
return 'http' if repo_url.match(/\.*http.*/i)
|
16
|
+
end
|
17
|
+
|
18
|
+
|
19
|
+
# pulls a branch from a remote git repo
|
20
|
+
class GitRepoManager < Sneaql::Core::RepoDownloadManager
|
21
|
+
Sneaql::Core::RegisterMappedClass.new(
|
22
|
+
:repo_manager,
|
23
|
+
'git',
|
24
|
+
Sneaql::RepoManagers::GitRepoManager
|
25
|
+
)
|
26
|
+
|
27
|
+
# Pulls down the repo and checks out the branch.
|
28
|
+
def manage_repo
|
29
|
+
drop_and_rebuild_directory(@repo_base_dir)
|
30
|
+
clone_repo(@params[:repo_url])
|
31
|
+
checkout_branch(@params[:git_branch])
|
32
|
+
end
|
33
|
+
|
34
|
+
# Clones a git repo to the local file system.
|
35
|
+
# @param [String] repo_uri
|
36
|
+
def clone_repo(repo_uri)
|
37
|
+
Dir.chdir(@repo_base_dir) do
|
38
|
+
@logger.info("cloning git repo #{repo_uri}")
|
39
|
+
@local_repo = Git.clone(repo_uri, @repo_base_dir)
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
# Checks out specified branch/commit from local repo.
|
44
|
+
# @param [String] branch
|
45
|
+
def checkout_branch(branch)
|
46
|
+
Dir.chdir(@repo_base_dir) do
|
47
|
+
@logger.info("checking out branch #{branch}")
|
48
|
+
@local_repo.checkout(branch.to_s)
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
# pulls single archive file from http/https source
|
54
|
+
class HttpStoreRepoManager < Sneaql::Core::RepoDownloadManager
|
55
|
+
Sneaql::Core::RegisterMappedClass.new(
|
56
|
+
:repo_manager,
|
57
|
+
'http',
|
58
|
+
Sneaql::RepoManagers::HttpStoreRepoManager
|
59
|
+
)
|
60
|
+
|
61
|
+
# Pulls a zip file from an HTTP store down to local file system
|
62
|
+
# then unzips it for use in transform.
|
63
|
+
def manage_repo
|
64
|
+
drop_and_rebuild_directory(@repo_base_dir)
|
65
|
+
pull_transform_repo_from_http_store(@params[:repo_url])
|
66
|
+
if @params[:compression] == 'zip'
|
67
|
+
unzip_file("#{@repo_base_dir}/#{File.basename(@params[:repo_url])}", @repo_base_dir)
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
# Pulls the transfrom to local file system.
|
72
|
+
# @param [String] repo_url
|
73
|
+
def pull_transform_repo_from_http_store(repo_url)
|
74
|
+
@logger.info "repo #{repo_url} to #{@repo_base_dir}/#{File.basename(repo_url)}"
|
75
|
+
File.write("#{@repo_base_dir}/#{File.basename(repo_url)}", open(repo_url).read)
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
79
|
+
# refers to repo in local file system
|
80
|
+
class LocalFileSystemRepoManager < Sneaql::Core::RepoDownloadManager
|
81
|
+
Sneaql::Core::RegisterMappedClass.new(
|
82
|
+
:repo_manager,
|
83
|
+
'local',
|
84
|
+
Sneaql::RepoManagers::LocalFileSystemRepoManager
|
85
|
+
)
|
86
|
+
|
87
|
+
# Repo is simply a local file system reference.
|
88
|
+
def manage_repo
|
89
|
+
# overrides the value created by the
|
90
|
+
# constructor with the directory provided
|
91
|
+
@repo_base_dir = @params[:repo_base_dir]
|
92
|
+
end
|
93
|
+
end
|
94
|
+
end
|
95
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
module Sneaql
|
2
|
+
# Classes to manage DB objects for standard SneaQL deployment.
|
3
|
+
module Standard
|
4
|
+
# Manages execution of a standard transform
|
5
|
+
class StandardTransform
|
6
|
+
|
7
|
+
attr_accessor {
|
8
|
+
:jdbc_url,
|
9
|
+
:db_user,
|
10
|
+
:db_pass
|
11
|
+
}
|
12
|
+
|
13
|
+
def initialize()
|
14
|
+
# set parameters
|
15
|
+
|
16
|
+
# determine database type
|
17
|
+
|
18
|
+
end
|
19
|
+
|
20
|
+
def execute_all_transforms()
|
21
|
+
|
22
|
+
end
|
23
|
+
|
24
|
+
def execute_single_transform(transform_name)
|
25
|
+
|
26
|
+
end
|
27
|
+
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,232 @@
|
|
1
|
+
module Sneaql
|
2
|
+
# Classes to manage DB objects for standard SneaQL deployment.
|
3
|
+
module Standard
|
4
|
+
# Facilitate creation/recreation of database table objects
|
5
|
+
# for standard SneaQL deployment.
|
6
|
+
class DBObjectCreator
|
7
|
+
attr_accessor :jdbc_connection
|
8
|
+
|
9
|
+
# @param [Object] jdbc_connection
|
10
|
+
# @param [Sneaql::Core::DatabaseManager] database_manager
|
11
|
+
# @param [Logger] logger
|
12
|
+
def initialize(jdbc_connection, database_manager, logger = nil)
|
13
|
+
@logger = logger ? logger : Logger.new(STDOUT)
|
14
|
+
@jdbc_connection = jdbc_connection
|
15
|
+
@database_manager = database_manager
|
16
|
+
end
|
17
|
+
|
18
|
+
# Drops and recreates the primary transform table.
|
19
|
+
# @param [String] transform_table_name fully qualified name for this table
|
20
|
+
# @return [Boolean]
|
21
|
+
def recreate_transforms_table(transform_table_name)
|
22
|
+
JDBCHelpers::Execute.new(
|
23
|
+
@jdbc_connection,
|
24
|
+
"drop table if exists #{ transform_table_name };",
|
25
|
+
@logger
|
26
|
+
)
|
27
|
+
create_transforms_table(transform_table_name)
|
28
|
+
return true
|
29
|
+
end
|
30
|
+
|
31
|
+
# Creates the primary transform table.
|
32
|
+
# @param [String] transform_table_name fully qualified name for this table
|
33
|
+
# @return [Boolean]
|
34
|
+
def create_transforms_table(transform_table_name)
|
35
|
+
JDBCHelpers::Execute.new(
|
36
|
+
@jdbc_connection,
|
37
|
+
transforms_table_create_statement(transform_table_name),
|
38
|
+
@logger
|
39
|
+
)
|
40
|
+
return true
|
41
|
+
end
|
42
|
+
|
43
|
+
# Coerces a boolean to the appropriate value for the database type.
|
44
|
+
# May return a 0 or 1 in RDBMS where boolean is not supported.
|
45
|
+
# @param [Boolean] boolean_value
|
46
|
+
# @return [Boolean, Fixnum]
|
47
|
+
def coerce_boolean(boolean_value)
|
48
|
+
if @database_manager.has_boolean
|
49
|
+
boolean_value
|
50
|
+
else
|
51
|
+
boolean_value == true ? 1 : 0
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
# Create table statement for primary transform table.
|
56
|
+
# @param [String] transform_table_name fully qualified name for this table
|
57
|
+
# @return [String]
|
58
|
+
def transforms_table_create_statement(transform_table_name)
|
59
|
+
%{create table if not exists #{ transform_table_name }
|
60
|
+
(
|
61
|
+
transform_name varchar(255) not null
|
62
|
+
,sql_repository varchar(255)
|
63
|
+
,sql_repository_branch varchar(255)
|
64
|
+
,is_active #{ if @database_manager.has_boolean then 'boolean' else 'smallint' end }
|
65
|
+
,notify_on_success #{ if @database_manager.has_boolean then 'boolean' else 'smallint' end }
|
66
|
+
,notify_on_non_precondition_failure #{ if @database_manager.has_boolean then 'boolean' else 'smallint' end }
|
67
|
+
,notify_on_precondition_failure #{ if @database_manager.has_boolean then 'boolean' else 'smallint' end }
|
68
|
+
,updated_ts timestamp
|
69
|
+
);}
|
70
|
+
end
|
71
|
+
|
72
|
+
# Creates a record in the transforms table.
|
73
|
+
# @param [String] transform_table_name
|
74
|
+
# @param [Hash] params Hash of parameters with symbols matching column names
|
75
|
+
def create_transform(transform_table_name, params)
|
76
|
+
JDBCHelpers::Execute.new(
|
77
|
+
@jdbc_connection,
|
78
|
+
create_transform_statement(transform_table_name, params),
|
79
|
+
@logger
|
80
|
+
)
|
81
|
+
end
|
82
|
+
|
83
|
+
# @param [String] transform_table_name
|
84
|
+
# @param [Hash] params Hash of parameters with symbols matching column names
|
85
|
+
def create_transform_statement(transform_table_name, params)
|
86
|
+
%{insert into #{transform_table_name}
|
87
|
+
(
|
88
|
+
transform_name
|
89
|
+
,sql_repository
|
90
|
+
,sql_repository_branch
|
91
|
+
,is_active
|
92
|
+
,notify_on_success
|
93
|
+
,notify_on_non_precondition_failure
|
94
|
+
,notify_on_precondition_failure
|
95
|
+
,updated_ts
|
96
|
+
)
|
97
|
+
values
|
98
|
+
(
|
99
|
+
'#{params[:transform_name]}'
|
100
|
+
,'#{params[:sql_repository]}'
|
101
|
+
,'#{params[:sql_repository_branch]}'
|
102
|
+
,#{coerce_boolean(params[:is_active])}
|
103
|
+
,#{coerce_boolean(params[:notify_on_success])}
|
104
|
+
,#{coerce_boolean(params[:notify_on_non_precondition_failure])}
|
105
|
+
,#{coerce_boolean(params[:notify_on_precondition_failure])}
|
106
|
+
,current_timestamp
|
107
|
+
);}
|
108
|
+
end
|
109
|
+
|
110
|
+
# Drops and recreates the transform steps table.
|
111
|
+
# @param [String] transform_steps_table_name fully qualified name for this table
|
112
|
+
# @return [Boolean]
|
113
|
+
def recreate_transform_steps_table(transform_steps_table_name)
|
114
|
+
JDBCHelpers::Execute.new(
|
115
|
+
@jdbc_connection,
|
116
|
+
"drop table if exists #{ transform_steps_table_name };",
|
117
|
+
@logger
|
118
|
+
)
|
119
|
+
create_transform_steps_table(transform_steps_table_name)
|
120
|
+
return true
|
121
|
+
end
|
122
|
+
|
123
|
+
# Creates the transform steps table.
|
124
|
+
# @param [String] transform_steps_table_name fully qualified name for this table
|
125
|
+
# @return [Boolean]
|
126
|
+
def create_transform_steps_table(transform_steps_table_name)
|
127
|
+
JDBCHelpers::Execute.new(
|
128
|
+
@jdbc_connection,
|
129
|
+
transform_steps_table_create_statement(transform_steps_table_name),
|
130
|
+
@logger
|
131
|
+
)
|
132
|
+
return true
|
133
|
+
end
|
134
|
+
|
135
|
+
# Create table statement for transform steps table.
|
136
|
+
# @param [String] transform_steps_table_name fully qualified name for this table
|
137
|
+
# @return [String]
|
138
|
+
def transform_steps_table_create_statement(transform_steps_table_name)
|
139
|
+
%{create table if not exists #{ transform_steps_table_name }
|
140
|
+
(
|
141
|
+
transform_name varchar(255) not null
|
142
|
+
,transform_step integer not null
|
143
|
+
,sql_file_path_in_repo varchar(1024)
|
144
|
+
,is_active #{ if @database_manager.has_boolean then 'boolean' else 'smallint' end }
|
145
|
+
,is_precondition #{ if @database_manager.has_boolean then 'boolean' else 'smallint' end }
|
146
|
+
,updated_ts timestamp
|
147
|
+
);}
|
148
|
+
end
|
149
|
+
|
150
|
+
# Drops and recreates the transform lock table.
|
151
|
+
# @param [String] transform_lock_table_name fully qualified name for this table
|
152
|
+
# @return [Boolean]
|
153
|
+
def recreate_transform_lock_table(transform_lock_table_name)
|
154
|
+
JDBCHelpers::Execute.new(
|
155
|
+
@jdbc_connection,
|
156
|
+
"drop table if exists #{ transform_lock_table_name };",
|
157
|
+
@logger
|
158
|
+
)
|
159
|
+
create_transform_lock_table(transform_lock_table_name)
|
160
|
+
return true
|
161
|
+
end
|
162
|
+
|
163
|
+
# Creates the transform lock table.
|
164
|
+
# @param [String] transform_lock_table_name fully qualified name for this table
|
165
|
+
# @return [Boolean]
|
166
|
+
def create_transform_lock_table(transform_lock_table_name)
|
167
|
+
JDBCHelpers::Execute.new(
|
168
|
+
@jdbc_connection,
|
169
|
+
transform_lock_table_create_statement(transform_lock_table_name),
|
170
|
+
@logger
|
171
|
+
)
|
172
|
+
return true
|
173
|
+
end
|
174
|
+
|
175
|
+
# Create table statement for transform lock table.
|
176
|
+
# @param [String] transform_lock_table_name fully qualified name for this table
|
177
|
+
# @return [String]
|
178
|
+
def transform_lock_table_create_statement(transform_lock_table_name)
|
179
|
+
%{create table if not exists #{ transform_lock_table_name }
|
180
|
+
(
|
181
|
+
transform_lock_id bigint
|
182
|
+
,transform_name varchar(255)
|
183
|
+
,transform_lock_time timestamp
|
184
|
+
);}
|
185
|
+
end
|
186
|
+
|
187
|
+
# Drops and recreates the transform log table.
|
188
|
+
# @param [String] transform_log_table_name fully qualified name for this table
|
189
|
+
# @return [Boolean]
|
190
|
+
def recreate_transform_log_table(transform_log_table_name)
|
191
|
+
JDBCHelpers::Execute.new(
|
192
|
+
@jdbc_connection,
|
193
|
+
"drop table if exists #{ transform_log_table_name };",
|
194
|
+
@logger
|
195
|
+
)
|
196
|
+
create_transform_log_table(transform_log_table_name)
|
197
|
+
return true
|
198
|
+
end
|
199
|
+
|
200
|
+
# Creates the transform log table.
|
201
|
+
# @param [String] transform_log_table_name fully qualified name for this table
|
202
|
+
# @return [Boolean]
|
203
|
+
def create_transform_log_table(transform_log_table_name)
|
204
|
+
JDBCHelpers::Execute.new(
|
205
|
+
@jdbc_connection,
|
206
|
+
transform_log_table_create_statement(transform_log_table_name),
|
207
|
+
@logger
|
208
|
+
)
|
209
|
+
return true
|
210
|
+
end
|
211
|
+
|
212
|
+
# Create table statement for transform log table.
|
213
|
+
# @param [String] transform_log_table_name fully qualified name for this table
|
214
|
+
# @return [String]
|
215
|
+
def transform_log_table_create_statement(transform_log_table_name)
|
216
|
+
%{create table if not exists #{ transform_log_table_name }
|
217
|
+
(
|
218
|
+
transform_run_id bigint
|
219
|
+
,transform_lock_id bigint
|
220
|
+
,transform_name varchar(255)
|
221
|
+
,transform_step integer
|
222
|
+
,transform_statement integer
|
223
|
+
,all_steps_complete #{ if @database_manager.has_boolean then 'boolean' else 'smallint' end }
|
224
|
+
,failed_in_precondition #{ if @database_manager.has_boolean then 'boolean' else 'smallint' end }
|
225
|
+
,message varchar(65000)
|
226
|
+
,transform_start_time timestamp
|
227
|
+
,transform_end_time timestamp
|
228
|
+
);}
|
229
|
+
end
|
230
|
+
end
|
231
|
+
end
|
232
|
+
end
|
@@ -0,0 +1,60 @@
|
|
1
|
+
require 'json'
|
2
|
+
|
3
|
+
module Sneaql
|
4
|
+
# Managers for transform steps
|
5
|
+
module StepManagers
|
6
|
+
# source step metadata from a json file
|
7
|
+
class JSONFileStepManager < Sneaql::Core::StepMetadataManager
|
8
|
+
Sneaql::Core::RegisterMappedClass.new(
|
9
|
+
:step_metadata_manager,
|
10
|
+
'local_file',
|
11
|
+
Sneaql::StepManagers::JSONFileStepManager
|
12
|
+
)
|
13
|
+
|
14
|
+
# Manages steps from a local JSON file.
|
15
|
+
def manage_steps
|
16
|
+
@steps = JSON.parse(File.read(@params[:step_metadata_file_path])).sort_by! { |h| h['step_number'] }
|
17
|
+
@steps.map! { |j| { step_number: j['step_number'], step_file: j['step_file'] } }
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
# source step metadata from a standardized table in the target database
|
22
|
+
class TransformStepTableManager < Sneaql::Core::StepMetadataManager
|
23
|
+
Sneaql::Core::RegisterMappedClass.new(
|
24
|
+
:step_metadata_manager,
|
25
|
+
'transform_steps_table',
|
26
|
+
Sneaql::StepManagers::TransformStepTableManager
|
27
|
+
)
|
28
|
+
|
29
|
+
# Manages steps based in a standardized table.
|
30
|
+
def manage_steps
|
31
|
+
jdbc_connection = JDBCHelpers::ConnectionFactory.new(
|
32
|
+
@params[:jdbc_url],
|
33
|
+
@params[:db_user],
|
34
|
+
@params[:db_pass]
|
35
|
+
).connection
|
36
|
+
|
37
|
+
@steps = JDBCHelpers::QueryResultsToArray.new(
|
38
|
+
jdbc_connection,
|
39
|
+
%(select
|
40
|
+
transform_step
|
41
|
+
,sql_file_path_in_repo
|
42
|
+
from
|
43
|
+
#{@params[:transform_steps_table]}
|
44
|
+
where
|
45
|
+
transform_name='#{@params[:transform_name]}'
|
46
|
+
and
|
47
|
+
is_active=#{ if @params[:database_manager].has_boolean then 'true' else 1 end }
|
48
|
+
order by
|
49
|
+
transform_step asc;)
|
50
|
+
).results
|
51
|
+
|
52
|
+
@steps.map! do |s|
|
53
|
+
{ step_number: s['transform_step'], step_file: s['sql_file_path_in_repo'] }
|
54
|
+
end
|
55
|
+
|
56
|
+
jdbc_connection.close
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
metadata
ADDED
@@ -0,0 +1,131 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: sneaql
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.8
|
5
|
+
platform: java
|
6
|
+
authors:
|
7
|
+
- jeremy winters
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2017-03-21 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
requirement: !ruby/object:Gem::Requirement
|
15
|
+
requirements:
|
16
|
+
- - "~>"
|
17
|
+
- !ruby/object:Gem::Version
|
18
|
+
version: '1.2'
|
19
|
+
name: logger
|
20
|
+
prerelease: false
|
21
|
+
type: :runtime
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '1.2'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
requirement: !ruby/object:Gem::Requirement
|
29
|
+
requirements:
|
30
|
+
- - "~>"
|
31
|
+
- !ruby/object:Gem::Version
|
32
|
+
version: '5.9'
|
33
|
+
name: minitest
|
34
|
+
prerelease: false
|
35
|
+
type: :development
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '5.9'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
requirement: !ruby/object:Gem::Requirement
|
43
|
+
requirements:
|
44
|
+
- - "~>"
|
45
|
+
- !ruby/object:Gem::Version
|
46
|
+
version: '1.3'
|
47
|
+
name: git
|
48
|
+
prerelease: false
|
49
|
+
type: :runtime
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - "~>"
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '1.3'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
requirement: !ruby/object:Gem::Requirement
|
57
|
+
requirements:
|
58
|
+
- - '='
|
59
|
+
- !ruby/object:Gem::Version
|
60
|
+
version: 0.0.4
|
61
|
+
name: jdbc_helpers
|
62
|
+
prerelease: false
|
63
|
+
type: :runtime
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - '='
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: 0.0.4
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
requirement: !ruby/object:Gem::Requirement
|
71
|
+
requirements:
|
72
|
+
- - ">="
|
73
|
+
- !ruby/object:Gem::Version
|
74
|
+
version: '0.9'
|
75
|
+
name: zip
|
76
|
+
prerelease: false
|
77
|
+
type: :runtime
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - ">="
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '0.9'
|
83
|
+
description: provides the base classes required to run and extend sneaql
|
84
|
+
email: jeremy.winters@full360.com
|
85
|
+
executables:
|
86
|
+
- sneaql
|
87
|
+
extensions: []
|
88
|
+
extra_rdoc_files: []
|
89
|
+
files:
|
90
|
+
- bin/sneaql
|
91
|
+
- lib/sneaql.rb
|
92
|
+
- lib/sneaql_lib/base.rb
|
93
|
+
- lib/sneaql_lib/core.rb
|
94
|
+
- lib/sneaql_lib/database_manager.rb
|
95
|
+
- lib/sneaql_lib/database_prefs/redshift.rb
|
96
|
+
- lib/sneaql_lib/database_prefs/sqlite.rb
|
97
|
+
- lib/sneaql_lib/database_prefs/vertica.rb
|
98
|
+
- lib/sneaql_lib/exceptions.rb
|
99
|
+
- lib/sneaql_lib/expressions.rb
|
100
|
+
- lib/sneaql_lib/lock_manager.rb
|
101
|
+
- lib/sneaql_lib/parser.rb
|
102
|
+
- lib/sneaql_lib/recordset.rb
|
103
|
+
- lib/sneaql_lib/repo_manager.rb
|
104
|
+
- lib/sneaql_lib/standard.rb
|
105
|
+
- lib/sneaql_lib/standard_db_objects.rb
|
106
|
+
- lib/sneaql_lib/step_manager.rb
|
107
|
+
homepage: https://www.full360.com
|
108
|
+
licenses:
|
109
|
+
- MIT
|
110
|
+
metadata: {}
|
111
|
+
post_install_message:
|
112
|
+
rdoc_options: []
|
113
|
+
require_paths:
|
114
|
+
- lib
|
115
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
116
|
+
requirements:
|
117
|
+
- - ">="
|
118
|
+
- !ruby/object:Gem::Version
|
119
|
+
version: '2.0'
|
120
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
121
|
+
requirements:
|
122
|
+
- - ">="
|
123
|
+
- !ruby/object:Gem::Version
|
124
|
+
version: '0'
|
125
|
+
requirements: []
|
126
|
+
rubyforge_project:
|
127
|
+
rubygems_version: 2.6.6
|
128
|
+
signing_key:
|
129
|
+
specification_version: 4
|
130
|
+
summary: sneaql language core
|
131
|
+
test_files: []
|