synaptic4r 0.1.6 → 0.1.8

Sign up to get free protection for your applications and to get access to all the features.
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.1.6
1
+ 0.1.8
data/bin/synrest CHANGED
@@ -1,11 +1,10 @@
1
- #!/usr/bin/ruby
1
+ #!/usr/local/bin/ruby
2
2
 
3
3
  ####---------------------------------------------------------------------------------------------------------
4
4
  SYNLIB = "#{File.dirname($0)}/../lib"
5
5
  $:.unshift(SYNLIB) unless $:.include?(SYNLIB)
6
6
 
7
7
  ####---------------------------------------------------------------------------------------------------------
8
- require 'yaml'
9
8
  require 'optparse'
10
9
  require 'synaptic4r'
11
10
  require 'logger'
@@ -61,7 +60,7 @@ def run(cmd, input)
61
60
  {:out => (input[:dump] or input[:payload]) ? dump(cmd, input, result) : result.print, :logger => :info}
62
61
  rescue RestClient::RequestFailed, RestClient::ResourceNotFound, RestClient::Unauthorized,
63
62
  RestClient::NotModified => err
64
- {:out => "#{err.message}\n" + Synaptic4r::RequestError.new(err).print, :logger => :error}
63
+ {:out => "#{err.http_code}\n#{err.message}\n" + Synaptic4r::RequestError.new(err).print, :logger => :error}
65
64
  rescue RestClient::Redirect, RestClient::ServerBrokeConnection, RestClient::RequestTimeout => err
66
65
  {:out => err.message, :logger => :error}
67
66
  rescue ArgumentError => err
@@ -86,7 +85,7 @@ end
86
85
  ####---------------------------------------------------------------------------------------------------------
87
86
  def format_required_args(args)
88
87
  args.inject("") do |f,a|
89
- aname = lambda{|v,l| arg_name(Synaptic4r::Request.rest_arg(v),l)}
88
+ aname = lambda{|v,l| arg_name(Synaptic4r::StorageRequest.rest_arg(v),l)}
90
89
  if a.kind_of?(Array)
91
90
  f + [aname[a.first,false],a[1..-1].map{|v| aname[v,true]}].join('|') + ' '
92
91
  else
@@ -97,7 +96,7 @@ end
97
96
 
98
97
  ####---------------------------------------------------------------------------------------------------------
99
98
  def diagnostic_args(opts, input, cmd)
100
- if Synaptic4r::Request.diagnostics(cmd)
99
+ if Synaptic4r::StorageRequest.diagnostics(cmd)
101
100
  opts.separator "\ndiagnostic options"
102
101
  opts.on('-q', '--dump', 'do not send request but print headers and service url to STDOUT'){|d| input[:dump] = true}
103
102
  opts.on('-p', '--payload', 'do not send request print payload to STDOUT if present'){|p| input[:payload] = true}
@@ -120,7 +119,7 @@ def set_opts(opts, input, opt_args)
120
119
  unless opt_args.empty?
121
120
  opts.separator "\noptions"
122
121
  opt_args.sort_by{|m| m.to_s}.each do |a|
123
- arg_info = Synaptic4r::Request.rest_arg(a)
122
+ arg_info = Synaptic4r::StorageRequest.rest_arg(a)
124
123
  sopt = arg_info[:cli][1]
125
124
  lopt = "--#{arg_info[:cli][0]}" + (arg_info[:cli][2].eql?(:flag) ? '' : " #{arg_info[:cli][0]}")
126
125
  opts.on(sopt, lopt, arg_info[:desc]) do |v|
@@ -133,11 +132,11 @@ end
133
132
  ####---------------------------------------------------------------------------------------------------------
134
133
  def set_args(opts, meths, input, cmd)
135
134
  extract_positional_args(meths, input, cmd)
136
- all_args = Synaptic4r::Request.required_rest_args(cmd)
135
+ all_args = Synaptic4r::StorageRequest.required_rest_args(cmd)
137
136
  fmt = " %-32s %s"
138
137
  unless all_args.empty?
139
138
  opts.separator "\nargs"
140
- arg_row = lambda{|a,l| arg_info = Synaptic4r::Request.rest_arg(a)
139
+ arg_row = lambda{|a,l| arg_info = Synaptic4r::StorageRequest.rest_arg(a)
141
140
  opts.separator fmt % [arg_name(arg_info,l), arg_info[:desc]]}
142
141
  all_args.each do |a|
143
142
  if a.kind_of?(Array)
@@ -173,11 +172,11 @@ end
173
172
 
174
173
  ####---------------------------------------------------------------------------------------------------------
175
174
  def extract_positional_args(meths, input, cmd)
176
- eargs = Synaptic4r::Request.required_rest_args(cmd)
175
+ eargs = Synaptic4r::StorageRequest.required_rest_args(cmd)
177
176
  elength = eargs.length
178
177
  pvals= prep_argv.first(elength)
179
- nvals = if Synaptic4r::Request.map_required_args(cmd)
180
- Synaptic4r::Request.map_required_args(cmd)[pvals]
178
+ nvals = if Synaptic4r::StorageRequest.map_required_args(cmd)
179
+ Synaptic4r::StorageRequest.map_required_args(cmd)[pvals]
181
180
  else
182
181
  {:pvals => pvals, :dlen => 0}
183
182
  end
@@ -200,7 +199,7 @@ end
200
199
 
201
200
  ####---------------------------------------------------------------------------------------------------------
202
201
  def set_positional_args(input, nvals, eargs)
203
- assign_input = lambda{|a,v| info = Synaptic4r::Request.rest_arg(a);
202
+ assign_input = lambda{|a,v| info = Synaptic4r::StorageRequest.rest_arg(a);
204
203
  input[a] = info[:map].nil? ? v : info[:map][v]}
205
204
  length = 0
206
205
  nvals[:pvals].each_index do |i|
@@ -210,7 +209,7 @@ def set_positional_args(input, nvals, eargs)
210
209
  if /^-/.match(pv)
211
210
  matched = false
212
211
  ea[1..-1].each do |a|
213
- info = Synaptic4r::Request.rest_arg(a)
212
+ info = Synaptic4r::StorageRequest.rest_arg(a)
214
213
  flag = info[:cli][1]
215
214
  next unless flag
216
215
  if /^#{flag}/.match(pv)
@@ -246,8 +245,8 @@ end
246
245
 
247
246
  ####---------------------------------------------------------------------------------------------------------
248
247
  def build_banner(opts, cmd)
249
- exp_args = Synaptic4r::Request.required_rest_args(cmd)
250
- opts.banner = Synaptic4r::Request.banner(cmd) || \
248
+ exp_args = Synaptic4r::StorageRequest.required_rest_args(cmd)
249
+ opts.banner = Synaptic4r::StorageRequest.banner(cmd) || \
251
250
  "\nUsage: synrest #{cmd.to_s.gsub(/_/,'-')} #{format_required_args(exp_args)} [options]"
252
251
 
253
252
  end
@@ -256,7 +255,7 @@ end
256
255
  def process_input(opts, meths, input, cmd)
257
256
  build_banner(opts, cmd)
258
257
  set_args(opts, meths, input, cmd)
259
- set_opts(opts, input, Synaptic4r::Request.optional_rest_args(cmd))
258
+ set_opts(opts, input, Synaptic4r::StorageRequest.optional_rest_args(cmd))
260
259
  diagnostic_args(opts, input, cmd)
261
260
  end
262
261
 
@@ -268,7 +267,7 @@ def cmd_help(meths)
268
267
  meths.sort_by{|m| m.to_s}.each do |m|
269
268
  next if m.eql?(:get_started)
270
269
  meth_str = " %-30s" % m.to_s.gsub(/_/,'-')
271
- puts "#{meth_str} #{Synaptic4r::Request.desc(m)}"
270
+ puts "#{meth_str} #{Synaptic4r::StorageRequest.desc(m)}"
272
271
  end
273
272
  puts "\nCommand args and options\n synrest command -h"
274
273
  puts "\nGet Started\n synrest get-started"
@@ -276,7 +275,7 @@ def cmd_help(meths)
276
275
  end
277
276
 
278
277
  ####---------------------------------------------------------------------------------------------------------
279
- meths = Synaptic4r::Request.rest_methods << :get_started
278
+ meths = Synaptic4r::StorageRequest.rest_methods << :get_started
280
279
  input = {}
281
280
  cmd = extract_cmd(meths)
282
281
 
@@ -17,7 +17,7 @@ module Synaptic4r
17
17
  end
18
18
 
19
19
  #.........................................................................................................
20
- attr_reader :uid, :key, :site, :resource, :subtenant
20
+ attr_reader :credentials
21
21
 
22
22
  #.........................................................................................................
23
23
  def initialize(args = nil)
@@ -40,16 +40,13 @@ module Synaptic4r
40
40
  end
41
41
  end
42
42
  unary_args_given?(symbolize(config_params), args.keys)
43
- @subtenant = args[:subtenant]
44
- @uid = args[:uid]
45
- @key = args[:key]
46
- @site = args[:site]
43
+ @credentials= {:subtenant => args[:subtenant], :uid => args[:uid], :key => args[:key], :site => args[:site]}
47
44
  end
48
45
 
49
46
  #.........................................................................................................
50
47
  def method_missing(meth, *args, &blk)
51
- if Request.has_rest_method?(meth)
52
- Request.new(:uid => uid, :subtenant => subtenant, :key => key, :site => site).execute(meth, *args, &blk)
48
+ if StorageRequest.has_rest_method?(meth)
49
+ StorageRequest.new(credentials).execute(meth, *args, &blk)
53
50
  else
54
51
  super
55
52
  end
@@ -2,10 +2,11 @@
2
2
  module Synaptic4r
3
3
 
4
4
  ####------------------------------------------------------------------------------------------------------
5
- class Request
5
+ ####------------------------------------------------------------------------------------------------------
6
+ class StorageRequest
6
7
 
7
8
  ####------------------------------------------------------------------------------------------------------
8
- include Rest
9
+ include StorageRest
9
10
 
10
11
 
11
12
  #.......................................................................................................
@@ -288,7 +289,7 @@ module Synaptic4r
288
289
  end
289
290
 
290
291
 
291
- #### Request
292
+ #### SorageRequest
292
293
  end
293
294
 
294
295
  #### Synaptic4r
@@ -28,8 +28,9 @@ module Synaptic4r
28
28
  case file
29
29
  when String
30
30
  IO.read(file, length, offset)
31
- else
32
- file.read
31
+ else
32
+ file.seek(offset)
33
+ file.read(length)
33
34
  end
34
35
  end
35
36
 
@@ -37,7 +38,7 @@ module Synaptic4r
37
38
  end
38
39
 
39
40
  ###########################################################################################################
40
- module Rest
41
+ module StorageRest
41
42
 
42
43
  #------------------------------------------------------------------------------------------------------
43
44
  class << self
@@ -202,12 +203,12 @@ module Synaptic4r
202
203
  attr_reader :headers, :uid, :key, :site, :subtenant, :payload, :meth, :sign, :url
203
204
 
204
205
  #.......................................................................................................
205
- def initialize(args)
206
- unary_args_given?([:uid, :subtenant, :key, :site], args)
207
- @uid = args[:uid]
208
- @key = args[:key]
209
- @site = args[:site]
210
- @subtenant = args[:subtenant]
206
+ def initialize(cred)
207
+ unary_args_given?([:uid, :subtenant, :key, :site], cred)
208
+ @uid = cred[:uid]
209
+ @key = cred[:key]
210
+ @site = cred[:site]
211
+ @subtenant = cred[:subtenant]
211
212
  @headers = credentials
212
213
  end
213
214
 
@@ -364,7 +365,7 @@ module Synaptic4r
364
365
  end
365
366
 
366
367
 
367
- ### Rest
368
+ ### Storage Rest
368
369
  end
369
370
 
370
371
  #### Synaptic4r
@@ -327,16 +327,16 @@ module Synaptic4r
327
327
 
328
328
  #.......................................................................................................
329
329
  def code
330
- @err.elements.to_a('Code').first.text
330
+ @err.elements.to_a('Code').first.text if @err.elements.to_a('Code').first
331
331
  end
332
332
 
333
333
  #.......................................................................................................
334
334
  def message
335
- @err.elements.to_a('Message').first.text
335
+ @err.elements.to_a('Message').first.text if @err.elements.to_a('Message').first
336
336
  end
337
337
 
338
338
  #.......................................................................................................
339
- def print
339
+ def print
340
340
  @err.nil? ? '' : "#{code}: #{message}"
341
341
  end
342
342
 
data/lib/synaptic4r.rb CHANGED
@@ -4,6 +4,7 @@ require 'time'
4
4
  require 'uri'
5
5
  require 'openssl'
6
6
  require 'digest'
7
+ require 'yaml'
7
8
  require 'rexml/document'
8
9
 
9
10
  require 'rubygems'
data/synaptic4r.gemspec CHANGED
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{synaptic4r}
8
- s.version = "0.1.6"
8
+ s.version = "0.1.8"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["troystribling-att"]
12
- s.date = %q{2009-12-02}
12
+ s.date = %q{2010-03-23}
13
13
  s.default_executable = %q{synrest}
14
14
  s.email = %q{troy.stribling@usi.com}
15
15
  s.executables = ["synrest"]
@@ -49,15 +49,15 @@ Gem::Specification.new do |s|
49
49
  s.rubygems_version = %q{1.3.5}
50
50
  s.summary = %q{CLI and Ruby REST Client for ATT Synaptic Storage}
51
51
  s.test_files = [
52
- "test/get_messages.rb",
53
- "test/create_file_messages.rb",
52
+ "test/create_dir_test.rb",
54
53
  "test/get_test.rb",
54
+ "test/create_file_messages.rb",
55
+ "test/mock.rb",
56
+ "test/matchers.rb",
55
57
  "test/create_dir_messages.rb",
56
- "test/helper.rb",
57
- "test/create_dir_test.rb",
58
+ "test/get_messages.rb",
58
59
  "test/create_file_test.rb",
59
- "test/mock.rb",
60
- "test/matchers.rb"
60
+ "test/helper.rb"
61
61
  ]
62
62
 
63
63
  if s.respond_to? :specification_version then
@@ -15,7 +15,6 @@ class CreateDirTest < Test::Unit::TestCase
15
15
  @client.create_dir(a).should send_request(CreateDirMessages.request(a))
16
16
  end
17
17
 
18
-
19
18
  #.........................................................................................................
20
19
  should "return OID, location and creation date for created directory" do
21
20
  a = @args.merge({:rpath=>'newdir'})
@@ -8,34 +8,51 @@ module CreateFileMessages
8
8
  class << self
9
9
 
10
10
  #......................................................................................................
11
- attr_reader :oid, :date, :full_payload, :partial_payload, :full_size
11
+ attr_reader :oid, :date, :payload
12
12
  attr_accessor :response_method
13
13
 
14
14
  #......................................................................................................
15
15
  def namespace_request(args)
16
- full_payload = args[:file].kind_of?(String) ? IO.read(args[:file]) : (args[:file].rewind; args[:file].read)
17
- @full_size = full_payload.length
18
- full_content_md5 = Base64.encode64(Digest::MD5.digest(full_payload)).chomp()
16
+ payload = args[:file].kind_of?(String) ? IO.read(args[:file]) : (args[:file].rewind; args[:file].read)
17
+ size = payload.length
18
+ content_md5 = Base64.encode64(Digest::MD5.digest(payload)).chomp()
19
19
  {:url => "#{args[:site]}/namespace/#{args[:rpath]}",
20
20
  :http_request => :post,
21
- :headers => {'content-length' => full_size,
22
- 'content-md5' => full_content_md5,
21
+ :headers => {'content-length' => size,
22
+ 'content-md5' => content_md5,
23
23
  'content-type' => 'application/octet-stream'},
24
- :payload => full_payload}
24
+ :payload => payload}
25
+ end
26
+
27
+ #......................................................................................................
28
+ def namespace_partial_request(args)
29
+ size = args[:create_endoffset] - args[:create_beginoffset] + 1
30
+ payload = if args[:file].kind_of?(String)
31
+ IO.read(args[:file], length, args[:create_beginoffset])
32
+ else
33
+ args[:file].rewind; args[:file].seek(args[:create_beginoffset]); args[:file].read(size)
34
+ end
35
+ content_md5 = Base64.encode64(Digest::MD5.digest(payload)).chomp()
36
+ {:url => "#{args[:site]}/namespace/#{args[:rpath]}",
37
+ :http_request => :post,
38
+ :headers => {'content-length' => size,
39
+ 'content-md5' => content_md5,
40
+ 'content-type' => 'application/octet-stream'},
41
+ :payload => payload}
25
42
  end
26
43
 
27
44
  #......................................................................................................
28
45
  def listable_metadata_request(args)
29
- full_payload = IO.read(args[:file])
30
- @full_size = full_payload.length
31
- full_content_md5 = Base64.encode64(Digest::MD5.digest(full_payload)).chomp()
46
+ payload = IO.read(args[:file])
47
+ size = payload.length
48
+ content_md5 = Base64.encode64(Digest::MD5.digest(payload)).chomp()
32
49
  {:url => "#{args[:site]}/objects",
33
50
  :http_request => :post,
34
- :headers => {'content-length' => full_size,
35
- 'content-md5' => full_content_md5,
51
+ :headers => {'content-length' => size,
52
+ 'content-md5' => content_md5,
36
53
  'x-emc-listable-meta' => args[:listable_meta],
37
54
  'content-type' => 'application/octet-stream'},
38
- :payload => full_payload}
55
+ :payload => payload}
39
56
  end
40
57
 
41
58
  #......................................................................................................
@@ -45,7 +62,7 @@ module CreateFileMessages
45
62
 
46
63
  #......................................................................................................
47
64
  def file_response(args)
48
- HttpMessages::Result.new(:headers=> {:x_emc_delta => full_size,
65
+ HttpMessages::Result.new(:headers=> {:x_emc_delta => size,
49
66
  :date => date,
50
67
  :content_type => "text/plain; charset=UTF-8",
51
68
  :location => "/rest/objects/#{oid}"},
@@ -24,10 +24,10 @@ class CreateFileTest < Test::Unit::TestCase
24
24
  end
25
25
 
26
26
  #.........................................................................................................
27
- should "build request to create file with specified name and read entire file from disk when file IO object specified" do
27
+ should "build request to create file with specified name and read entire file from disk when local file IO object specified" do
28
28
  CreateFileMessages.response_method = :file_response
29
- full_payload = File.new('test/test.txt')
30
- a = @args.merge({:rpath=>'test.text', :file => full_payload, :payload => true})
29
+ payload = File.new('test/test.txt')
30
+ a = @args.merge({:rpath=>'test.text', :file => payload, :payload => true})
31
31
  @client.create_file(a).should send_request(CreateFileMessages.namespace_request(a))
32
32
  end
33
33
 
@@ -39,7 +39,32 @@ class CreateFileTest < Test::Unit::TestCase
39
39
  res[:oid].should be(CreateFileMessages.oid)
40
40
  res[:location].should be("/rest/objects/#{CreateFileMessages.oid}")
41
41
  res[:date].should be(CreateFileMessages.date)
42
- res[:size].should be(CreateFileMessages.full_size)
42
+ res[:size].should be(File.size('test/test.txt'))
43
+ end
44
+
45
+ #.........................................................................................................
46
+ should "build request to create file with specified name and read a portion file from disk when local file name is specified" do
47
+ CreateFileMessages.response_method = :file_response
48
+ a = @args.merge({:rpath=>'test.text', :file => 'test/test.txt', :payload => true, :create_beginoffset => 10, :create_endoffset => 20})
49
+ @client.create_file(a).should send_request(CreateFileMessages.namespace_request(a))
50
+ end
51
+
52
+ #.........................................................................................................
53
+ should "build request to create file with specified name and read a portion file from disk when local file IO object is specified" do
54
+ CreateFileMessages.response_method = :file_response
55
+ a = @args.merge({:rpath=>'test.text', :file => 'test/test.txt', :payload => true, :create_beginoffset => 10, :create_endoffset => 20})
56
+ @client.create_file(a).should send_request(CreateFileMessages.namespace_request(a))
57
+ end
58
+
59
+ #.........................................................................................................
60
+ should "return OID, location and creation date for created file when partial file is uploaded" do
61
+ CreateFileMessages.response_method = :file_response
62
+ a = @args.merge({:listable_meta=>'test', :file => 'test/test.txt', :payload => true, :create_beginoffset => 10, :create_endoffset => 20})
63
+ res = @client.create_file(a)
64
+ res[:oid].should be(CreateFileMessages.oid)
65
+ res[:location].should be("/rest/objects/#{CreateFileMessages.oid}")
66
+ res[:date].should be(CreateFileMessages.date)
67
+ res[:size].should be(args[:create_endoffset] - args[:create_beginoffset] + 1)
43
68
  end
44
69
 
45
70
  end
data/test/mock.rb CHANGED
@@ -11,7 +11,7 @@ module Synaptic4r
11
11
 
12
12
  #......................................................................................................
13
13
  def to_message_class(meth)
14
- eval("#{meth.to_s.split('_').collect{|s| s.capitalize}.join}Messages")
14
+ eval("#{meth.to_s.split('_').map{|s| s.capitalize}.join}Messages")
15
15
  end
16
16
 
17
17
  ### Rest
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: synaptic4r
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.6
4
+ version: 0.1.8
5
5
  platform: ruby
6
6
  authors:
7
7
  - troystribling-att
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2009-12-02 00:00:00 -05:00
12
+ date: 2010-03-23 00:00:00 -04:00
13
13
  default_executable: synrest
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
@@ -85,12 +85,12 @@ signing_key:
85
85
  specification_version: 3
86
86
  summary: CLI and Ruby REST Client for ATT Synaptic Storage
87
87
  test_files:
88
- - test/get_messages.rb
89
- - test/create_file_messages.rb
90
- - test/get_test.rb
91
- - test/create_dir_messages.rb
92
- - test/helper.rb
93
88
  - test/create_dir_test.rb
94
- - test/create_file_test.rb
89
+ - test/get_test.rb
90
+ - test/create_file_messages.rb
95
91
  - test/mock.rb
96
92
  - test/matchers.rb
93
+ - test/create_dir_messages.rb
94
+ - test/get_messages.rb
95
+ - test/create_file_test.rb
96
+ - test/helper.rb