sdbcli 0.3.9 → 0.4.0

Sign up to get free protection for your applications and to get access to all the features.
data/README CHANGED
@@ -17,6 +17,7 @@ https://bitbucket.org/winebarrel/sdbcli
17
17
  -s, --secret-key=SECRET_KEY
18
18
  -r, --region=REGION
19
19
  -e, --eval=COMMAND
20
+ -f, --format=YAML_OR_JSON
20
21
  shell> export AWS_ACCESS_KEY_ID='...'
21
22
  shell> export AWS_SECRET_ACCESS_KEY='...'
22
23
  shell> export SDB_ENDPOINT='sdb.ap-northeast-1.amazonaws.com' # or REGION_NAME=ap-northeast-1
@@ -24,6 +25,11 @@ https://bitbucket.org/winebarrel/sdbcli
24
25
  ---
25
26
  - test
26
27
  - test-2
28
+ shell> sdbcli -f json -e 'show domains'
29
+ [
30
+ "test",
31
+ "test-2"
32
+ ]
27
33
  shell> sdbcli # show prompt
28
34
 
29
35
  == Example
data/bin/sdbcli CHANGED
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env ruby
2
2
  $LOAD_PATH << File.join(File.expand_path(File.dirname(__FILE__)), '..', 'lib')
3
3
 
4
- Version = '0.3.9'
4
+ Version = '0.4.0'
5
5
  HISTORY_FILE = File.join((ENV['HOME'] || ENV['USERPROFILE'] || '.'), '.sdbcli_history')
6
6
  HISTSIZE = 500
7
7
 
@@ -13,17 +13,20 @@ require 'readline'
13
13
  require 'strscan'
14
14
  require 'syck' if /\A1\.9/ =~ RUBY_VERSION
15
15
  require 'yaml'
16
+ require 'json'
16
17
 
17
18
  access_key_id = ENV['AWS_ACCESS_KEY_ID']
18
19
  secret_access_key = ENV['AWS_SECRET_ACCESS_KEY']
19
20
  sdb_endpoint = ENV['SDB_ENDPOINT'] || ENV['REGION_NAME'] || 'sdb.amazonaws.com'
20
21
  command = nil
22
+ $format = :yaml
21
23
 
22
24
  ARGV.options do |opt|
23
25
  opt.on('-k', '--access-key=ACCESS_KEY') {|v| access_key_id = v }
24
26
  opt.on('-s', '--secret-key=SECRET_KEY') {|v| secret_access_key = v }
25
27
  opt.on('-r', '--region=REGION') {|v| sdb_endpoint = v }
26
28
  opt.on('-e', '--eval=COMMAND') {|v| command = v }
29
+ opt.on('-f', '--format=YAML_OR_JSON', [:yaml, :json]) {|v| $format = v }
27
30
  opt.parse!
28
31
 
29
32
  unless access_key_id and secret_access_key and sdb_endpoint
@@ -35,7 +38,16 @@ end
35
38
  $runner = SimpleDB::Runner.new(access_key_id, secret_access_key, sdb_endpoint)
36
39
 
37
40
  def output_error(msg)
38
- $stderr.puts "# #{msg}\n\n"
41
+ case $format
42
+ when :yaml
43
+ msg = "# #{msg}\n\n"
44
+ when :json
45
+ msg = "// #{msg}\n\n"
46
+ else
47
+ msg = "# #{msg}\n\n"
48
+ end
49
+
50
+ $stderr.puts msg
39
51
  end
40
52
 
41
53
  def execute(src, show_rows = false)
@@ -76,10 +88,32 @@ def execute(src, show_rows = false)
76
88
  out = $runner.execute(query, inline)
77
89
 
78
90
  if out
79
- str = YAML.dump(out).sub(/(?:\r\n|\r|\n)*\Z/, "\n")
91
+ str = nil
92
+
93
+ case $format
94
+ when :yaml
95
+ str = YAML.dump(out)
96
+ when :json
97
+ str = JSON.pretty_generate(out)
98
+ else
99
+ output_error('Unknown format')
100
+ end
101
+
102
+ str.sub!(/(?:\r\n|\r|\n)*\Z/, "\n")
80
103
 
81
104
  if show_rows and out.kind_of?(Array)
82
- str << "# #{out.length} #{out.length > 1 ? 'rows' : 'row'} in set\n"
105
+ rows_msg = nil
106
+
107
+ case $format
108
+ when :yaml
109
+ rows_msg = "# #{out.length} #{out.length > 1 ? 'rows' : 'row'} in set\n"
110
+ when :json
111
+ rows_msg = "// #{out.length} #{out.length > 1 ? 'rows' : 'row'} in set\n"
112
+ else
113
+ rows_msg = "# #{out.length} #{out.length > 1 ? 'rows' : 'row'} in set\n"
114
+ end
115
+
116
+ str << rows_msg
83
117
  end
84
118
 
85
119
  str << "\n"
metadata CHANGED
@@ -1,87 +1,85 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: sdbcli
3
- version: !ruby/object:Gem::Version
4
- hash: 1
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.4.0
5
5
  prerelease:
6
- segments:
7
- - 0
8
- - 3
9
- - 9
10
- version: 0.3.9
11
6
  platform: ruby
12
- authors:
7
+ authors:
13
8
  - winebarrel
14
9
  autorequire:
15
10
  bindir: bin
16
11
  cert_chain: []
17
-
18
- date: 2013-01-21 00:00:00 Z
19
- dependencies:
20
- - !ruby/object:Gem::Dependency
12
+ date: 2013-01-21 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
21
15
  name: nokogiri
16
+ requirement: !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: '0'
22
+ type: :runtime
22
23
  prerelease: false
23
- requirement: &id001 !ruby/object:Gem::Requirement
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ! '>='
28
+ - !ruby/object:Gem::Version
29
+ version: '0'
30
+ - !ruby/object:Gem::Dependency
31
+ name: json
32
+ requirement: !ruby/object:Gem::Requirement
24
33
  none: false
25
- requirements:
26
- - - ">="
27
- - !ruby/object:Gem::Version
28
- hash: 3
29
- segments:
30
- - 0
31
- version: "0"
34
+ requirements:
35
+ - - ! '>='
36
+ - !ruby/object:Gem::Version
37
+ version: '0'
32
38
  type: :runtime
33
- version_requirements: *id001
39
+ prerelease: false
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ! '>='
44
+ - !ruby/object:Gem::Version
45
+ version: '0'
34
46
  description:
35
47
  email: sgwr_dts@yahoo.co.jp
36
- executables:
48
+ executables:
37
49
  - sdbcli
38
50
  extensions: []
39
-
40
51
  extra_rdoc_files: []
41
-
42
- files:
52
+ files:
43
53
  - README
44
54
  - bin/sdbcli
45
- - bin/sdbcli.orig
46
55
  - lib/sdbcli/sdb-client.rb
47
56
  - lib/sdbcli/sdb-driver.rb
48
57
  - lib/sdbcli/sdb-parser.tab.rb
49
58
  - lib/sdbcli/sdb-parser.y
50
59
  - lib/sdbcli/sdb-runner.rb
51
- - lib/sdbcli/sdb-runner.rb.orig
52
60
  - lib/sdbcli.rb
53
61
  homepage: https://bitbucket.org/winebarrel/sdbcli
54
62
  licenses: []
55
-
56
63
  post_install_message:
57
64
  rdoc_options: []
58
-
59
- require_paths:
65
+ require_paths:
60
66
  - lib
61
- required_ruby_version: !ruby/object:Gem::Requirement
67
+ required_ruby_version: !ruby/object:Gem::Requirement
62
68
  none: false
63
- requirements:
64
- - - ">="
65
- - !ruby/object:Gem::Version
66
- hash: 3
67
- segments:
68
- - 0
69
- version: "0"
70
- required_rubygems_version: !ruby/object:Gem::Requirement
69
+ requirements:
70
+ - - ! '>='
71
+ - !ruby/object:Gem::Version
72
+ version: '0'
73
+ required_rubygems_version: !ruby/object:Gem::Requirement
71
74
  none: false
72
- requirements:
73
- - - ">="
74
- - !ruby/object:Gem::Version
75
- hash: 3
76
- segments:
77
- - 0
78
- version: "0"
75
+ requirements:
76
+ - - ! '>='
77
+ - !ruby/object:Gem::Version
78
+ version: '0'
79
79
  requirements: []
80
-
81
80
  rubyforge_project:
82
- rubygems_version: 1.8.24
81
+ rubygems_version: 1.8.23
83
82
  signing_key:
84
83
  specification_version: 3
85
84
  summary: sdbcli is an interactive command-line client of Amazon SimpleDB.
86
85
  test_files: []
87
-
data/bin/sdbcli.orig DELETED
@@ -1,188 +0,0 @@
1
- #!/usr/bin/env ruby
2
- $LOAD_PATH << File.join(File.expand_path(File.dirname(__FILE__)), '..', 'lib')
3
-
4
- Version = '0.3.8'
5
- HISTORY_FILE = File.join((ENV['HOME'] || ENV['USERPROFILE'] || '.'), '.sdbcli_history')
6
- HISTSIZE = 500
7
-
8
- require 'rubygems'
9
- require 'sdbcli'
10
-
11
- require 'optparse'
12
- require 'readline'
13
- require 'strscan'
14
- require 'syck' if /\A1\.9/ =~ RUBY_VERSION
15
- require 'yaml'
16
-
17
- access_key_id = ENV['AWS_ACCESS_KEY_ID']
18
- secret_access_key = ENV['AWS_SECRET_ACCESS_KEY']
19
- sdb_endpoint = ENV['SDB_ENDPOINT'] || ENV['REGION_NAME'] || 'sdb.amazonaws.com'
20
- command = nil
21
-
22
- ARGV.options do |opt|
23
- opt.on('-k', '--access-key=ACCESS_KEY') {|v| access_key_id = v }
24
- opt.on('-s', '--secret-key=SECRET_KEY') {|v| secret_access_key = v }
25
- opt.on('-r', '--region=REGION') {|v| sdb_endpoint = v }
26
- opt.on('-e', '--eval=COMMAND') {|v| command = v }
27
- opt.parse!
28
-
29
- unless access_key_id and secret_access_key and sdb_endpoint
30
- puts opt.help
31
- exit 1
32
- end
33
- end
34
-
35
- $runner = SimpleDB::Runner.new(access_key_id, secret_access_key, sdb_endpoint)
36
-
37
- def output_error(msg)
38
- $stderr.puts "# #{msg}\n\n"
39
- end
40
-
41
- def execute(src, show_rows = false)
42
- ss = StringScanner.new(src.gsub(%r{/\*/?(?:(?:\r\n|\r|\n)|[^/]|[^*]/)*\*/}m, ''))
43
-
44
- while query = ss.scan_until(/(?:;|\\G)/i)
45
- src.replace(ss.rest.strip)
46
- query.strip!
47
-
48
- if query =~ /\s*\\G\Z/i
49
- query = query.sub(/\s*\\G\Z/i, '')
50
- inline = false
51
- else
52
- query = query.strip.sub(/\s*;\Z/, '')
53
- inline = true
54
- end
55
-
56
- if query.empty?
57
- output_error('No query specified')
58
- next
59
- end
60
-
61
- out = $runner.execute(query, inline)
62
-
63
- if out
64
- str = YAML.dump(out).sub(/(?:\r\n|\r|\n)*\Z/, "\n")
65
-
66
- if show_rows and out.kind_of?(Array)
67
- str << "# #{out.length} rows in set\n"
68
- end
69
-
70
- str << "\n"
71
- puts str
72
- end
73
- end
74
-
75
- ss.rest.strip
76
- end
77
-
78
- if not $stdin.tty? or command
79
- src = command || $stdin.read.strip
80
-
81
- unless src =~ /\s*(?:;|\\G)\Z/i
82
- src << ';'
83
- end
84
-
85
- begin
86
- execute(src)
87
- exit 0
88
- rescue => e
89
- output_error e.message.strip
90
- exit 1
91
- end
92
- end
93
-
94
- def help
95
- <<-EOS
96
- SHOW DOMAINS
97
- displays a domain list
98
-
99
- SHOW REGIONS
100
- displays a region list
101
-
102
- CREATE domain domain_name
103
- creates a domain
104
-
105
- DROP DOMAIN domain_name
106
- deletes a domain
107
-
108
- GET [attr_list] FROM domain_name WHERE itemName = '...'
109
- gets the attribute of an item
110
-
111
- INSERT INTO domain_name (itemName, attr1, ...) VALUES ('name', 'val1', ...)
112
- creates an item
113
-
114
- UPDATE domain_name set attr1 = 'val1', ... WHERE itemName = '...'
115
- updates an item
116
-
117
- DELETE [attr1, ...] FROM domain_name WHERE itemName = '...'
118
- deletes the attribute of an item or an item
119
-
120
- SELECT output_list FROM domain_name [WHERE expression] [sort_instructions] [LIMIT limit]
121
- queries using the SELECT statement
122
- see http://docs.aws.amazon.com/AmazonSimpleDB/latest/DeveloperGuide/UsingSelect.html
123
-
124
- DESC domain_name
125
- displays information about the domain
126
-
127
- USE region_or_endpoint
128
- changes an endpoint
129
-
130
- EOS
131
- end
132
-
133
- if File.exist?(HISTORY_FILE)
134
- open(HISTORY_FILE) do |f|
135
- f.each_line do |line|
136
- line = line.strip
137
- Readline::HISTORY.push(line) unless line.empty?
138
- end
139
- end
140
- end
141
-
142
- at_exit do
143
- unless Readline::HISTORY.empty?
144
- open(HISTORY_FILE, 'wb') do |f|
145
- (Readline::HISTORY.to_a.slice(-(Readline::HISTORY.length < HISTSIZE ? Readline::HISTORY.length : HISTSIZE)..-1) || []).each do |line|
146
- next if /\A\s*\Z/ =~ line
147
- f.puts line
148
- end
149
- end
150
- end
151
- end
152
-
153
- src = ''
154
- prompt1 = lambda { "#{$runner.region || 'unknown'}> " }
155
- prompt2 = lambda { "#{' ' * (($runner.region || 'unknown').length - 1)}-> " }
156
- prompt = prompt1.call
157
-
158
- while buf = Readline.readline(prompt, true)
159
- if /\A\s*\Z/ =~ buf
160
- Readline::HISTORY.pop
161
- next
162
- end
163
-
164
- if src.empty? and buf =~ /\A\.(.+)/
165
- r = /\A#{Regexp.compile($1.downcase)}/
166
-
167
- if r =~ 'help'
168
- puts help
169
- elsif r =~ 'exit' or r =~ 'quit'
170
- exit
171
- elsif r =~ 'version'
172
- puts "sdbcli #{Version}"
173
- else
174
- output_error('Unknown command')
175
- end
176
- else
177
- rv = nil
178
-
179
- begin
180
- src << (' ' + buf)
181
- execute(src, true)
182
- rescue => e
183
- output_error e.message.strip
184
- end
185
-
186
- prompt = src.empty? ? prompt1.call : prompt2.call
187
- end
188
- end
@@ -1,109 +0,0 @@
1
- require 'sdbcli/sdb-driver'
2
- require 'sdbcli/sdb-parser.tab'
3
-
4
- module SimpleDB
5
- class Error < StandardError; end
6
-
7
- REGIONS = {
8
- 'sdb.amazonaws.com' => 'us-east-1',
9
- 'sdb.us-west-1.amazonaws.com' => 'us-west-1',
10
- 'sdb.us-west-2.amazonaws.com' => 'us-west-2',
11
- 'sdb.eu-west-1.amazonaws.com' => 'eu-west-1',
12
- 'sdb.ap-southeast-1.amazonaws.com' => 'ap-southeast-1',
13
- 'sdb.ap-southeast-2.amazonaws.com' => 'ap-southeast-2',
14
- 'sdb.ap-northeast-1.amazonaws.com' => 'ap-northeast-1',
15
- 'sdb.sa-east-1.amazonaws.com' => 'sa-east-1',
16
- }
17
-
18
- class Runner
19
- def initialize(accessKeyId, secretAccessKey, endpoint = 'sdb.amazonaws.com')
20
- endpoint = region_to_endpoint(endpoint)
21
- @driver = Driver.new(accessKeyId, secretAccessKey, endpoint)
22
- end
23
-
24
- def endpoint
25
- @driver.endpoint
26
- end
27
-
28
- def endpoint=(v)
29
- v = region_to_endpoint(v)
30
- @driver.endpoint = v
31
- end
32
-
33
- def region
34
- REGIONS[endpoint]
35
- end
36
-
37
- def execute(query, inline = true)
38
- parsed = Parser.parse(query)
39
- p parsed
40
- command = parsed.class.name.split('::').last.to_sym
41
-
42
- case command
43
- when :GET
44
- item = @driver.get(parsed.domain, parsed.item_name, parsed.attr_names)
45
-
46
- if inline
47
- def item.to_yaml_style; :inline; end
48
- end
49
-
50
- item
51
- when :INSERT
52
- @driver.insert(parsed.domain, parsed.item_name, parsed.attrs)
53
- nil
54
- when :UPDATE
55
- @driver.update(parsed.domain, parsed.items)
56
- nil
57
- when :DELETE
58
- @driver.delete(parsed.domain, parsed.items)
59
- nil
60
- when :SELECT
61
- items = @driver.select(parsed.query)
62
-
63
- if inline
64
- items.each do |item|
65
- def item.to_yaml_style; :inline; end
66
- end
67
- end
68
-
69
- items
70
- when :CREATE
71
- @driver.create_domain(parsed.domain)
72
- nil
73
- when :DROP
74
- @driver.drop_domain(parsed.domain)
75
- nil
76
- when :SHOW
77
- case parsed.operand
78
- when :domains
79
- @driver.show_domains
80
- when :regions
81
- SimpleDB::REGIONS.values.sort
82
- else
83
- raise 'must not happen'
84
- end
85
- when :USE
86
- self.endpoint = parsed.endpoint
87
- nil
88
- when :DESCRIBE
89
- @driver.describe(parsed.domain)
90
- else
91
- raise 'must not happen'
92
- end
93
- end
94
-
95
- private
96
-
97
- def region_to_endpoint(region)
98
- if /\A[^.]+\Z/ =~ region
99
- region = SimpleDB::REGIONS.find {|k, v| v == region }
100
- raise SimpleDB::Error, 'Unknown region' unless region
101
- region = region.first
102
- end
103
-
104
- raise SimpleDB::Error, 'Unknown endpoint' unless SimpleDB::REGIONS[region]
105
-
106
- return region
107
- end
108
- end # Runner
109
- end # SimpleDB