dynamodb-streams-client 0.0.2 → 0.0.3

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
  SHA1:
3
- metadata.gz: d7f611a8a685dfc1974b92e2a2bb10458858a609
4
- data.tar.gz: 84da7c12fd34d9d907754f2c834bd641c5ff29f5
3
+ metadata.gz: cc0aa590a3b2c835e20cf06b6a5f3b05d8dcc63f
4
+ data.tar.gz: 6c726caf62c67d0616568029f1b3a421a5a74310
5
5
  SHA512:
6
- metadata.gz: 19b1fcf3ec4d47ef2cbaa6b186c929a044486c65e3a756cc4af672670b323c12a06e8bfbb3bae28aee3b0cf810a06909c93680b665209c980dee683b5c4ffe48
7
- data.tar.gz: d580a5092c5522ebef33a8e49bde4a78ea39911239ced5232565bd55bc2b732ec3d13db5afaab68484805b65f75b7555a3fa4c216cac86cf1541c99d0eb8227a
6
+ metadata.gz: f73c51247af46e2a1570af218b20759f9026cdc6ce4463795eb8bcf52c53def4e78d264f6c9d3d46373b6146708307da111b6e2fa7815302e1fa53c1203b4cd7
7
+ data.tar.gz: 9abc3e1ae742ead23924aaddf815cffe077243c15eb2816a1480c8218abeb2b17d7526cec0eaee99c1919e7d057239e498bb06e1aae3360d4679065a8ca0447a
data/README.md CHANGED
@@ -21,6 +21,9 @@ Or install it yourself as:
21
21
  ## Usage
22
22
 
23
23
  ```ruby
24
+ require 'dynamodb/streams/client'
25
+ require 'pp'
26
+
24
27
  client = DynamoDB::Streams::Client.new(
25
28
  access_key_id: 'YOUR_ACCESS_KEY_ID',
26
29
  secret_access_key: 'YOUR_SECRET_ACCESS_KEY',
@@ -34,3 +37,27 @@ pp client.query('ListStreams')
34
37
  # "...",
35
38
  # "..."]}
36
39
  ```
40
+
41
+ ## CLI
42
+
43
+ ```sh
44
+ $ dynamodb-streams
45
+ Commands:
46
+ dynamodb-streams describe_stream STREAM_ID # Returns information about a stream
47
+ dynamodb-streams get_records SHARD_ITERATOR # Retrieves the stream records
48
+ dynamodb-streams get_shard_iterator STREAM_ID SHARD_ID SHARD_ITERATOR_TYPE # Returns a shard iterator
49
+ dynamodb-streams help [COMMAND] # Describe available commands or one specific command
50
+ dynamodb-streams list_streams # Returns an array of stream IDs
51
+
52
+ Options:
53
+ -k, [--access-key=ACCESS-KEY]
54
+ -s, [--secret-key=SECRET-KEY]
55
+ -e, [--endpoint=ENDPOINT]
56
+ -r, [--region=REGION]
57
+ ```
58
+
59
+ ### Follow record
60
+
61
+ ```sh
62
+ dynamodb-streams get_records xxxxxxxx-xxxx-... -f --limit 10
63
+ ```
@@ -0,0 +1,6 @@
1
+ #!/usr/bin/env ruby
2
+ $: << File.expand_path("#{File.dirname __FILE__}/../lib")
3
+ require 'rubygems'
4
+ require 'dynamodb/streams/client'
5
+
6
+ DynamoDB::Streams::Client::CLI.start(ARGV)
@@ -18,6 +18,8 @@ Gem::Specification.new do |spec|
18
18
  spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
19
  spec.require_paths = ['lib']
20
20
 
21
+ spec.add_dependency 'thor'
22
+ spec.add_dependency 'deep_merge'
21
23
  spec.add_development_dependency 'bundler'
22
24
  spec.add_development_dependency 'rake'
23
25
  end
@@ -7,7 +7,10 @@ require 'stringio'
7
7
  require 'zlib'
8
8
  require 'uri'
9
9
 
10
+ require 'thor'
11
+
10
12
  require 'dynamodb/streams/client/version'
13
+ require 'dynamodb/streams/client/cli'
11
14
 
12
15
  class DynamoDB::Streams::Client
13
16
  class Error < StandardError
@@ -110,10 +113,12 @@ class DynamoDB::Streams::Client
110
113
 
111
114
  if res_code != 200 or __type
112
115
  errmsg = if __type
116
+ res_data_msg = res_data['message'] || res_data['Message'] || __type
117
+
113
118
  if @debug
114
- "#{__type}: #{res_data['message'] || res_data['Message']}"
119
+ "#{__type}: #{res_data_msg}"
115
120
  else
116
- "#{res_data['message'] || res_data['Message']}"
121
+ "#{res_data_msg}"
117
122
  end
118
123
  else
119
124
  "#{res_code} #{res_msg}"
@@ -0,0 +1,103 @@
1
+ require 'deep_merge'
2
+
3
+ class DynamoDB::Streams::Client::CLI < Thor
4
+ ITOR_WAIT = 0.3
5
+
6
+ class_option 'access-key', :aliases => '-k'
7
+ class_option 'secret-key', :aliases => '-s'
8
+ class_option 'endpoint', :aliases => '-e'
9
+ class_option 'region', :aliases => '-r'
10
+
11
+ desc 'list_streams', 'Returns an array of stream IDs'
12
+ def list_streams
13
+ res_data = iterate('StreamId') do |rh|
14
+ client.query('ListStreams', rh)
15
+ end
16
+
17
+ puts JSON.pretty_generate(res_data)
18
+ end
19
+
20
+ desc 'describe_stream STREAM_ID', 'Returns information about a stream'
21
+ def describe_stream(stream_id)
22
+ req_hash = {'StreamId' => stream_id}
23
+
24
+ res_data = iterate('ShardId', req_hash) do |rh|
25
+ client.query('DescribeStream', rh)
26
+ end
27
+
28
+ puts JSON.pretty_generate(res_data)
29
+ end
30
+
31
+ desc 'get_shard_iterator STREAM_ID SHARD_ID SHARD_ITERATOR_TYPE', 'Returns a shard iterator'
32
+ option 'sequence-number'
33
+ def get_shard_iterator(stream_id, shard_id, shard_iterator_type)
34
+ req_hash = {
35
+ 'StreamId' => stream_id,
36
+ 'ShardId' => shard_id,
37
+ 'ShardIteratorType' => shard_iterator_type.upcase,
38
+ }
39
+
40
+ if seq_num = options['sequence-number']
41
+ req_hash['SequenceNumber'] = seq_num
42
+ end
43
+
44
+ res_data = client.query('GetShardIterator', req_hash)
45
+ puts JSON.pretty_generate(res_data)
46
+ end
47
+
48
+ desc 'get_records SHARD_ITERATOR', 'Retrieves the stream records'
49
+ option 'limit', :type => :numeric
50
+ option 'follow', :aliases => '-f'
51
+ def get_records(shard_iterator)
52
+ req_hash = {'ShardIterator' => shard_iterator}
53
+ req_hash['Limit'] = options['limit'] if options['limit']
54
+
55
+ loop do
56
+ res_data = client.query('GetRecords', req_hash)
57
+ puts JSON.pretty_generate(res_data)
58
+ next_shard_iterator = res_data['NextShardIterator']
59
+
60
+ unless options['follow'] and next_shard_iterator
61
+ break
62
+ end
63
+
64
+ req_hash['ShardIterator'] = next_shard_iterator
65
+ end
66
+ end
67
+
68
+ no_commands do
69
+ def iterate(item, req_hash = {})
70
+ res_data = {}
71
+
72
+ list = proc do |last_evaluated|
73
+ req_hash["ExclusiveStart#{item}"] = last_evaluated if last_evaluated
74
+ resp = yield(req_hash)
75
+ res_data.deep_merge!(resp)
76
+ resp["LastEvaluated#{item}"]
77
+ end
78
+
79
+ le = nil
80
+
81
+ loop do
82
+ le = list.call(le)
83
+ break unless le
84
+ end
85
+
86
+ res_data.delete("LastEvaluated#{item}")
87
+ res_data
88
+ end
89
+
90
+ def client
91
+ return @client if @client
92
+
93
+ client_options = {
94
+ :access_key_id => options.fetch('access-key', ENV['AWS_ACCESS_KEY_ID']),
95
+ :secret_access_key => options.fetch('secret-key', ENV['AWS_SECRET_ACCESS_KEY']),
96
+ :endpoint => options.fetch('endpoint', ENV['DYNAMODB_STREAMS_ENDPOINT']),
97
+ :region => options['region'],
98
+ }
99
+
100
+ @client = DynamoDB::Streams::Client.new(client_options)
101
+ end
102
+ end
103
+ end
@@ -1,7 +1,7 @@
1
1
  module DynamoDB
2
2
  module Streams
3
3
  class Client
4
- VERSION = '0.0.2'
4
+ VERSION = '0.0.3'
5
5
  end
6
6
  end
7
7
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: dynamodb-streams-client
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.2
4
+ version: 0.0.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Genki Sugawara
@@ -10,6 +10,34 @@ bindir: bin
10
10
  cert_chain: []
11
11
  date: 2014-11-21 00:00:00.000000000 Z
12
12
  dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: thor
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - '>='
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - '>='
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: deep_merge
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - '>='
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - '>='
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
13
41
  - !ruby/object:Gem::Dependency
14
42
  name: bundler
15
43
  requirement: !ruby/object:Gem::Requirement
@@ -41,7 +69,8 @@ dependencies:
41
69
  description: DynamoDB Streams client.
42
70
  email:
43
71
  - sgwr_dts@yahoo.co.jp
44
- executables: []
72
+ executables:
73
+ - dynamodb-streams
45
74
  extensions: []
46
75
  extra_rdoc_files: []
47
76
  files:
@@ -50,8 +79,10 @@ files:
50
79
  - LICENSE.txt
51
80
  - README.md
52
81
  - Rakefile
82
+ - bin/dynamodb-streams
53
83
  - dynamodb-streams-client.gemspec
54
84
  - lib/dynamodb/streams/client.rb
85
+ - lib/dynamodb/streams/client/cli.rb
55
86
  - lib/dynamodb/streams/client/version.rb
56
87
  homepage: https://github.com/winebarrel/dynamodb-streams-client
57
88
  licenses: