synaptic4r 0.1.6 → 0.1.8

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