sdbcli 0.3.9 → 0.4.0

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