egis 1.1.1 → 1.5.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
  SHA256:
3
- metadata.gz: d232fad45575196b2a8a2a65ccca79529a2fd72121bf5883a9c3b037a6c40850
4
- data.tar.gz: d269d52126bf32592f3b3425abc76b1664b119684674db5e618d9cbacbc0d3f3
3
+ metadata.gz: 924727f52ac809df7ab4457a6a0c05469cd6c128adaff339018e964dc9ff4ea0
4
+ data.tar.gz: c8ba9d090641c899e832b73b062314bd76fa4fb39041fb175d7e3a717e943856
5
5
  SHA512:
6
- metadata.gz: 37c73df4ff2e1bf1f280816f0a882046a02447932bfdb8c77893b27d2e106f263d22a0d7cd0951861898aef882b2ea9ddca737ef980b9bfc2e342609a2716845
7
- data.tar.gz: 93e325830f6382c683430e7dac987b01dc9bc93890155f0c28f19373742610d8f24195e7c074684f813821f508a956a7ad936c7e4297a0738af52ec285445805
6
+ metadata.gz: fa429f550a68475a75f9dd9c0610b0d41c9a8017f0e46c0f9e467cfaeddfb7d6587d6e7df5b4440bbd75e4d4d9a12d5966f40e4ce72cb8abf70e5dc2897f91d8
7
+ data.tar.gz: 3beac29ce82c267bfc2621e730a8b631f76a94f7426ac7d7901b31d204cda3320d1ab934e9c3e156ee52e5fca315728412ffd5a007bf4623dd2ac077d85399ba
data/egis.gemspec CHANGED
@@ -16,7 +16,7 @@ Gem::Specification.new do |spec|
16
16
 
17
17
  spec.metadata['homepage_uri'] = spec.homepage
18
18
  spec.metadata['source_code_uri'] = spec.homepage
19
- spec.metadata['changelog_uri'] = 'https://github.com/u2i/egis/blob/master/docs/CHANGELOG.md'
19
+ spec.metadata['changelog_uri'] = 'https://u2i.github.io/egis/file.CHANGELOG.html'
20
20
 
21
21
  # Specify which files should be added to the gem when it is released.
22
22
  # The `git ls-files -z` loads the files in the RubyGem that have been added into git.
data/lib/egis.rb CHANGED
@@ -40,13 +40,18 @@ require 'egis/s3_location_parser'
40
40
  # config.aws_profile = 'my-profile'
41
41
  # end
42
42
  #
43
+ # @example Configure logger
44
+ # Egis.configure do |config|
45
+ # config.logger = Logger.new('athena.log', level: :debug)
46
+ # end
47
+ #
43
48
  # @yield [Egis::Configuration]
44
49
  # @return [void]
45
50
  #
46
51
  module Egis
47
52
  class << self
48
- def configure
49
- yield(configuration)
53
+ def configure(&block)
54
+ configuration.configure(&block)
50
55
  end
51
56
 
52
57
  # @!visibility private
@@ -58,5 +63,10 @@ module Egis
58
63
  def mode
59
64
  @mode ||= Egis::StandardMode.new
60
65
  end
66
+
67
+ # @!visibility private
68
+ def logger
69
+ @configuration.logger
70
+ end
61
71
  end
62
72
  end
@@ -6,25 +6,23 @@ require 'aws-sdk-athena'
6
6
  module Egis
7
7
  # @!visibility private
8
8
  class AwsClientProvider
9
- def s3_client
10
- Aws::S3::Client.new(client_config)
9
+ def s3_client(configuration)
10
+ Aws::S3::Client.new(client_config(configuration))
11
11
  end
12
12
 
13
- def athena_client
14
- Aws::Athena::Client.new(client_config)
13
+ def athena_client(configuration)
14
+ Aws::Athena::Client.new(client_config(configuration))
15
15
  end
16
16
 
17
17
  private
18
18
 
19
- def client_config
20
- configuration = Egis.configuration
21
-
22
- config = {}
23
- config[:region] = configuration.aws_region if configuration.aws_region
24
- config[:access_key_id] = configuration.aws_access_key_id if configuration.aws_access_key_id
25
- config[:secret_access_key] = configuration.aws_secret_access_key if configuration.aws_secret_access_key
26
- config[:profile] = configuration.aws_profile if configuration.aws_profile
27
- config
19
+ def client_config(configuration)
20
+ {
21
+ region: configuration.aws_region,
22
+ access_key_id: configuration.aws_access_key_id,
23
+ secret_access_key: configuration.aws_secret_access_key,
24
+ profile: configuration.aws_profile
25
+ }.compact
28
26
  end
29
27
  end
30
28
  end
data/lib/egis/client.rb CHANGED
@@ -4,6 +4,9 @@ module Egis
4
4
  ##
5
5
  # The most fundamental {Egis} class. Provides an interface for executing Athena queries.
6
6
  #
7
+ # @yieldparam config [Egis::Configuration] Egis configuration block, if missing Egis will use global configuration
8
+ # provided by {Egis.configure}
9
+ #
7
10
  # See configuration instructions {Egis.configure}.
8
11
  #
9
12
  # @see Egis.configure
@@ -33,14 +36,17 @@ module Egis
33
36
  'CANCELLED' => Egis::QueryStatus::CANCELLED
34
37
  }.freeze
35
38
 
36
- DEFAULT_QUERY_STATUS_BACKOFF = ->(attempt) { 1.5**attempt - 1 }
39
+ private_constant :QUERY_STATUS_MAPPING
37
40
 
38
- private_constant :QUERY_STATUS_MAPPING, :DEFAULT_QUERY_STATUS_BACKOFF
41
+ attr_reader :aws_s3_client
39
42
 
40
- def initialize(aws_client_provider: Egis::AwsClientProvider.new, s3_location_parser: Egis::S3LocationParser.new)
41
- @aws_athena_client = aws_client_provider.athena_client
43
+ def initialize(aws_client_provider: Egis::AwsClientProvider.new,
44
+ s3_location_parser: Egis::S3LocationParser.new,
45
+ &block)
46
+ @configuration = block_given? ? Egis.configuration.dup.configure(&block) : Egis.configuration
47
+ @aws_athena_client = aws_client_provider.athena_client(configuration)
48
+ @aws_s3_client = aws_client_provider.s3_client(configuration)
42
49
  @s3_location_parser = s3_location_parser
43
- @query_status_backoff = Egis.configuration.query_status_backoff || DEFAULT_QUERY_STATUS_BACKOFF
44
50
  end
45
51
 
46
52
  ##
@@ -65,14 +71,16 @@ module Egis
65
71
  # by workgroup.
66
72
  # @return [Egis::QueryStatus]
67
73
 
68
- def execute_query(query, work_group: nil, database: nil, output_location: nil, async: true)
69
- query_execution_id = aws_athena_client.start_query_execution(
74
+ def execute_query(query, work_group: nil, database: nil, output_location: nil, async: true, system_execution: false)
75
+ query_id = aws_athena_client.start_query_execution(
70
76
  query_execution_params(query, work_group, database, output_location)
71
77
  ).query_execution_id
72
78
 
73
- return query_status(query_execution_id) if Egis.mode.async(async)
79
+ log_query_execution(query, query_id, system_execution)
80
+
81
+ return query_status(query_id) if Egis.mode.async(async)
74
82
 
75
- query_status = wait_for_query_to_finish(query_execution_id)
83
+ query_status = wait_for_query_to_finish(query_id)
76
84
 
77
85
  raise Egis::Errors::QueryExecutionError, query_status.message unless query_status.finished?
78
86
 
@@ -89,21 +97,25 @@ module Egis
89
97
  resp = aws_athena_client.get_query_execution(query_execution_id: query_id)
90
98
 
91
99
  query_execution = resp.query_execution
100
+ query_status = query_execution.status.state
101
+
102
+ Egis.logger.debug { "Checking query status (#{query_id}): #{query_status}" }
92
103
 
93
104
  Egis::QueryStatus.new(
94
105
  query_execution.query_execution_id,
95
- QUERY_STATUS_MAPPING.fetch(query_execution.status.state),
106
+ QUERY_STATUS_MAPPING.fetch(query_status),
96
107
  query_execution.status.state_change_reason,
97
- parse_output_location(query_execution)
108
+ parse_output_location(query_execution),
109
+ client: self
98
110
  )
99
111
  end
100
112
 
101
113
  private
102
114
 
103
- attr_reader :aws_athena_client, :s3_location_parser, :query_status_backoff
115
+ attr_reader :configuration, :aws_athena_client, :s3_location_parser
104
116
 
105
117
  def query_execution_params(query, work_group, database, output_location)
106
- work_group_params = work_group || Egis.configuration.work_group
118
+ work_group_params = work_group || configuration.work_group
107
119
 
108
120
  params = {query_string: query}
109
121
  params[:work_group] = work_group_params if work_group_params
@@ -112,11 +124,20 @@ module Egis
112
124
  params
113
125
  end
114
126
 
115
- def wait_for_query_to_finish(query_execution_id)
127
+ def log_query_execution(query, query_id, system_execution)
128
+ if system_execution
129
+ Egis.logger.debug { "Executing system query (#{query_id}): #{query.gsub(/\s+/, ' ')}" }
130
+ else
131
+ Egis.logger.info { "Executing query (#{query_id}): #{query.gsub(/\s+/, ' ')}" }
132
+ end
133
+ end
134
+
135
+ def wait_for_query_to_finish(query_id)
116
136
  attempt = 1
117
137
  loop do
118
- sleep(query_status_backoff.call(attempt))
119
- status = query_status(query_execution_id)
138
+ sleep(configuration.query_status_backoff.call(attempt))
139
+ status = query_status(query_id)
140
+
120
141
  return status unless status.queued? || status.running?
121
142
 
122
143
  attempt += 1
@@ -4,6 +4,16 @@ module Egis
4
4
  # @!visibility private
5
5
  class Configuration
6
6
  attr_accessor :work_group, :aws_region, :aws_access_key_id, :aws_secret_access_key, :aws_profile,
7
- :query_status_backoff, :testing_s3_bucket
7
+ :query_status_backoff, :testing_s3_bucket, :logger
8
+
9
+ def initialize
10
+ @logger = Logger.new(STDOUT, level: :info)
11
+ @query_status_backoff = ->(attempt) { 1.5**attempt - 1 }
12
+ end
13
+
14
+ def configure
15
+ yield(self)
16
+ self
17
+ end
8
18
  end
9
19
  end
data/lib/egis/database.rb CHANGED
@@ -10,24 +10,30 @@ module Egis
10
10
  #
11
11
  # It is recommended to create database objects using {Egis::Client#database} method.
12
12
  #
13
+ # @!attribute [r] name
14
+ # @return [String] Athena database name
15
+ #
13
16
  class Database
14
- def initialize(database_name, client: Egis::Client.new, output_downloader: Egis::OutputDownloader.new)
17
+ def initialize(name, client: Egis::Client.new, output_downloader: Egis::OutputDownloader.new(client.aws_s3_client))
15
18
  @client = client
16
- @database_name = database_name
17
19
  @output_downloader = output_downloader
20
+ @name = name
18
21
  end
19
22
 
23
+ attr_reader :name
24
+
20
25
  ##
21
26
  # Creates {Egis::Table} object. Executing it doesn't create Athena table yet.
22
27
  #
23
28
  # @param [String] table_name
24
29
  # @param [Egis::TableSchema] table_schema
25
30
  # @param [String] table_location S3 URL with table location (e.g. `s3://s3_bucket/table/location/`)
26
- # @param [:tsv, :csv, :orc] format Table format (defaults to :tsv)
31
+ # @param [:tsv, :csv, :orc, {serde: 'SerdeClass', serde_properties: {property: value}}] format Table format
32
+ # (defaults to :tsv)
27
33
  # @return [Egis::Table]
28
34
 
29
35
  def table(table_name, table_schema, table_location, **options)
30
- Table.new(self, table_name, table_schema, table_location, options: options)
36
+ Table.new(self, table_name, table_schema, table_location, client: client, options: options)
31
37
  end
32
38
 
33
39
  ##
@@ -36,7 +42,10 @@ module Egis
36
42
  # @return [void]
37
43
 
38
44
  def create
39
- client.execute_query("CREATE DATABASE IF NOT EXISTS #{translate_name(database_name)};", async: false)
45
+ log_database_creation
46
+
47
+ client.execute_query("CREATE DATABASE IF NOT EXISTS #{translate_name(name)};", async: false,
48
+ system_execution: true)
40
49
  end
41
50
 
42
51
  ##
@@ -45,7 +54,9 @@ module Egis
45
54
  # @return [void]
46
55
 
47
56
  def create!
48
- client.execute_query("CREATE DATABASE #{translate_name(database_name)};", async: false)
57
+ log_database_creation
58
+
59
+ client.execute_query("CREATE DATABASE #{translate_name(name)};", async: false, system_execution: true)
49
60
  end
50
61
 
51
62
  ##
@@ -54,7 +65,10 @@ module Egis
54
65
  # @return [void]
55
66
 
56
67
  def drop
57
- client.execute_query("DROP DATABASE IF EXISTS #{translate_name(database_name)} CASCADE;", async: false)
68
+ log_database_removal
69
+
70
+ client.execute_query("DROP DATABASE IF EXISTS #{translate_name(name)} CASCADE;", async: false,
71
+ system_execution: true)
58
72
  end
59
73
 
60
74
  ##
@@ -63,14 +77,16 @@ module Egis
63
77
  # @return [void]
64
78
 
65
79
  def drop!
66
- client.execute_query("DROP DATABASE #{translate_name(database_name)} CASCADE;", async: false)
80
+ log_database_removal
81
+
82
+ client.execute_query("DROP DATABASE #{translate_name(name)} CASCADE;", async: false, system_execution: true)
67
83
  end
68
84
 
69
85
  ##
70
86
  # (see Egis::Client#execute_query)
71
87
 
72
88
  def execute_query(query, **options)
73
- client.execute_query(query, **{database: database_name, **options})
89
+ client.execute_query(query, **{database: name, **options})
74
90
  end
75
91
 
76
92
  ##
@@ -86,14 +102,22 @@ module Egis
86
102
  # @return [Boolean]
87
103
 
88
104
  def exists?
89
- query_status = client.execute_query("SHOW DATABASES LIKE '#{database_name}';", async: false)
105
+ query_status = client.execute_query("SHOW DATABASES LIKE '#{name}';", async: false, system_execution: true)
90
106
  parsed_result = output_downloader.download(query_status.output_location)
91
- parsed_result.flatten.include?(database_name)
107
+ parsed_result.flatten.include?(name)
92
108
  end
93
109
 
94
110
  private
95
111
 
96
- attr_reader :client, :database_name, :output_downloader
112
+ attr_reader :client, :output_downloader
113
+
114
+ def log_database_creation
115
+ Egis.logger.info { "Creating database #{name}" }
116
+ end
117
+
118
+ def log_database_removal
119
+ Egis.logger.info { "Removing database #{name}" }
120
+ end
97
121
 
98
122
  def translate_name(name)
99
123
  Egis.mode.database_name(name)
@@ -5,8 +5,8 @@ require 'csv'
5
5
  module Egis
6
6
  # @!visibility private
7
7
  class OutputDownloader
8
- def initialize(aws_client_provider: Egis::AwsClientProvider.new)
9
- @s3_client = aws_client_provider.s3_client
8
+ def initialize(aws_s3_client)
9
+ @s3_client = aws_s3_client
10
10
  end
11
11
 
12
12
  def download(output_location)
@@ -23,7 +23,8 @@ module Egis
23
23
  attr_reader :id, :status, :message, :output_location
24
24
 
25
25
  def initialize(id, status, message, output_location,
26
- output_downloader: Egis::OutputDownloader.new,
26
+ client: Egis::Client.new,
27
+ output_downloader: Egis::OutputDownloader.new(client.aws_s3_client),
27
28
  output_parser: Egis::OutputParser.new)
28
29
  raise ArgumentError, "Unsupported status #{status}" unless STATUSES.include?(status)
29
30
 
@@ -51,6 +52,10 @@ module Egis
51
52
  status == RUNNING
52
53
  end
53
54
 
55
+ def cancelled?
56
+ status == CANCELLED
57
+ end
58
+
54
59
  def in_progress?
55
60
  [RUNNING, QUEUED].include?(status)
56
61
  end
@@ -3,8 +3,8 @@
3
3
  module Egis
4
4
  # @!visibility private
5
5
  class S3Cleaner
6
- def initialize(aws_client_provider: Egis::AwsClientProvider.new)
7
- @s3_client = aws_client_provider.s3_client
6
+ def initialize(aws_s3_client)
7
+ @s3_client = aws_s3_client
8
8
  end
9
9
 
10
10
  def delete(bucket, prefix)
data/lib/egis/table.rb CHANGED
@@ -9,7 +9,7 @@ module Egis
9
9
  # @!attribute [r] database
10
10
  # @return [Egis::Database]
11
11
  # @!attribute [r] name
12
- # @return [String] Athena database name
12
+ # @return [String] Athena table name
13
13
  # @!attribute [r] schema
14
14
  # @return [Egis::TableSchema] table's schema object
15
15
  #
@@ -17,11 +17,13 @@ module Egis
17
17
  DEFAULT_OPTIONS = {format: :tsv}.freeze
18
18
 
19
19
  def initialize(database, name, schema, location, options: {},
20
+ client: Egis::Client.new,
20
21
  partitions_generator: Egis::PartitionsGenerator.new,
21
22
  table_ddl_generator: Egis::TableDDLGenerator.new,
22
- output_downloader: Egis::OutputDownloader.new,
23
+ output_downloader: Egis::OutputDownloader.new(client.aws_s3_client),
23
24
  output_parser: Egis::OutputParser.new,
24
- table_data_wiper: Egis::TableDataWiper.new)
25
+ s3_cleaner: Egis::S3Cleaner.new(client.aws_s3_client),
26
+ table_data_wiper: Egis::TableDataWiper.new(s3_cleaner: s3_cleaner))
25
27
  @database = database
26
28
  @name = name
27
29
  @schema = schema
@@ -42,8 +44,10 @@ module Egis
42
44
  # @return [void]
43
45
 
44
46
  def create
47
+ log_table_creation
48
+
45
49
  create_table_sql = table_ddl_generator.create_table_sql(self, permissive: true)
46
- database.execute_query(create_table_sql, async: false)
50
+ database.execute_query(create_table_sql, async: false, system_execution: true)
47
51
  end
48
52
 
49
53
  ##
@@ -52,8 +56,10 @@ module Egis
52
56
  # @return [void]
53
57
 
54
58
  def create!
59
+ log_table_creation
60
+
55
61
  create_table_sql = table_ddl_generator.create_table_sql(self, permissive: false)
56
- database.execute_query(create_table_sql, async: false)
62
+ database.execute_query(create_table_sql, async: false, system_execution: true)
57
63
  end
58
64
 
59
65
  ##
@@ -67,7 +73,7 @@ module Egis
67
73
 
68
74
  def add_partitions(partitions)
69
75
  load_partitions_query = partitions_generator.to_sql(name, partitions, permissive: true)
70
- database.execute_query(load_partitions_query, async: false)
76
+ database.execute_query(load_partitions_query, async: false, system_execution: true)
71
77
  end
72
78
 
73
79
  ##
@@ -76,7 +82,7 @@ module Egis
76
82
 
77
83
  def add_partitions!(partitions)
78
84
  load_partitions_query = partitions_generator.to_sql(name, partitions, permissive: false)
79
- database.execute_query(load_partitions_query, async: false)
85
+ database.execute_query(load_partitions_query, async: false, system_execution: true)
80
86
  end
81
87
 
82
88
  ##
@@ -87,18 +93,30 @@ module Egis
87
93
  # @return [void]
88
94
 
89
95
  def discover_partitions
90
- database.execute_query("MSCK REPAIR TABLE #{name};", async: false)
96
+ database.execute_query("MSCK REPAIR TABLE #{name};", async: false, system_execution: true)
91
97
  end
92
98
 
93
99
  ##
94
100
  # Insert data into the table. Mostly useful for testing purposes.
95
101
  #
96
- # @param [Array] rows Array of arrays with row values
102
+ # @example Insert with array of arrays
103
+ # table.upload_data([
104
+ # ['hello world', 'mx', 1],
105
+ # ['hello again', 'us', 2]
106
+ # ])
107
+ #
108
+ # @example Insert with array of hashes
109
+ # table.upload_data([
110
+ # {message: 'hello world', country: 'mx', type: 1},
111
+ # {message: 'hello again', country: 'us', type: 2}
112
+ # ])
113
+ #
114
+ # @param [Array] rows Array of arrays or hashes with row values
97
115
  # @return [void]
98
116
 
99
117
  def upload_data(rows)
100
118
  query = data_insert_query(rows)
101
- database.execute_query(query, async: false)
119
+ database.execute_query(query, async: false, system_execution: true)
102
120
  end
103
121
 
104
122
  ##
@@ -107,7 +125,7 @@ module Egis
107
125
  # @return [Array] Array of arrays with row values.
108
126
 
109
127
  def download_data
110
- result = database.execute_query("SELECT * FROM #{name};", async: false)
128
+ result = database.execute_query("SELECT * FROM #{name};", async: false, system_execution: true)
111
129
  content = output_downloader.download(result.output_location)
112
130
  output_parser.parse(content, column_types)
113
131
  end
@@ -141,23 +159,37 @@ module Egis
141
159
  attr_reader :options, :partitions_generator, :table_ddl_generator, :output_downloader, :output_parser,
142
160
  :table_data_wiper
143
161
 
144
- def column_serializers
145
- @column_serializers ||= column_types.map { |type| Egis::Types.serializer(type) }
162
+ def log_table_creation
163
+ Egis.logger.info { "Creating table #{database.name}.#{name} located in #{location}" }
146
164
  end
147
165
 
148
166
  def column_types
149
- (schema.columns + schema.partitions).map(&:type)
167
+ all_columns.map(&:type)
168
+ end
169
+
170
+ def all_columns
171
+ schema.columns + schema.partitions
150
172
  end
151
173
 
152
174
  def data_insert_query(rows)
175
+ insert_values = rows.map { |row| row_literal_values(row) }
176
+ row_clause = insert_values.map { |row| row_values_statement(row) }.join(",\n")
177
+
153
178
  <<~SQL
154
179
  INSERT INTO #{name} VALUES
155
- #{rows.map { |row| row_values_statement(row) }.join(",\n")};
180
+ #{row_clause}
156
181
  SQL
157
182
  end
158
183
 
184
+ def row_literal_values(row)
185
+ all_columns.map.with_index do |column, index|
186
+ value = row.is_a?(Hash) ? row[column.name] : row[index]
187
+ Egis::Types.serializer(column.type).literal(value)
188
+ end
189
+ end
190
+
159
191
  def row_values_statement(row)
160
- "(#{row.zip(column_serializers).map { |value, serializer| serializer.literal(value) }.join(', ')})"
192
+ "(#{row.join(', ')})"
161
193
  end
162
194
  end
163
195
  end
@@ -9,7 +9,7 @@ module Egis
9
9
  #{column_definition_sql(table.schema.columns)}
10
10
  )
11
11
  #{partition_statement(table.schema)}
12
- #{format_statement(table.format)}
12
+ #{row_format_statement(table.format)}
13
13
  LOCATION '#{table.location}';
14
14
  SQL
15
15
  end
@@ -34,7 +34,30 @@ module Egis
34
34
  columns.map { |column| "`#{column.name}` #{column.type}" }.join(",\n")
35
35
  end
36
36
 
37
- def format_statement(format)
37
+ def serde?(format)
38
+ format.is_a?(Hash) && format.key?(:serde)
39
+ end
40
+
41
+ def row_format_statement(format)
42
+ return serde_row_format_statement(format) if serde?(format)
43
+
44
+ delimited_row_format_statement(format)
45
+ end
46
+
47
+ def serde_row_format_statement(format)
48
+ row_format = "ROW FORMAT SERDE '#{format[:serde]}'"
49
+ return row_format unless format.key?(:serde_properties)
50
+
51
+ serde_properties = format[:serde_properties].map { |property, value| "'#{property}' = '#{value}'" }
52
+ <<-SQL
53
+ #{row_format}
54
+ WITH SERDEPROPERTIES (
55
+ #{serde_properties.join(",\n")}
56
+ )
57
+ SQL
58
+ end
59
+
60
+ def delimited_row_format_statement(format)
38
61
  case format
39
62
  when :csv
40
63
  "ROW FORMAT DELIMITED FIELDS TERMINATED BY ','"
data/lib/egis/testing.rb CHANGED
@@ -43,6 +43,6 @@ module Egis # rubocop:disable Style/Documentation
43
43
  yield
44
44
  ensure
45
45
  @mode = previous_mode
46
- test_mode.cleanup
46
+ test_mode&.cleanup
47
47
  end
48
48
  end
@@ -6,7 +6,7 @@ module Egis
6
6
  class TestingMode
7
7
  def initialize(test_id, s3_bucket,
8
8
  client: Egis::Client.new,
9
- output_downloader: Egis::OutputDownloader.new,
9
+ output_downloader: Egis::OutputDownloader.new(client.aws_s3_client),
10
10
  s3_location_parser: Egis::S3LocationParser.new)
11
11
  @test_id = test_id
12
12
  @s3_bucket = s3_bucket
data/lib/egis/version.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Egis
4
- VERSION = '1.1.1'
4
+ VERSION = '1.5.0'
5
5
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: egis
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.1
4
+ version: 1.5.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Agnieszka Czereba
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2020-05-18 00:00:00.000000000 Z
12
+ date: 2021-05-14 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: aws-sdk-athena
@@ -83,7 +83,7 @@ licenses:
83
83
  metadata:
84
84
  homepage_uri: https://github.com/u2i/egis
85
85
  source_code_uri: https://github.com/u2i/egis
86
- changelog_uri: https://github.com/u2i/egis/blob/master/docs/CHANGELOG.md
86
+ changelog_uri: https://u2i.github.io/egis/file.CHANGELOG.html
87
87
  post_install_message:
88
88
  rdoc_options: []
89
89
  require_paths:
@@ -99,7 +99,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
99
99
  - !ruby/object:Gem::Version
100
100
  version: '0'
101
101
  requirements: []
102
- rubygems_version: 3.1.2
102
+ rubygems_version: 3.1.6
103
103
  signing_key:
104
104
  specification_version: 4
105
105
  summary: A handy wrapper for AWS Athena Ruby SDK.