ddbcli 0.2.1 → 0.2.2

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.
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