athens 0.3.3 → 0.4.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: fa391fbff6c5016740bc28cfb0692fcc79ee2e1361d31541a635691e6cbbc8a7
4
- data.tar.gz: ef1fbb6307221f616576e844ced0ed9398ff9e6db436fde0142e58c89be8c9f5
3
+ metadata.gz: cb4922b50ef935d722a54d54d4f3d9a9e47b587b67592454b806bf11e00f7be1
4
+ data.tar.gz: 2fc14349880958e3212444e8285a0005c76f9e1bcb219ac8423cb1f1cdacfb57
5
5
  SHA512:
6
- metadata.gz: e37d29e7d93b1aa61d6266b5feccc3789087f697c1751830893adc4c795761f587bafdaa44f34de6b5786712d8983e66511d3d0f10fa1b0922ec6921e4201e66
7
- data.tar.gz: 0ccaf8bbb67bceb9136806a93da4447ace996ab9709e82d8f6861249e6a62246680c3a618a1479481b931127e568e966038569da2d1814540ef64b7ab3dd155e
6
+ metadata.gz: 6c8dc6d78814f5b947d08434b8f2ccf13998439fca59465495401cc9e73f7e7e30efe3899679d545fe17184704b81fab33ddf5ffc5d2eb833e6ea2ef67dc6f2e
7
+ data.tar.gz: 4e7d3d6f0cd1bdd5da7644c16b8802bc810d8f15f12e05fcd746acb743d48fe5c0ff740928ae117047aa2d6c2417daf33b86cab630cfbe0f42e87650c58e7909
data/.gitignore CHANGED
@@ -8,4 +8,5 @@
8
8
  /tmp/
9
9
 
10
10
  /.vagrant/
11
- /ubuntu-xenial-16.04-cloudimg-console.log
11
+ /ubuntu-xenial-16.04-cloudimg-console.log
12
+ /vendor/
data/CHANGELOG.md CHANGED
@@ -1,3 +1,57 @@
1
+ ## 0.4.0 / 2021-12-03
2
+
3
+ * Added automatic parsing of JSON columns (thanks [darkside](https://github.com/darkside))
4
+
5
+ #### Potentially breaking change
6
+
7
+ If you were previously querying JSON type data and parsing it from a string in your own code, you'll want to remove that before upgrading.
8
+
9
+ For example, with previous versions you could do this (even though it would generate a warning):
10
+
11
+ ```ruby
12
+ > query = conn.execute("SELECT JSON_PARSE('{\"a\": 1, \"b\": 2}');")
13
+ > query.wait
14
+ > JSON.parse(query.to_a(header_row: false).first[0])
15
+ WARNING: Unsupported type: json, defaulting to string
16
+ => {"a"=>1, "b"=>2}
17
+ ```
18
+
19
+ After upgrading, that same code will give you an error:
20
+ ```ruby
21
+ > JSON.parse(query.to_a(header_row: false).first[0])
22
+ Traceback (most recent call last):
23
+ 5: from bin/console:14:in `<main>'
24
+ 4: from (irb):12:in `<main>'
25
+ 3: from /home/vagrant/.rvm/rubies/ruby-3.0.0/lib/ruby/3.0.0/json/common.rb:216:in `parse'
26
+ 2: from /home/vagrant/.rvm/rubies/ruby-3.0.0/lib/ruby/3.0.0/json/common.rb:216:in `new'
27
+ 1: from /home/vagrant/.rvm/rubies/ruby-3.0.0/lib/ruby/3.0.0/json/common.rb:216:in `initialize'
28
+ TypeError (no implicit conversion of Hash into String)
29
+ ```
30
+
31
+ Instead just remove your json parsing since Athens handles it now:
32
+ ```ruby
33
+ > query = conn.execute("SELECT JSON_PARSE('{\"a\": 1, \"b\": 2}');")
34
+ > query.wait
35
+ > query.to_a(header_row: false).first[0]
36
+ => {:a=>1, :b=>2}
37
+ ```
38
+
39
+
40
+ ## 0.3.6 / 2021-11-16
41
+
42
+ * Addition of :result_encryption as a configuration option to change encryption options for query results (https://github.com/getletterpress/athens/issues/12)
43
+ * Bumped development gem versions to latest releases
44
+
45
+ ## 0.3.5 / 2021-05-19
46
+
47
+ * Addition of :aws_profile as a configuration option for credentials (thanks [oisin](https://github.com/oisin))
48
+ * Fix for BigDecimal in Ruby 3.x (thanks [mediafinger](https://github.com/mediafinger))
49
+ * Bumped development gem versions to latest releases
50
+
51
+ ## 0.3.4 / 2021-03-02
52
+
53
+ * Added configurable polling period (thanks [jesseproudman](https://github.com/jesseproudman))
54
+
1
55
  ## 0.3.3 / 2021-01-12
2
56
 
3
57
  * Added support for Ruby 3.0 (thanks [blackjiro](https://github.com/blackjiro))
data/Gemfile.lock CHANGED
@@ -1,27 +1,29 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- athens (0.3.3)
4
+ athens (0.4.0)
5
5
  aws-sdk-athena (~> 1)
6
+ multi_json (~> 1.0)
6
7
 
7
8
  GEM
8
9
  remote: https://rubygems.org/
9
10
  specs:
10
- aws-eventstream (1.1.0)
11
- aws-partitions (1.416.0)
12
- aws-sdk-athena (1.33.0)
13
- aws-sdk-core (~> 3, >= 3.109.0)
11
+ aws-eventstream (1.2.0)
12
+ aws-partitions (1.539.0)
13
+ aws-sdk-athena (1.44.0)
14
+ aws-sdk-core (~> 3, >= 3.122.0)
14
15
  aws-sigv4 (~> 1.1)
15
- aws-sdk-core (3.111.0)
16
+ aws-sdk-core (3.124.0)
16
17
  aws-eventstream (~> 1, >= 1.0.2)
17
- aws-partitions (~> 1, >= 1.239.0)
18
+ aws-partitions (~> 1, >= 1.525.0)
18
19
  aws-sigv4 (~> 1.1)
19
20
  jmespath (~> 1.0)
20
- aws-sigv4 (1.2.2)
21
+ aws-sigv4 (1.4.0)
21
22
  aws-eventstream (~> 1, >= 1.0.2)
22
23
  jmespath (1.4.0)
23
- rake (13.0.1)
24
- rexml (3.2.4)
24
+ multi_json (1.15.0)
25
+ rake (13.0.6)
26
+ rexml (3.2.5)
25
27
 
26
28
  PLATFORMS
27
29
  ruby
data/README.md CHANGED
@@ -44,8 +44,8 @@ When your query is done, grab the results as an array:
44
44
  ```ruby
45
45
  results = query.to_a
46
46
  # [
47
- # ['column_1', 'column_2', 'column_3'],
48
- # [15, 'data', true],
47
+ # ['column_1', 'column_2', 'column_3'],
48
+ # [15, 'data', true],
49
49
  # [20, 'foo', false],
50
50
  # ...
51
51
  # ]
@@ -55,7 +55,7 @@ Or as a hash (which is really an array where each row is a hash):
55
55
  ```ruby
56
56
  results = query.to_h
57
57
  # [
58
- # {'column_1': 15, 'column_2': 'data', 'column_3': true},
58
+ # {'column_1': 15, 'column_2': 'data', 'column_3': true},
59
59
  # {'column_1': 20, 'column_2': 'foo', 'column_3': false},
60
60
  # ...
61
61
  # ]
@@ -87,9 +87,12 @@ Configure your AWS settings in an `Athens.configure` block (in rails put this in
87
87
  ```ruby
88
88
  Athens.configure do |config|
89
89
  config.output_location = "s3://my-bucket/my-folder/athena/results/" # Required
90
- config.aws_access_key = 'access' # Optional
91
- config.aws_secret_key = 'secret' # Optional
92
- config.aws_region = 'us-east-1' # Optional
90
+ config.aws_access_key = 'access' # Optional
91
+ config.aws_secret_key = 'secret' # Optional
92
+ config.aws_profile = 'myprofile' # Optional
93
+ config.aws_region = 'us-east-1' # Optional
94
+ config.wait_polling_period = 0.25 # Optional - What period should we poll for the complete query?
95
+ config.result_encryption = nil # Optional, see below
93
96
  end
94
97
  ```
95
98
 
@@ -103,6 +106,14 @@ conn = Athens::Connection.new(aws_client_override: {})
103
106
 
104
107
  Take a look at the [AWS Athena SDK](https://docs.aws.amazon.com/sdk-for-ruby/v3/api/Aws/Athena/Client.html#initialize-instance_method) for a list of all the available options.
105
108
 
109
+ The `result_encryption` option controls how the Athens results will be encrypted at the `output_location`. By default it's set to use the Amazon SSE encryption if you don't set it at all:
110
+
111
+ ```ruby
112
+ { encryption_option: "SSE_S3" }
113
+ ```
114
+
115
+ If you set it to `nil`, it'll default to the bucket encryption settings. You can also use a customer kms key, see https://docs.aws.amazon.com/sdk-for-ruby/v3/api/Aws/Athena/Types/EncryptionConfiguration.html for the correct format.
116
+
106
117
  ### Advanced Usage
107
118
 
108
119
  Providing a database name to the connection is optional, if you omit the name you'll have to specify it in your query:
@@ -172,3 +183,4 @@ The gem is available as open source under the terms of the [WTFPL License](http:
172
183
  ## Code of Conduct
173
184
 
174
185
  Everyone interacting in the Athens project’s codebases, issue trackers, chat rooms and mailing lists is expected to follow the [code of conduct](https://github.com/getletterpress/athens/blob/master/CODE_OF_CONDUCT.md).
186
+
data/Vagrantfile CHANGED
@@ -4,13 +4,11 @@
4
4
  # Provisioning script
5
5
  $script = <<SCRIPT
6
6
  echo "*** Updating packages"
7
-
8
- sudo DEBIAN_FRONTEND=noninteractive apt-get install -y aptitude
9
- sudo DEBIAN_FRONTEND=noninteractive aptitude update
10
- sudo DEBIAN_FRONTEND=noninteractive aptitude -y safe-upgrade
7
+ sudo DEBIAN_FRONTEND=noninteractive apt-get update
8
+ sudo DEBIAN_FRONTEND=noninteractive apt-get upgrade
11
9
 
12
10
  echo "*** Installing new packages"
13
- sudo DEBIAN_FRONTEND=noninteractive aptitude install -y curl git-core vim
11
+ sudo DEBIAN_FRONTEND=noninteractive apt-get install -y curl git-core vim
14
12
 
15
13
  if rvm -v 2>/dev/null; then
16
14
  echo "*** rvm already installed, skipping"
@@ -30,7 +28,7 @@ SCRIPT
30
28
 
31
29
 
32
30
  Vagrant.configure('2') do |config|
33
- config.vm.box = "ubuntu/xenial64"
31
+ config.vm.box = "ubuntu/focal64"
34
32
  config.vm.hostname = 'athens-dev'
35
33
 
36
34
  # Provision the machine with the shell script above
data/athens.gemspec CHANGED
@@ -35,6 +35,7 @@ Gem::Specification.new do |spec|
35
35
  spec.required_ruby_version = '>= 2.4'
36
36
 
37
37
  spec.add_dependency "aws-sdk-athena", "~> 1"
38
+ spec.add_dependency 'multi_json', '~> 1.0'
38
39
 
39
40
  spec.add_development_dependency "bundler", ">= 1.17"
40
41
  spec.add_development_dependency "rake", "~> 13.0"
@@ -1,15 +1,21 @@
1
1
  module Athens
2
2
  class Configuration
3
- attr_accessor :aws_access_key,
3
+ attr_accessor :aws_access_key,
4
4
  :aws_secret_key,
5
5
  :aws_region,
6
- :output_location
6
+ :output_location,
7
+ :wait_polling_period,
8
+ :aws_profile,
9
+ :result_encryption
7
10
 
8
11
  def initialize
9
12
  @aws_access_key = nil
10
13
  @aws_secret_key = nil
11
14
  @aws_region = nil
12
15
  @output_location = nil
16
+ @wait_polling_period = 0.25
17
+ @aws_profile = nil
18
+ @result_encryption = { encryption_option: "SSE_S3" }
13
19
  end
14
20
  end
15
- end
21
+ end
@@ -11,7 +11,8 @@ module Athens
11
11
  client_config = {
12
12
  access_key_id: Athens.configuration.aws_access_key,
13
13
  secret_access_key: Athens.configuration.aws_secret_key,
14
- region: Athens.configuration.aws_region
14
+ region: Athens.configuration.aws_region,
15
+ profile: Athens.configuration.aws_profile
15
16
  }.merge(aws_client_override).compact
16
17
 
17
18
  @client = Aws::Athena::Client.new(client_config)
@@ -47,9 +48,7 @@ module Athens
47
48
  def result_config
48
49
  Aws::Athena::Types::ResultConfiguration.new(
49
50
  output_location: Athens.configuration.output_location,
50
- encryption_configuration: {
51
- encryption_option: "SSE_S3"
52
- }
51
+ encryption_configuration: Athens.configuration.result_encryption
53
52
  )
54
53
  end
55
54
 
data/lib/athens/query.rb CHANGED
@@ -14,6 +14,7 @@ module Athens
14
14
 
15
15
  version = RUBY_VERSION.split('.').map {|v| v.to_i}
16
16
  @decimal_without_new = (version[0] >= 2 && version[1] >= 5)
17
+ @decimal_without_new = (version[0] == 2 && version[1] >= 5) || (version[0] >= 3)
17
18
  end
18
19
 
19
20
  def state
@@ -49,7 +50,7 @@ module Athens
49
50
  end
50
51
 
51
52
  # Wait a bit and check again
52
- sleep(0.25)
53
+ sleep(Athens.configuration.wait_polling_period.to_f)
53
54
  end
54
55
  end
55
56
 
@@ -140,7 +141,7 @@ module Athens
140
141
  metadata.column_info.each_with_index do |col, index|
141
142
  data = row.data[index].var_char_value
142
143
  nullable = ["UNKNOWN", "NULLABLE"].include?(col.nullable)
143
-
144
+
144
145
  if nullable && data.nil?
145
146
  mapped << data
146
147
  elsif !nullable && data.nil?
@@ -165,6 +166,8 @@ module Athens
165
166
  mapped << Date.parse(data)
166
167
  when 'boolean'
167
168
  mapped << (data == "true")
169
+ when 'json'
170
+ mapped << MultiJson.load(data, symbolize_keys: true)
168
171
  else
169
172
  puts "WARNING: Unsupported type: #{col.type}, defaulting to string"
170
173
  mapped << data
@@ -173,9 +176,8 @@ module Athens
173
176
  end
174
177
 
175
178
  return mapped
176
- end
179
+ end
177
180
 
178
181
 
179
182
  end
180
183
  end
181
-
@@ -1,3 +1,3 @@
1
1
  module Athens
2
- VERSION = "0.3.3"
2
+ VERSION = "0.4.0"
3
3
  end
data/lib/athens.rb CHANGED
@@ -5,6 +5,7 @@ require "athens/connection"
5
5
  require "athens/query"
6
6
 
7
7
  require 'aws-sdk-athena'
8
+ require 'multi_json'
8
9
 
9
10
  module Athens
10
11
  class << self
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: athens
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.3
4
+ version: 0.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Chris Schulte
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2021-01-12 00:00:00.000000000 Z
11
+ date: 2021-12-03 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: aws-sdk-athena
@@ -24,6 +24,20 @@ dependencies:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
26
  version: '1'
27
+ - !ruby/object:Gem::Dependency
28
+ name: multi_json
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '1.0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '1.0'
27
41
  - !ruby/object:Gem::Dependency
28
42
  name: bundler
29
43
  requirement: !ruby/object:Gem::Requirement
@@ -113,7 +127,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
113
127
  - !ruby/object:Gem::Version
114
128
  version: '0'
115
129
  requirements: []
116
- rubygems_version: 3.1.4
130
+ rubygems_version: 3.0.9
117
131
  signing_key:
118
132
  specification_version: 4
119
133
  summary: Run simple SQL queries in AWS Athena