s33r 0.2 → 0.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (71) hide show
  1. data/bin/s3cli.rb +25 -16
  2. data/html/classes/MIME.html +120 -0
  3. data/html/classes/MIME/InvalidContentType.html +119 -0
  4. data/html/classes/MIME/Type.html +1173 -0
  5. data/html/classes/MIME/Types.html +566 -0
  6. data/html/classes/Net.html +108 -0
  7. data/html/classes/Net/HTTPGenericRequest.html +233 -0
  8. data/html/classes/Net/HTTPResponse.html +242 -0
  9. data/html/classes/S33r.html +743 -0
  10. data/html/classes/S33r/BucketListing.html +372 -0
  11. data/html/classes/S33r/Client.html +981 -0
  12. data/html/classes/S33r/NamedBucket.html +620 -0
  13. data/html/classes/S33r/S33rException.html +118 -0
  14. data/html/classes/S33r/S33rException/BucketListingMaxKeysError.html +111 -0
  15. data/html/classes/S33r/S33rException/InvalidBucketListing.html +111 -0
  16. data/html/classes/S33r/S33rException/MalformedBucketName.html +111 -0
  17. data/html/classes/S33r/S33rException/MethodNotAvailable.html +111 -0
  18. data/html/classes/S33r/S33rException/MissingRequiredHeaders.html +111 -0
  19. data/html/classes/S33r/S33rException/MissingResource.html +111 -0
  20. data/html/classes/S33r/S33rException/UnsupportedCannedACL.html +111 -0
  21. data/html/classes/S33r/S33rException/UnsupportedHTTPMethod.html +111 -0
  22. data/html/classes/S33r/S3Object.html +307 -0
  23. data/html/classes/S33r/S3User.html +171 -0
  24. data/html/classes/S33r/Sync.html +151 -0
  25. data/html/classes/XML.html +200 -0
  26. data/html/classes/XML/Document.html +125 -0
  27. data/html/classes/XML/Node.html +124 -0
  28. data/html/created.rid +1 -0
  29. data/html/files/CHANGELOG.html +101 -0
  30. data/html/files/MIT-LICENSE.html +129 -0
  31. data/html/files/README_txt.html +209 -0
  32. data/html/files/lib/s33r/bucket_listing_rb.html +116 -0
  33. data/html/files/lib/s33r/client_rb.html +110 -0
  34. data/html/files/lib/s33r/core_rb.html +113 -0
  35. data/html/files/lib/s33r/libxml_extensions_rb.html +107 -0
  36. data/html/files/lib/s33r/mimetypes_rb.html +120 -0
  37. data/html/files/lib/s33r/named_bucket_rb.html +101 -0
  38. data/html/files/lib/s33r/s33r_exception_rb.html +101 -0
  39. data/html/files/lib/s33r/s33r_http_rb.html +108 -0
  40. data/html/files/lib/s33r/sync_rb.html +101 -0
  41. data/html/files/lib/s33r_rb.html +101 -0
  42. data/html/fr_class_index.html +52 -0
  43. data/html/fr_file_index.html +39 -0
  44. data/html/fr_method_index.html +126 -0
  45. data/html/index.html +24 -0
  46. data/html/rdoc-style.css +208 -0
  47. data/lib/s33r/bucket_listing.rb +69 -60
  48. data/lib/s33r/client.rb +150 -73
  49. data/lib/s33r/core.rb +56 -44
  50. data/lib/s33r/libxml_extensions.rb +10 -5
  51. data/lib/s33r/mimetypes.rb +3 -2
  52. data/lib/s33r/named_bucket.rb +89 -24
  53. data/lib/s33r/{s3_exception.rb → s33r_exception.rb} +2 -2
  54. data/lib/s33r/{net_http_overrides.rb → s33r_http.rb} +29 -21
  55. data/lib/s33r/sync.rb +4 -2
  56. data/test/cases/spec_bucket_listing.rb +10 -13
  57. data/test/cases/spec_client.rb +65 -0
  58. data/test/cases/spec_core.rb +16 -11
  59. data/test/cases/spec_namedbucket.rb +32 -0
  60. data/test/cases/spec_sync.rb +6 -5
  61. data/test/cases/spec_xml.rb +1 -1
  62. data/test/files/client_config.yml +6 -0
  63. data/test/files/namedbucket_config.yml +12 -0
  64. data/test/{s3_test_constants.rb → test_setup.rb} +7 -6
  65. metadata +63 -11
  66. data/LICENSE.txt +0 -22
  67. data/MIT-LICENSE +0 -21
  68. data/README.txt +0 -19
  69. data/bin/config.yml +0 -5
  70. data/test/cases/unit_client.rb +0 -40
  71. data/test/cases/unit_named_bucket.rb +0 -12
@@ -1,7 +1,9 @@
1
- module S3
1
+ module S33r
2
+ # Woefully incomplete module for performing sync operations.
3
+ # Aim is to enable s33r to compare files on the filesystem to S3 objects.
2
4
  module Sync
3
5
 
4
- # get the MD5 checksum for a file (comparable to the ETag on S3 objects)
6
+ # Get the MD5 checksum for a file (comparable to the ETag on S3 objects).
5
7
  def md5sum(filename)
6
8
  f = File.open(filename).binmode
7
9
  OpenSSL::Digest::MD5.hexdigest(f.read)
@@ -1,8 +1,8 @@
1
1
  base = File.dirname(__FILE__)
2
- require base + '/../s3_test_constants'
2
+ require base + '/../test_setup'
3
3
  require 'set'
4
4
 
5
- context 'S3 bucket listing' do
5
+ context 'S33r bucket listing' do
6
6
  setup do
7
7
  xml_file = File.join(base, '../files/bucket_listing.xml')
8
8
  @with_bucket_listing_xml = File.open(xml_file) { |f| f.read }
@@ -12,6 +12,7 @@ context 'S3 bucket listing' do
12
12
  @with_empty_bucket_listing_xml = File.open(xml_file3) { |f| f.read }
13
13
  xml_file4 = File.join(base, '../files/bucket_listing_broken.xml')
14
14
  @with_broken_bucket_listing_xml = File.open(xml_file4) { |f| f.read }
15
+
15
16
  @bucket_listing = BucketListing.new(@with_bucket_listing_xml)
16
17
  @bucket_properties = %w(name prefix marker max_keys is_truncated)
17
18
  @bucket_property_setters = @bucket_properties.map { |prop| prop + "=" }
@@ -22,21 +23,17 @@ context 'S3 bucket listing' do
22
23
  end
23
24
 
24
25
  specify 'cannot be created from invalid XML' do
25
- lambda { BucketListing.new(nil) }.should.raise S3Exception::InvalidBucketListing
26
+ lambda { BucketListing.new(nil) }.should.raise S33rException::InvalidBucketListing
26
27
  end
27
28
 
28
29
  specify 'should recover gracefully from broken bucket listing XML' do
29
- lambda { BucketListing.new(@with_broken_bucket_listing_xml) }.should.raise S3Exception::InvalidBucketListing
30
+ lambda { BucketListing.new(@with_broken_bucket_listing_xml) }.should.raise S33rException::InvalidBucketListing
30
31
  end
31
32
 
32
33
  specify 'should cope if bucket is empty (i.e. no <Contents> elements)' do
33
34
  @bucket_listing.set_listing_xml(@with_empty_bucket_listing_xml)
34
35
  end
35
36
 
36
- specify 'can return the raw XML used to initialise it' do
37
- @bucket_listing.listing_xml.should.equal(@with_bucket_listing_xml)
38
- end
39
-
40
37
  specify 'can have the bucket listing XML reset' do
41
38
  @bucket_listing.should.respond_to :set_listing_xml
42
39
  end
@@ -82,11 +79,11 @@ context 'S3 bucket listing' do
82
79
  end
83
80
 
84
81
  specify 'should be able to build a full representation given full object XML from GET on resource key' do
85
- fix
82
+ todo
86
83
  end
87
84
 
88
85
  specify 'should provide easy access to <CommonPrefixes> elements as a hash' do
89
- fix
86
+ todo
90
87
  end
91
88
  end
92
89
 
@@ -112,14 +109,14 @@ context 'S3 object' do
112
109
  end
113
110
 
114
111
  specify 'can be associated with a NamedBucket' do
115
- fix
112
+ todo
116
113
  end
117
114
 
118
115
  specify 'can be saved by proxing through the NamedBucket it is associated with' do
119
- fix
116
+ todo
120
117
  end
121
118
 
122
119
  specify 'cannot be saved unless associated with a NamedBucket' do
123
- fix
120
+ todo
124
121
  end
125
122
  end
@@ -0,0 +1,65 @@
1
+ base = File.dirname(__FILE__)
2
+ require File.join(base, '../test_setup')
3
+
4
+ require 'rubygems'
5
+ require_gem 'FakeWeb'
6
+
7
+ context 'S33r Client' do
8
+ setup do
9
+ @base = File.dirname(__FILE__)
10
+ @client = Client.new(Testing::ACCESS_KEY, Testing::SECRET_ACCESS_KEY, :use_ssl => false, :dump_requests => true)
11
+ @client2 = Client.new(Testing::ACCESS_KEY, Testing::SECRET_ACCESS_KEY)
12
+ @bucket = 'testingtesting'
13
+ @url = url_join('http://', HOST, @bucket)
14
+
15
+ @plain_config_file = File.join(@base, '../files/client_config.yml')
16
+ @custom_config_file = File.join(@base, '../files/namedbucket_config.yml')
17
+
18
+ xml_file = File.join(@base, '../files/bucket_listing.xml')
19
+ @bucket_listing_xml = File.open(xml_file) { |f| f.read }
20
+
21
+ listbucket_response = Net::HTTPResponse.new('1.1', '200', 'OK')
22
+ listbucket_response.body = @bucket_listing_xml
23
+
24
+ FakeWeb.register_uri(@url, :status => 200, :response => listbucket_response)
25
+ end
26
+
27
+ specify 'should return use_ssl setting correctly' do
28
+ @client.use_ssl?.should.not.be true
29
+ @client2.use_ssl?.should.be true
30
+ end
31
+
32
+ specify 'should trap max_keys too high in bucket listing request' do
33
+ lambda { @client.list_bucket('duff', :max_keys => (BUCKET_LIST_MAX_MAX_KEYS + 1)) }.should.raise \
34
+ BucketListingMaxKeysError
35
+ end
36
+
37
+ specify 'should fetch bucket listing ok' do
38
+ resp, _ = @client.list_bucket(@bucket)
39
+ resp.ok?.should.be true
40
+ end
41
+
42
+ specify 'can be initialised from plain config file' do
43
+ c = Client.init(@plain_config_file)
44
+ c.aws_access_key.should.equal 'youraccesskey'
45
+ c.aws_secret_access_key.should.equal 'yoursecretkey'
46
+ end
47
+
48
+ specify 'should be able to convert paths to keys' do
49
+ todo
50
+ end
51
+
52
+ specify 'should attach BucketListing instance to ListBucketResult response' do
53
+ todo
54
+ end
55
+
56
+ specify 'should retain leading slashes on keys when constructing request URLs' do
57
+ todo
58
+ end
59
+
60
+ specify 'should recognise custom config variables passed to configuration file loader' do
61
+ _, _, _, custom = Client.load_config(@custom_config_file)
62
+ custom[:from_email].should.equal 'you@example.com'
63
+ custom[:to_email].should.equal 'me@example.com'
64
+ end
65
+ end
@@ -1,6 +1,7 @@
1
- require File.dirname(__FILE__) + '/../s3_test_constants'
1
+ base = File.dirname(__FILE__)
2
+ require File.join(base, '../test_setup')
2
3
 
3
- context 'S3 core' do
4
+ context 'S33r core' do
4
5
 
5
6
  setup do
6
7
  @for_request_method = 'PUT'
@@ -22,7 +23,7 @@ context 'S3 core' do
22
23
  "text/html\nThu, 17 Nov 2005 18:49:58 GMT\nx-amz-magic:abracadabra\n" +
23
24
  "x-amz-meta-author:foo@bar.com\n/quotes/nelson"
24
25
  @correct_signature = "jZNOcbfWmD/A/f3hSvVzXZjM2HU="
25
- @correct_auth_header = "AWS #{S3Testing::ACCESS_KEY}:#{@correct_signature}"
26
+ @correct_auth_header = "AWS #{Testing::ACCESS_KEY}:#{@correct_signature}"
26
27
 
27
28
  @with_invalid_bucket_name = '/badbucket'
28
29
  @with_invalid_bucket_name2 = 'badbucket/'
@@ -37,23 +38,23 @@ context 'S3 core' do
37
38
  end
38
39
 
39
40
  specify 'should generate correct signatures' do
40
- generate_signature(S3Testing::SECRET_ACCESS_KEY,
41
+ generate_signature(Testing::SECRET_ACCESS_KEY,
41
42
  @correct_canonical_string).should.equal @correct_signature
42
43
  end
43
44
 
44
45
  specify 'should generate correct auth headers' do
45
46
  generate_auth_header_value(@for_request_method, @for_request_path, @for_request_headers,
46
- S3Testing::ACCESS_KEY, S3Testing::SECRET_ACCESS_KEY).should.equal @correct_auth_header
47
+ Testing::ACCESS_KEY, Testing::SECRET_ACCESS_KEY).should.equal @correct_auth_header
47
48
  end
48
49
 
49
50
  specify 'should not generate auth header if bad HTTP method passed' do
50
51
  lambda { generate_auth_header_value('duff', nil, nil, nil, nil) }.should.raise \
51
- S3Exception::MethodNotAvailable
52
+ MethodNotAvailable
52
53
  end
53
54
 
54
55
  specify 'should not generate auth header if required headers missing' do
55
56
  lambda { generate_auth_header_value('PUT', '/', @for_incomplete_headers,
56
- nil, nil) }.should.raise S3Exception::MissingRequiredHeaders
57
+ nil, nil) }.should.raise MissingRequiredHeaders
57
58
  end
58
59
 
59
60
  specify 'when generating auth header, should allow addition of Date and Content-Type headers' do
@@ -68,7 +69,7 @@ context 'S3 core' do
68
69
 
69
70
  specify 'should not generate canned ACL header if invalid canned ACL supplied' do
70
71
  lambda { canned_acl_header('duff') }.should.raise \
71
- S3Exception::UnsupportedCannedACL
72
+ UnsupportedCannedACL
72
73
  end
73
74
 
74
75
  specify 'should correctly add canned ACL headers' do
@@ -91,9 +92,9 @@ context 'S3 core' do
91
92
 
92
93
  specify 'should recognise invalid bucket names' do
93
94
  lambda { bucket_name_valid?(@with_invalid_bucket_name) }.should.raise \
94
- S3Exception::MalformedBucketName
95
+ MalformedBucketName
95
96
  lambda { bucket_name_valid?(@with_invalid_bucket_name2) }.should.raise \
96
- S3Exception::MalformedBucketName
97
+ MalformedBucketName
97
98
  end
98
99
 
99
100
  specify 'should return empty string if generating querystring with no key/value pairs' do
@@ -123,8 +124,12 @@ context 'S3 core' do
123
124
  end
124
125
 
125
126
  specify 'should generate URLs with authentication parameters' do
126
- s3_authenticated_url(S3Testing::ACCESS_KEY, S3Testing::SECRET_ACCESS_KEY, 'quotes', 'nelson', \
127
+ s3_authenticated_url(Testing::ACCESS_KEY, Testing::SECRET_ACCESS_KEY, 'quotes', 'nelson', \
127
128
  1141889120).should.equal @correct_authenticated_url
128
129
  end
130
+
131
+ specify 'should generate correct public URLs' do
132
+ todo
133
+ end
129
134
 
130
135
  end
@@ -0,0 +1,32 @@
1
+ base = File.dirname(__FILE__)
2
+ require File.join(base, '../test_setup')
3
+
4
+ require 'rubygems'
5
+ require_gem 'FakeWeb'
6
+
7
+ context 'NamedBucket client' do
8
+ setup do
9
+ @base = File.dirname(__FILE__)
10
+ @config_filename = @base + '/../files/namedbucket_config.yml'
11
+ end
12
+
13
+ specify 'should keep a copy of the current bucket listing inside as a property' do
14
+ todo
15
+ end
16
+
17
+ specify 'should enable prefix, marker etc. to be reset from NamedBucket and refresh wrapped bucket listing object' do
18
+ todo
19
+ end
20
+
21
+ specify 'should be able to load config from a file' do
22
+ FakeWeb.register_uri('http://s3.amazonaws.com/nobucket', :status => 200)
23
+ client = NamedBucket.init(@config_filename)
24
+
25
+ client.aws_access_key.should.equal 'youraccesskey'
26
+ client.aws_secret_access_key.should.equal 'yoursecretkey'
27
+ client.bucket_name.should.equal 'nobucket'
28
+ client.strict?.should.be false
29
+ client.public_contents?.should.be true
30
+ client.use_ssl?.should.be false
31
+ end
32
+ end
@@ -1,6 +1,7 @@
1
- require File.dirname(__FILE__) + '/../s3_test_constants'
1
+ base = File.dirname(__FILE__)
2
+ require File.join(base, '../test_setup')
2
3
 
3
- context 'S3 sync methods' do
4
+ context 'S33r sync methods' do
4
5
  setup do
5
6
  @base_dir = File.dirname(__FILE__)
6
7
  @text_filename = @base_dir + '/../files/textfile.txt'
@@ -16,14 +17,14 @@ context 'S3 sync methods' do
16
17
  end
17
18
 
18
19
  specify 'should be able to map a directory structure to S3 bucket keys' do
19
- fix
20
+ todo
20
21
  end
21
22
 
22
23
  specify 'should return an array of local files to put to S3 based on differences between MD5 checksums' do
23
- fix
24
+ todo
24
25
  end
25
26
 
26
27
  specify 'should convert S3 bucket keys into a "virtual" directory and file structure' do
27
- fix
28
+ todo
28
29
  end
29
30
  end
@@ -1,5 +1,5 @@
1
1
  base = File.dirname(__FILE__)
2
- require File.join(base, '../s3_test_constants')
2
+ require File.join(base, '../test_setup')
3
3
 
4
4
  context 'LibXML extensions' do
5
5
  setup do
@@ -0,0 +1,6 @@
1
+ # TODO: check can init Client from basic config. file
2
+ aws_access_key: 'youraccesskey'
3
+ aws_secret_access_key: 'yoursecretkey'
4
+ options:
5
+ use_ssl: false
6
+ dump_requests: true
@@ -0,0 +1,12 @@
1
+ aws_access_key: 'youraccesskey'
2
+ aws_secret_access_key: 'yoursecretkey'
3
+ ## options for Client or NamedBucket instances
4
+ options:
5
+ strict: false
6
+ public_contents: true
7
+ use_ssl: false
8
+ default_bucket: 'nobucket'
9
+ ## extensions used in your own program
10
+ custom:
11
+ to_email: 'me@example.com'
12
+ from_email: 'you@example.com'
@@ -3,18 +3,19 @@ require 'rubygems'
3
3
  require_gem 'rspec'
4
4
 
5
5
  require File.dirname(__FILE__) + '/../lib/s33r'
6
- include S3
7
- include S3::Sync
6
+ include S33r
7
+ include S33r::S33rException
8
+ include S33r::Sync
8
9
 
9
10
  # set up some constants
10
- module S3Testing
11
+ module Testing
11
12
  ACCESS_KEY = '44CF9590006BF252F707'
12
13
  SECRET_ACCESS_KEY = 'OtxrzxIsfpFjA7SwPzILwy8Bw21TLhquhboDYROV'
13
14
  end
14
15
 
15
- # convenience for highlighting todos
16
- def fix
17
- fail 'todo'
16
+ # convenience for highlighting tasks
17
+ def todo
18
+ fail
18
19
  end
19
20
 
20
21
  # clean newlines and tabs from XML to make comparisons easier
metadata CHANGED
@@ -3,8 +3,8 @@ rubygems_version: 0.9.0
3
3
  specification_version: 1
4
4
  name: s33r
5
5
  version: !ruby/object:Gem::Version
6
- version: "0.2"
7
- date: 2006-08-23 00:00:00 +01:00
6
+ version: "0.3"
7
+ date: 2006-09-26 00:00:00 +01:00
8
8
  summary: A library for accessing Amazon S3
9
9
  require_paths:
10
10
  - lib
@@ -30,21 +30,20 @@ authors:
30
30
  - Elliot Smith
31
31
  files:
32
32
  - bin/s3cli.rb
33
- - bin/config.yml
34
33
  - lib/s33r
35
34
  - lib/s33r.rb
36
35
  - lib/s33r/sync.rb
37
36
  - lib/s33r/client.rb
38
37
  - lib/s33r/mimetypes.rb
39
- - lib/s33r/net_http_overrides.rb
38
+ - lib/s33r/s33r_http.rb
40
39
  - lib/s33r/bucket_listing.rb
41
- - lib/s33r/s3_exception.rb
42
40
  - lib/s33r/core.rb
43
41
  - lib/s33r/named_bucket.rb
44
42
  - lib/s33r/libxml_extensions.rb
43
+ - lib/s33r/s33r_exception.rb
45
44
  - test/files
46
45
  - test/test_bucket_setup.rb
47
- - test/s3_test_constants.rb
46
+ - test/test_setup.rb
48
47
  - test/cases
49
48
  - test/files/wave.jpg
50
49
  - test/files/textfile.txt
@@ -53,15 +52,68 @@ files:
53
52
  - test/files/bucket_listing_broken.xml
54
53
  - test/files/bucket_listing2.xml
55
54
  - test/files/bucket_listing3.xml
55
+ - test/files/namedbucket_config.yml
56
+ - test/files/client_config.yml
56
57
  - test/cases/spec_core.rb
57
58
  - test/cases/spec_sync.rb
58
- - test/cases/unit_client.rb
59
59
  - test/cases/spec_bucket_listing.rb
60
- - test/cases/unit_named_bucket.rb
61
60
  - test/cases/spec_xml.rb
62
- - LICENSE.txt
63
- - README.txt
64
- - MIT-LICENSE
61
+ - test/cases/spec_client.rb
62
+ - test/cases/spec_namedbucket.rb
63
+ - html/created.rid
64
+ - html/rdoc-style.css
65
+ - html/files
66
+ - html/classes
67
+ - html/fr_file_index.html
68
+ - html/fr_class_index.html
69
+ - html/fr_method_index.html
70
+ - html/index.html
71
+ - html/files/README_txt.html
72
+ - html/files/MIT-LICENSE.html
73
+ - html/files/CHANGELOG.html
74
+ - html/files/lib
75
+ - html/files/lib/s33r_rb.html
76
+ - html/files/lib/s33r
77
+ - html/files/lib/s33r/sync_rb.html
78
+ - html/files/lib/s33r/client_rb.html
79
+ - html/files/lib/s33r/mimetypes_rb.html
80
+ - html/files/lib/s33r/s33r_http_rb.html
81
+ - html/files/lib/s33r/bucket_listing_rb.html
82
+ - html/files/lib/s33r/core_rb.html
83
+ - html/files/lib/s33r/named_bucket_rb.html
84
+ - html/files/lib/s33r/libxml_extensions_rb.html
85
+ - html/files/lib/s33r/s33r_exception_rb.html
86
+ - html/classes/XML.html
87
+ - html/classes/XML
88
+ - html/classes/Net.html
89
+ - html/classes/Net
90
+ - html/classes/MIME.html
91
+ - html/classes/MIME
92
+ - html/classes/S33r.html
93
+ - html/classes/S33r
94
+ - html/classes/XML/Node.html
95
+ - html/classes/XML/Document.html
96
+ - html/classes/Net/HTTPGenericRequest.html
97
+ - html/classes/Net/HTTPResponse.html
98
+ - html/classes/MIME/Types.html
99
+ - html/classes/MIME/InvalidContentType.html
100
+ - html/classes/MIME/Type.html
101
+ - html/classes/S33r/S33rException.html
102
+ - html/classes/S33r/S33rException
103
+ - html/classes/S33r/Sync.html
104
+ - html/classes/S33r/S3User.html
105
+ - html/classes/S33r/S3Object.html
106
+ - html/classes/S33r/NamedBucket.html
107
+ - html/classes/S33r/BucketListing.html
108
+ - html/classes/S33r/Client.html
109
+ - html/classes/S33r/S33rException/MissingResource.html
110
+ - html/classes/S33r/S33rException/InvalidBucketListing.html
111
+ - html/classes/S33r/S33rException/BucketListingMaxKeysError.html
112
+ - html/classes/S33r/S33rException/MalformedBucketName.html
113
+ - html/classes/S33r/S33rException/MissingRequiredHeaders.html
114
+ - html/classes/S33r/S33rException/MethodNotAvailable.html
115
+ - html/classes/S33r/S33rException/UnsupportedCannedACL.html
116
+ - html/classes/S33r/S33rException/UnsupportedHTTPMethod.html
65
117
  test_files: []
66
118
 
67
119
  rdoc_options: []