ddbcli 0.2.1 → 0.2.2

Sign up to get free protection for your applications and to get access to all the features.
data/README CHANGED
@@ -85,9 +85,9 @@ https://bitbucket.org/winebarrel/ddbcli
85
85
  DELETE ALL FROM table_name WHERE [WHERE attr1 = '...' AND ...] [ORDER {ASC|DESC}] [LIMIT limit]
86
86
  deletes items
87
87
 
88
- SELECT {*|attrs|COUNT(*)} FROM table_name [USE INDEX (index_name)] [WHERE key1 = '...' AND ...] [ORDER {ASC|DESC}] [LIMIT limit]
89
- SELECT ALL {*|attrs|COUNT(*)} FROM table_name [WHERE attr1 = '...' AND ...] [LIMIT limit]
90
- SELECT segment/total_segments {*|attrs|COUNT(*)} FROM table_name [WHERE attr1 = '...' AND ...] [LIMIT limit]
88
+ SELECT {*|attr1,attr2,...|COUNT(*)} FROM table_name [USE INDEX (index_name)] [WHERE key1 = '...' AND ...] [ORDER {ASC|DESC}] [LIMIT limit]
89
+ SELECT ALL {*|attr1,attr2,...|COUNT(*)} FROM table_name [WHERE attr1 = '...' AND ...] [LIMIT limit]
90
+ SELECT segment/total_segments {*|attr1,attr2,...|COUNT(*)} FROM table_name [WHERE attr1 = '...' AND ...] [LIMIT limit]
91
91
  queries using the Query/Scan action
92
92
  see http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/QueryAndScan.html
93
93
 
data/bin/ddbcli CHANGED
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env ruby
2
2
  $LOAD_PATH << File.join(File.dirname(__FILE__), '..', 'lib')
3
3
 
4
- Version = '0.2.1'
4
+ Version = '0.2.2'
5
5
 
6
6
  HISTORY_FILE = File.join((ENV['HOME'] || ENV['USERPROFILE'] || '.'), '.ddbcli_history')
7
7
  HISTSIZE = 500
@@ -50,9 +50,9 @@ DELETE FROM table_name WHERE key1 = '...' AND ..
50
50
  DELETE ALL FROM table_name WHERE [WHERE attr1 = '...' AND ...] [ORDER {ASC|DESC}] [LIMIT limit]
51
51
  deletes items
52
52
 
53
- SELECT {*|attrs|COUNT(*)} FROM table_name [USE INDEX (index_name)] [WHERE key1 = '...' AND ...] [ORDER {ASC|DESC}] [LIMIT limit]
54
- SELECT ALL {*|attrs|COUNT(*)} FROM table_name [WHERE attr1 = '...' AND ...] [LIMIT limit]
55
- SELECT segment/total_segments {*|attrs|COUNT(*)} FROM table_name [WHERE attr1 = '...' AND ...] [LIMIT limit]
53
+ SELECT {*|attr1,attr2,...|COUNT(*)} FROM table_name [USE INDEX (index_name)] [WHERE key1 = '...' AND ...] [ORDER {ASC|DESC}] [LIMIT limit]
54
+ SELECT ALL {*|attr1,attr2,...|COUNT(*)} FROM table_name [WHERE attr1 = '...' AND ...] [LIMIT limit]
55
+ SELECT segment/total_segments {*|attr1,attr2,...|COUNT(*)} FROM table_name [WHERE attr1 = '...' AND ...] [LIMIT limit]
56
56
  queries using the Query/Scan action
57
57
  see http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/QueryAndScan.html
58
58
 
@@ -1,5 +1,6 @@
1
1
  require 'optparse'
2
2
  require 'ostruct'
3
+ require 'uri'
3
4
 
4
5
  def parse_options
5
6
  options = OpenStruct.new
@@ -20,6 +21,15 @@ def parse_options
20
21
  opt.on('-k', '--access-key=ACCESS_KEY') {|v| options.access_key_id = v }
21
22
  opt.on('-s', '--secret-key=SECRET_KEY') {|v| options.secret_access_key = v }
22
23
  opt.on('-r', '--region=REGION_OR_ENDPOINT') {|v| options.ddb_endpoint_or_region = v }
24
+
25
+ opt.on('', '--uri=URI') {|v|
26
+ uri = v
27
+ uri = "http://#{uri}" unless uri =~ %r|\A\w+://|
28
+ uri = URI.parse(uri)
29
+ raise URI::InvalidURIError, "invalid shceme: #{v}" unless /\Ahttps?\Z/ =~ uri.scheme
30
+ options.ddb_endpoint_or_region = uri
31
+ }
32
+
23
33
  opt.on('-e', '--eval=COMMAND') {|v| options.command = v }
24
34
  opt.on('-t', '--timeout=SECOND', Integer) {|v| options.timeout = v.to_i }
25
35
 
@@ -5,6 +5,7 @@ require 'time'
5
5
  require 'stringio'
6
6
  require 'zlib'
7
7
  require 'pp'
8
+ require 'uri'
8
9
 
9
10
  require 'ddbcli/ddb-error'
10
11
  require 'ddbcli/ddb-endpoint'
@@ -18,7 +19,6 @@ module DynamoDB
18
19
 
19
20
  DEFAULT_TIMEOUT = 60
20
21
 
21
- attr_reader :endpoint
22
22
  attr_reader :region
23
23
  attr_accessor :timeout
24
24
  attr_accessor :retry_num
@@ -36,7 +36,13 @@ module DynamoDB
36
36
  end
37
37
 
38
38
  def set_endpoint_and_region(endpoint_or_region)
39
- @endpoint, @region = DynamoDB::Endpoint.endpoint_and_region(endpoint_or_region)
39
+ if endpoint_or_region.kind_of?(URI)
40
+ @endpoint = endpoint_or_region
41
+ @region = [@endpoint.host, @endpoint.port].join(':')
42
+ else
43
+ host, @region = DynamoDB::Endpoint.endpoint_and_region(endpoint_or_region)
44
+ @endpoint = URI.parse("https://#{host}")
45
+ end
40
46
  end
41
47
 
42
48
  def query(action, hash)
@@ -73,16 +79,20 @@ EOS
73
79
  headers['Authorization'] = authorization(date, headers, req_body)
74
80
 
75
81
  Net::HTTP.version_1_2
76
- https = Net::HTTP.new(@endpoint, 443)
77
- https.use_ssl = true
78
- https.verify_mode = OpenSSL::SSL::VERIFY_NONE
79
- https.open_timeout = @timeout
80
- https.read_timeout = @timeout
82
+ http = Net::HTTP.new(@endpoint.host, @endpoint.port)
83
+
84
+ if @endpoint.scheme == 'https'
85
+ http.use_ssl = true
86
+ http.verify_mode = OpenSSL::SSL::VERIFY_NONE
87
+ end
88
+
89
+ http.open_timeout = @timeout
90
+ http.read_timeout = @timeout
81
91
 
82
92
  res_code = nil
83
93
  res_msg = nil
84
94
 
85
- res_body = https.start do |w|
95
+ res_body = http.start do |w|
86
96
  req = Net::HTTP::Post.new('/', headers)
87
97
  req.body = req_body
88
98
  res = w.request(req)
@@ -198,6 +198,12 @@ module DynamoDB
198
198
  %w(TableStatus ItemCount TableSizeBytes).each do |i|
199
199
  h[table_name][i] = table_info[i]
200
200
  end
201
+
202
+ provisioned_throughput = table_info['ProvisionedThroughput']
203
+
204
+ %w(ReadCapacityUnits WriteCapacityUnits).each do |i|
205
+ h[table_name][i] = provisioned_throughput[i]
206
+ end
201
207
  end
202
208
 
203
209
  return h
@@ -284,7 +290,18 @@ module DynamoDB
284
290
  end
285
291
 
286
292
  def do_use(parsed)
287
- set_endpoint_and_region(parsed.endpoint_or_region)
293
+ eor = parsed.endpoint_or_region
294
+
295
+ if %r|\A\w+://| =~ eor or /:\d+\Z/ =~ eor
296
+ eor = "http://#{eor}" unless eor =~ %r|\A\w+://|
297
+ eor = URI.parse(eor)
298
+
299
+ unless /\Ahttps?\Z/ =~ eor.scheme
300
+ raise URI::InvalidURIError, "invalid shceme: #{parsed.endpoint_or_region}"
301
+ end
302
+ end
303
+
304
+ set_endpoint_and_region(eor)
288
305
  nil
289
306
  end
290
307
 
@@ -92,6 +92,7 @@ private :struct
92
92
 
93
93
  def scan
94
94
  tok = nil
95
+ @prev_tokens = []
95
96
 
96
97
  until @ss.eos?
97
98
  if (tok = @ss.scan /\s+/)
@@ -133,21 +134,46 @@ def scan
133
134
  yield [:RUBY_SCRIPT, tok.slice(1..-1)]
134
135
  elsif (tok = @ss.scan /\!(?:.*)/)
135
136
  yield [:SHELL_SCRIPT, tok.slice(1..-1)]
136
- elsif (tok = @ss.scan /[-.0-9a-z_]*/i)
137
+ elsif (tok = @ss.scan %r|[-.0-9a-z_:/]*|i)
137
138
  yield [:IDENTIFIER, tok]
138
139
  else
139
- raise Racc::ParseError, ('parse error on value "%s"' % @ss.rest.inspect)
140
+ raise_error(tok, @prev_tokens, @ss)
140
141
  end
142
+
143
+ @prev_tokens << tok
141
144
  end
142
145
 
143
- yield [false, 'EOF']
146
+ yield [false, '']
144
147
  end
145
148
  private :scan
146
149
 
150
+ def raise_error(error_value, prev_tokens, scanner)
151
+ errmsg = ["__#{error_value}__"]
152
+
153
+ if prev_tokens and not prev_tokens.empty?
154
+ toks = prev_tokens.reverse[0, 5].reverse
155
+ toks.unshift('...') if prev_tokens.length > toks.length
156
+ errmsg.unshift(toks.join.strip) unless toks.empty?
157
+ end
158
+
159
+ if scanner and not (rest = (scanner.rest || '').strip).empty?
160
+ str = rest[0, 16]
161
+ str += '...' if rest.length > str.length
162
+ errmsg << str
163
+ end
164
+
165
+ raise Racc::ParseError, ('parse error on value: %s' % errmsg.join(' '))
166
+ end
167
+ private :raise_error
168
+
147
169
  def parse
148
170
  yyparse self, :scan
149
171
  end
150
172
 
173
+ def on_error(error_token_id, error_value, value_stack)
174
+ raise_error(error_value, @prev_tokens, @ss)
175
+ end
176
+
151
177
  def self.parse(obj)
152
178
  self.new(obj).parse
153
179
  end
@@ -567,6 +567,7 @@ private :struct
567
567
 
568
568
  def scan
569
569
  tok = nil
570
+ @prev_tokens = []
570
571
 
571
572
  until @ss.eos?
572
573
  if (tok = @ss.scan /\s+/)
@@ -608,21 +609,46 @@ def scan
608
609
  yield [:RUBY_SCRIPT, tok.slice(1..-1)]
609
610
  elsif (tok = @ss.scan /\!(?:.*)/)
610
611
  yield [:SHELL_SCRIPT, tok.slice(1..-1)]
611
- elsif (tok = @ss.scan /[-.0-9a-z_]*/i)
612
+ elsif (tok = @ss.scan %r|[-.0-9a-z_:/]*|i)
612
613
  yield [:IDENTIFIER, tok]
613
614
  else
614
- raise Racc::ParseError, ('parse error on value "%s"' % @ss.rest.inspect)
615
+ raise_error(tok, @prev_tokens, @ss)
615
616
  end
617
+
618
+ @prev_tokens << tok
616
619
  end
617
620
 
618
- yield [false, 'EOF']
621
+ yield [false, '']
619
622
  end
620
623
  private :scan
621
624
 
625
+ def raise_error(error_value, prev_tokens, scanner)
626
+ errmsg = ["__#{error_value}__"]
627
+
628
+ if prev_tokens and not prev_tokens.empty?
629
+ toks = prev_tokens.reverse[0, 5].reverse
630
+ toks.unshift('...') if prev_tokens.length > toks.length
631
+ errmsg.unshift(toks.join.strip) unless toks.empty?
632
+ end
633
+
634
+ if scanner and not (rest = (scanner.rest || '').strip).empty?
635
+ str = rest[0, 16]
636
+ str += '...' if rest.length > str.length
637
+ errmsg << str
638
+ end
639
+
640
+ raise Racc::ParseError, ('parse error on value: %s' % errmsg.join(' '))
641
+ end
642
+ private :raise_error
643
+
622
644
  def parse
623
645
  yyparse self, :scan
624
646
  end
625
647
 
648
+ def on_error(error_token_id, error_value, value_stack)
649
+ raise_error(error_value, @prev_tokens, @ss)
650
+ end
651
+
626
652
  def self.parse(obj)
627
653
  self.new(obj).parse
628
654
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ddbcli
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.1
4
+ version: 0.2.2
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2013-05-16 00:00:00.000000000 Z
12
+ date: 2013-09-14 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: json