yore 0.0.11 → 0.1.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.
@@ -1,6 +1,6 @@
1
1
  = yore
2
2
 
3
- * RubyForge Project : http://rubyforge.org/projects/buzzware
3
+ * GitHub Project : http://github.com/buzzware/yore
4
4
  * Author : http://www.buzzware.com.au
5
5
 
6
6
  == DESCRIPTION:
@@ -28,16 +28,19 @@ can be manually configured.
28
28
 
29
29
  Amazon S3
30
30
 
31
- * Yore relies on s3cmd for S3 access which is contained in the s3sync gem.
32
- s3cmd must be configured with keys for a registered Amazon S3 account.
33
- Use something like "s3cmd listbuckets" to check that you have that setup
34
- correctly before launching yore.
31
+ * You can and probably should create a seperate Amazon S3 account for backups. Unfortunately
32
+ you will need to supply your credit card details for this account, event though only your main
33
+ account will be charged.
35
34
 
36
- * You can and probably should create a seperate Amazon account for 1 or more web servers,
37
- and then grant write access to a single bucket for their use, rather than using your main
38
- S3 keys. You don't need to supply your credit card details for this account - your main
39
- account will be charged. This avoids your main Amazon AWS keys getting stolen by someone
40
- hacking into the webserver, or even other legitimate users using them.
35
+ Sadly you can't get a useable S3 account without giving them your credit card information,
36
+ even if you never plan to create your own buckets. Build a bridge, get over it and sign
37
+ up at http://aws.amazon.com/s3/. Then when you have logged in to the AWS website, go to
38
+ "Your Account" -> "Security Credentials"
39
+ to get an "Access Key ID" and click Show to get its "Secret Access Key"
40
+
41
+ * Create a bucket with backup permissions for an AWS account
42
+
43
+ yore new_backup_bucket --backup_email "blah@buzzware.com.au" testbucket
41
44
 
42
45
  == SYNOPSIS:
43
46
 
@@ -48,8 +51,8 @@ eg.
48
51
 
49
52
  == REQUIREMENTS:
50
53
 
51
- * s3sync (http://rubyforge.org/projects/s3sync/)
52
- * RequirePaths (http://rubyforge.org/projects/blackwhitelogin)
54
+ * AWS S3 (http://github.com/marcel/aws-s3)
55
+ * buzzcore (http://github.com/buzzware/buzzcore)
53
56
  * cmdparse (http://cmdparse.rubyforge.org)
54
57
  * shairontoledo-popen4 (http://github.com/shairontoledo/popen4)
55
58
  * tar, bzip2, openssl, mysql
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.0.11
1
+ 0.1.0
data/bin/yore CHANGED
@@ -69,6 +69,15 @@ encrypt_decrypt_option_parser = CmdParse::OptionParserWrapper.new do |opt|
69
69
  #end
70
70
  end
71
71
 
72
+ new_backup_bucket_option_parser = CmdParse::OptionParserWrapper.new do |opt|
73
+ opt.on( '--backup_id=S3 Access Key ID', String, 'S3 Access Key ID from Amazon' ) do |value|
74
+ CMD_OPTIONS[:backup_id] = value
75
+ end
76
+ opt.on( '--backup_email=AWS Account Email Address', String, 'AWS Account Email Address from Amazon' ) do |value|
77
+ CMD_OPTIONS[:backup_email] = value
78
+ end
79
+ end
80
+
72
81
  command(cmd,yore,:backup,"Backup filelist to S3",option_parser)
73
82
 
74
83
  command(cmd,yore,:save,"Save application data to local file",load_save_option_parser)
@@ -83,6 +92,8 @@ command(cmd,yore,:test_email,"Test email sending\n")
83
92
 
84
93
  command(cmd,yore,:db_dump,"Dump database by name in job\n")
85
94
 
95
+ command(cmd,yore,:new_backup_bucket,"Create a new bucket with permissions for backup\n",new_backup_bucket_option_parser)
96
+
86
97
  cmd.parse
87
98
 
88
99
  yore.logger.info "\nComplete.\n"
@@ -0,0 +1,129 @@
1
+ require 'fileutils'
2
+
3
+ gem 'buzzcore'; require 'buzzcore';
4
+ gem 'aws-s3'; require 'aws/s3'
5
+
6
+ # although this is implemented as an instantiable object, not a singleton,
7
+ # the AWS gem seems to operate as a singleton, so don't create more than one of these.
8
+ class AWSS3Client
9
+
10
+ attr_accessor :credentials
11
+
12
+ def initialize(aCredentials=nil)
13
+ @credentials = aCredentials || Credentials.new()
14
+ connect
15
+ end
16
+
17
+ def connect(aId=nil,aKey=nil)
18
+ aId ||= @credentials[:s3_access_key_id]
19
+ aKey ||= @credentials[:s3_secret_access_key]
20
+ AWS::S3::Base.establish_connection!(
21
+ :access_key_id => aId,
22
+ :secret_access_key => aKey
23
+ )
24
+ end
25
+
26
+ def bucket(aName)
27
+ return AWS::S3::Bucket.find(aName)
28
+ end
29
+
30
+ def bucket_exists?(aName)
31
+ AWS::S3::Bucket.find(aName)
32
+ true
33
+ rescue
34
+ false
35
+ end
36
+
37
+ def ensure_clean_bucket(aName)
38
+ AWS::S3::Bucket.delete(aName, :force => true) if bucket_exists?(aName)
39
+ AWS::S3::Bucket.create(aName)
40
+ AWS::S3::Bucket.find(aName)
41
+ end
42
+
43
+ # ensures the destination bucket exists with the right permissions for upload_backup
44
+ # eg. @s3client.ensure_backup_bucket('a_bucket',{'email_address' => 'user@domain.com'})
45
+ def ensure_backup_bucket(aBucketName,aOtherUserAttrs=nil)
46
+ AWS::S3::Bucket.create(aBucketName) unless bucket_exists?(aBucketName)
47
+ grant_bucket_permissions(aBucketName,%w(WRITE READ_ACP),aOtherUserAttrs,true) if aOtherUserAttrs
48
+ end
49
+
50
+ def new_backup_bucket(aBucketName,aOtherUserAttrs)
51
+ AWS::S3::Bucket.create(aBucketName)
52
+ grant_bucket_permissions(aBucketName,%w(WRITE READ_ACP),aOtherUserAttrs,true)
53
+ end
54
+
55
+ # eg. policy = policy_add(policy,{'id' => 'dssdfsdf'},%w(READ WRITE))
56
+ def policy_add(aPolicy,aGranteeAttrs,aPermissions)
57
+ aPolicy ||= AWS::S3::ACL::Policy.new
58
+ grantee = AWS::S3::ACL::Grantee.new(aGranteeAttrs)
59
+ grantee.display_name ||= 'display_name'
60
+ aPermissions.each do |p|
61
+ grant = AWS::S3::ACL::Grant.new
62
+ grant.permission = p
63
+ grant.grantee = grantee
64
+ aPolicy.grants << grant
65
+ end
66
+ aPolicy
67
+ end
68
+
69
+ def grant_bucket_permissions(aBucketName,aPermissions,aGranteeAttrs,aMerge = false)
70
+ policy = (aMerge ? AWS::S3::Bucket.acl(aBucketName) : nil)
71
+ policy = policy_add(policy,aGranteeAttrs,aPermissions)
72
+ policy.owner ||= Owner.current
73
+ AWS::S3::Bucket.acl(aBucketName,policy)
74
+ policy
75
+ end
76
+
77
+ def grant_object_permissions(aBucketName,aObjectName,aPermissions,aGranteeAttrs,aMerge = false)
78
+ policy = (aMerge ? AWS::S3::S3Object.acl(aObjectName,aBucketName) : nil)
79
+ policy = policy_add(policy,aGranteeAttrs,aPermissions)
80
+ policy.owner ||= Owner.current
81
+ AWS::S3::S3Object.acl(aObjectName,aBucketName,policy) #S3Object.acl('kiss.jpg', 'marcel')
82
+ policy
83
+ end
84
+
85
+ def put_content(aFilename, aContent, aBucketName)
86
+ AWS::S3::S3Object.store(aFilename, aContent, aBucketName)
87
+ end
88
+
89
+ def upload(aFilename,aBucketName,aObjectName=nil)
90
+ aObjectName ||= File.basename(aFileName)
91
+ #AWS::S3::S3Object.store(aObjectName, MiscUtils.string_from_file(aFileName), aBucketName)
92
+ content = MiscUtils.string_from_file(aFileName)
93
+
94
+ put_content(aObjectName, content, aBucketName)
95
+ end
96
+
97
+ def get_content(aFilename, aBucketName)
98
+ return AWS::S3::S3Object.value(aFilename, aBucketName)
99
+ end
100
+
101
+ def download(aFilename,aBucketName,aObjectName=nil)
102
+ aObjectName ||= File.basename(aFilename)
103
+ #AWS::S3::S3Object.store(aObjectName, MiscUtils.string_from_file(aFilename), aBucketName)
104
+ MiscUtils.string_to_file(get_content(aObjectName,aBucketName),aFilename)
105
+ end
106
+
107
+ # Summary: Uploads the given file to the bucket, then gives up permissions to the bucket owner
108
+ # Details :
109
+ # * intended to allow files to be uploaded to S3, but not allowing the files to be interfered with should
110
+ # the web server get hacked.
111
+ # In truth, S3 permissions aren't adequate and the best we can do is that the file can't be read,
112
+ # but can be written over. The user also can't get a listing of the bucket
113
+ # * S3 won't allow objects (or buckets) to change owner, but we do everything else ie give FULL_CONTROL,
114
+ # and remove it from self, to hand control to the bucket owner
115
+ # * This requires the bucket to give WRITE & READ_ACP permissions to this user
116
+ def upload_backup(aFileName,aBucketName,aObjectName = nil)
117
+ aObjectName ||= File.basename(aFileName)
118
+ AWS::S3::S3Object.store(aObjectName, MiscUtils.string_from_file(aFileName), aBucketName)
119
+ bucket_owner = AWS::S3::Bucket.acl(aBucketName).owner
120
+ policy = AWS::S3::S3Object.acl(aObjectName,aBucketName)
121
+ policy.grants.clear
122
+ policy = policy_add(policy,{'id' => bucket_owner.id, 'display_name' => bucket_owner.display_name},'FULL_CONTROL')
123
+
124
+ # replace policy with full control to bucket owner, none to test_user
125
+ AWS::S3::S3Object.acl(aObjectName,aBucketName,policy)
126
+ end
127
+
128
+ end
129
+
@@ -4,6 +4,9 @@ gem 'buzzcore'; require 'buzzcore';
4
4
  require 'fileutils'
5
5
  require 'net/smtp'
6
6
 
7
+ require 'yore/AWSS3Client'
8
+
9
+
7
10
  THIS_FILE = File.expand_path(__FILE__)
8
11
  THIS_DIR = File.dirname(THIS_FILE)
9
12
 
@@ -70,8 +73,10 @@ module YoreCore
70
73
  class Yore
71
74
 
72
75
  DEFAULT_CONFIG = {
73
- :kind => '',
74
- :basepath => '',
76
+ :kind => String,
77
+ :basepath => String,
78
+ :backup_id => String,
79
+ :backup_email => String,
75
80
  :keep_daily => 14,
76
81
  :keep_weekly => 12,
77
82
  :keep_monthly => 12,
@@ -80,26 +85,27 @@ module YoreCore
80
85
  :first_hour => 4,
81
86
  :prefix => 'backup',
82
87
  :log_level => 'INFO',
83
- :bucket => '',
88
+ :bucket => String,
84
89
  :email_report => false,
85
- :mail_host => '',
90
+ :mail_host => String,
86
91
  :mail_port => 25,
87
- :mail_helodomain => '',
88
- :mail_user => '',
89
- :mail_password => '',
90
- :mail_from => '',
91
- :mail_from_alias => '',
92
- :mail_to => '',
93
- :mail_to_alias => '',
92
+ :mail_helodomain => String,
93
+ :mail_user => String,
94
+ :mail_password => String,
95
+ :mail_from => String,
96
+ :mail_from_alias => String,
97
+ :mail_to => String,
98
+ :mail_to_alias => String,
94
99
  :mail_auth => :plain,
95
100
  :mysqldump => 'mysqldump',
96
- :RAILS_ENV => ''
101
+ :RAILS_ENV => String
97
102
  }
98
103
 
99
104
  attr_reader :config
100
105
  attr_reader :logger
101
106
  attr_reader :reporter
102
107
  attr_reader :keepers
108
+ attr_reader :s3client
103
109
 
104
110
  def initialize(aConfig=nil)
105
111
  DEFAULT_CONFIG[:email_report] = false # fixes some bug where this was nil
@@ -256,6 +262,8 @@ module YoreCore
256
262
  @keepers << KeepDaily.new(config[:keep_daily])
257
263
  @keepers << KeepWeekly.new(config[:keep_weekly])
258
264
  @keepers << KeepMonthly.new(config[:keep_monthly])
265
+
266
+ @s3client = ::AWSS3Client.new()
259
267
  end
260
268
 
261
269
  def do_action(aAction,aArgs)
@@ -275,12 +283,6 @@ module YoreCore
275
283
  return result[:stdout]
276
284
  end
277
285
 
278
- def s3shell(aCommandline)
279
- shell(aCommandline) do |r|
280
- r[:exitcode] = 1 if r[:stderr].length > 0
281
- end
282
- end
283
-
284
286
  def get_log
285
287
  logger.close
286
288
  # read in log and return
@@ -364,22 +366,24 @@ module YoreCore
364
366
  shell "openssl enc -d -aes-256-cbc -K #{config[:crypto_key]} -iv #{config[:crypto_iv]} -in #{aFileIn} -out #{aFileOut}"
365
367
  end
366
368
 
367
- def ensure_bucket(aBucket=nil)
369
+ def ensure_bucket(aBucket=nil,aUserEmail=nil)
368
370
  aBucket ||= config[:bucket]
371
+ aUserEmail ||= config[:bucket_user_email]
369
372
  logger.info "Ensuring S3 bucket #{aBucket} exists ..."
370
- s3shell "s3cmd createbucket #{aBucket}"
373
+ s3client.ensure_backup_bucket(aBucket,aUserEmail ? {'email_address' => aUserEmail} : nil)
371
374
  end
372
375
 
373
376
  # uploads the given file to the current bucket as its basename
374
377
  def upload(aFile)
375
378
  #ensure_bucket()
379
+ logger.debug "Uploading #{aFile} to S3 bucket #{config[:bucket]} ..."
376
380
  logger.info "Uploading #{File.basename(aFile)} to S3 bucket #{config[:bucket]} ..."
377
- s3shell "s3cmd put #{config[:bucket]}:#{File.basename(aFile)} #{aFile}"
381
+ s3client.upload_backup(aFile,config[:bucket],File.basename(aFile))
378
382
  end
379
383
 
380
384
  # downloads the given file from the current bucket as its basename
381
385
  def download(aFile)
382
- s3shell "s3cmd get #{config[:bucket]}:#{File.basename(aFile)} #{aFile}"
386
+ s3client.download(aFile,config[:bucket],File.basename(aFile))
383
387
  end
384
388
 
385
389
  # calculate the date (with no time component) based on :day_begins_hour and the local time
@@ -613,6 +617,21 @@ module YoreCore
613
617
  uncompress(temp_file,folder)
614
618
  end
615
619
 
620
+ def new_backup_bucket(aArgs)
621
+ bucket_name = aArgs[0]
622
+ if s3client.bucket_exists?(bucket_name)
623
+ puts "sorry, bucket already exists"
624
+ else
625
+ backup_user_attrs = {
626
+ 'id' => config[:backup_id],
627
+ 'display_name' => config[:backup_name] || 'backup_name',
628
+ 'email_address' => config[:backup_email]
629
+ }
630
+ raise StandardError.new("Must provide backup_id or backup_email") unless backup_user_attrs['id'] || backup_user_attrs['email_address']
631
+ s3client.new_backup_bucket(bucket_name,backup_user_attrs)
632
+ end
633
+ end
634
+
616
635
  def test_email(*aDb)
617
636
  args = {
618
637
  :host => config[:mail_host],
@@ -0,0 +1,76 @@
1
+ require File.expand_path('test_helper',File.dirname(__FILE__))
2
+
3
+ class AWSGemTest < Test::Unit::TestCase
4
+
5
+ def setup
6
+ puts "setup"
7
+ creds = Credentials.new()
8
+ assert(creds[:s3_access_key_id] && creds[:s3_secret_access_key] && creds[:s3_yore_test_bucket])
9
+ @s3client = AWSS3Client.new(creds)
10
+ end
11
+
12
+ should "login" do
13
+ test_bucket = @s3client.ensure_clean_bucket(@s3client.credentials[:s3_yore_test_bucket])
14
+ puts test_bucket.inspect
15
+ assert !test_bucket.nil?
16
+ end
17
+
18
+ should "upload, download and compare" do
19
+ test_bucket = @s3client.ensure_clean_bucket(@s3client.credentials[:s3_yore_test_bucket])
20
+ test_filename = 'up_down_compare'
21
+ test_content = 'abc'
22
+ #AWS::S3::S3Object.store(test_filename, test_content, test_bucket.name)
23
+ @s3client.put_content(test_filename, test_content, test_bucket.name)
24
+ #after_content = AWS::S3::S3Object.value test_filename, test_bucket.name
25
+ after_content = @s3client.get_content(test_filename, test_bucket.name)
26
+ assert_equal test_content, after_content
27
+ end
28
+
29
+
30
+ should "create bucket writable (and not readable) by another user" do
31
+ test_user_bucket = @s3client.ensure_clean_bucket(@s3client.credentials[:s3_test_user_bucket])
32
+ @s3client.ensure_backup_bucket(@s3client.credentials[:s3_test_user_bucket],{'email_address' => @s3client.credentials[:s3_test_user_email]})
33
+
34
+ test_filename = 'up_down_compare'
35
+ test_content = 'xyz'
36
+ # reconnect as user
37
+ @s3client.connect(@s3client.credentials[:s3_test_access_id],@s3client.credentials[:s3_test_access_key])
38
+ temp_file = MiscUtils.make_temp_file(nil, nil, test_content)
39
+ @s3client.upload_backup(temp_file,@s3client.credentials[:s3_test_user_bucket],test_filename)
40
+
41
+ # should fail reading
42
+ begin
43
+ after_content = @s3client.get_content(test_filename, @s3client.credentials[:s3_test_user_bucket])
44
+ flunk
45
+ rescue AWS::S3::ResponseError => e
46
+ assert_equal e.class.to_s,"AWS::S3::AccessDenied"
47
+ end
48
+
49
+ # should fail overwriting
50
+ #new_content = '123'
51
+ #begin
52
+ # AWS::S3::S3Object.store(test_filename, new_content, @s3client.credentials[:s3_test_user_bucket])
53
+ # flunk "succeeded overwriting (should fail)"
54
+ #rescue AWS::S3::ResponseError => e
55
+ # assert_equal e.class.to_s,"AWS::S3::AccessDenied"
56
+ #end
57
+
58
+ # back to normal
59
+ @s3client.connect
60
+
61
+ test_user_bucket = @s3client.bucket(@s3client.credentials[:s3_test_user_bucket])
62
+ after_content = @s3client.get_content(test_filename, test_user_bucket.name)
63
+ assert_equal test_content, after_content
64
+ end
65
+
66
+ should "fail with wrong credentials" do
67
+ test_user_bucket = @s3client.ensure_clean_bucket(@s3client.credentials[:s3_test_user_bucket])
68
+ begin
69
+ permission = @s3client.grant_bucket_permissions(test_user_bucket,%w(WRITE READ_ACP),{'email_address' => 'asddsad@sdsddsadsa.com'},true)
70
+ flunk
71
+ rescue AWS::S3::ResponseError => e
72
+ assert_equal e.class.to_s,"AWS::S3::NoSuchBucket"
73
+ end
74
+ end
75
+
76
+ end
@@ -1,16 +1,11 @@
1
- require 'rubygems'
2
- gem 'buzzcore'; require 'buzzcore';
3
- require 'yore/yore_core'
4
- require 'test/unit'
5
- gem 'Shoulda'; require 'shoulda'
6
- require 'fileutils'
1
+ require File.expand_path('test_helper',File.dirname(__FILE__))
7
2
 
8
3
  def ensure_clean_bucket(aName)
9
4
  `s3cmd createbucket #{aName}`
10
5
  `s3cmd deleteall #{aName}`
11
6
  end
12
7
 
13
- # finwa example : yore backup /var/www/joomla/deploy-system/finwa_yore.xml >/dev/null 2>&1
8
+ # example : yore backup /var/www/joomla/deploy-system/yore.xml >/dev/null 2>&1
14
9
 
15
10
  class S3Test < Test::Unit::TestCase
16
11
 
@@ -24,15 +19,17 @@ class S3Test < Test::Unit::TestCase
24
19
  @yore.configure({
25
20
  :bucket => bucket
26
21
  })
27
- content = 'this is my test content'
22
+ #content = 'this is my test content'
23
+ orig_file = File.expand_path('upload_test_content.yor',File.dirname(__FILE__)) # MiscUtils.make_temp_file(nil, temp_dir, content)
24
+ puts @yore.upload(orig_file)
25
+ #orig_file = temp_file+'.orig'
26
+ #File.rename(temp_file, orig_file)
28
27
  temp_dir = MiscUtils.make_temp_dir()
29
- temp_file = MiscUtils.make_temp_file(nil, temp_dir, content)
30
- puts @yore.upload(temp_file)
31
- orig_file = temp_file+'.orig'
32
- File.rename(temp_file, orig_file)
28
+ temp_file = File.join(temp_dir,File.basename(orig_file))
33
29
  puts @yore.download(temp_file)
34
- down_file_content = MiscUtils.string_from_file(temp_file)
35
- assert_equal content, down_file_content
30
+ #down_file_content = MiscUtils.string_from_file(temp_file)
31
+ #assert_equal content, down_file_content
32
+ assert_equal nil, POpen4::shell_out("/usr/bin/diff #{orig_file} #{temp_file}")[:stdout]
36
33
  end
37
34
 
38
35
  should "backup and restore multiple directories of file" do
@@ -56,7 +53,6 @@ class S3Test < Test::Unit::TestCase
56
53
  MiscUtils::make_temp_file(f,source2)
57
54
  end
58
55
 
59
-
60
56
  ensure_clean_bucket(bucket)
61
57
 
62
58
  # create job file
@@ -67,7 +63,7 @@ class S3Test < Test::Unit::TestCase
67
63
  <Item Name="crypto_iv">3A63775C1E3F291B0925578165EB917E</Item>
68
64
  <Item Name="crypto_key">07692FC8656F04AE5518B80D38681E038A3C12050DF6CC97CEEC33D800D5E2FE</Item>
69
65
  <Item Name="prefix">backup</Item>
70
- <Item Name="log_level">INFO</Item>
66
+ <Item Name="log_level">DEBUG</Item>
71
67
  <Item Name="bucket">${BUCKET}</Item>
72
68
  </SimpleItems>
73
69
  <Sources>
@@ -85,11 +81,10 @@ class S3Test < Test::Unit::TestCase
85
81
  })
86
82
  MiscUtils::string_to_file(job_content,job_file = MiscUtils::temp_file)
87
83
 
88
- # call yore script with ruby from the command line, then download result and check contents
89
84
  begin
90
85
  _xmlRoot = XmlUtils.get_xml_root(job_content)
91
86
  cmd_options = {:config => job_file}
92
- @yore_upload = YoreCore::Yore::launch(_xmlRoot,cmd_options,{:basepath => File.dirname(File.expand_path(job_file))})
87
+ @yore_upload = YoreCore::Yore::launch(_xmlRoot,cmd_options,{:basepath => File.dirname(File.expand_path(job_file)), :log_level => 'DEBUG'})
93
88
  @yore_upload.backup([job_file])
94
89
  rescue ::StandardError => e
95
90
  flunk e.inspect
@@ -98,7 +93,10 @@ class S3Test < Test::Unit::TestCase
98
93
  #puts result
99
94
  yore = YoreCore::Yore.new()
100
95
  yore.configure({
101
- :bucket => bucket
96
+ :crypto_iv => "3A63775C1E3F291B0925578165EB917E",
97
+ :crypto_key =>"07692FC8656F04AE5518B80D38681E038A3C12050DF6CC97CEEC33D800D5E2FE",
98
+ :bucket => bucket,
99
+ :log_level => 'DEBUG'
102
100
  })
103
101
 
104
102
  retrieved_fname = File.expand_path(yore.encode_file_name(), dest_dir)
@@ -4,7 +4,18 @@ require 'shoulda'
4
4
 
5
5
  $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
6
6
  $LOAD_PATH.unshift(File.dirname(__FILE__))
7
- require 'yore'
8
7
 
9
8
  class Test::Unit::TestCase
10
9
  end
10
+
11
+ require File.expand_path('../../buzzcore/lib/buzzcore_dev.rb',File.dirname(__FILE__))
12
+
13
+ require_paths_first '../lib' # prefer local yore over installed gem
14
+
15
+
16
+ require 'yore/AWSS3Client'
17
+ require 'yore/yore_core'
18
+ require 'fileutils'
19
+
20
+
21
+
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{yore}
8
- s.version = "0.0.11"
8
+ s.version = "0.1.0"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["buzzware"]
12
- s.date = %q{2009-10-17}
12
+ s.date = %q{2009-12-08}
13
13
  s.default_executable = %q{yore}
14
14
  s.description = %q{yore (as in "days of yore") is a user data management utility for web applications.}
15
15
  s.email = %q{contact@buzzware.com.au}
@@ -26,13 +26,16 @@ Gem::Specification.new do |s|
26
26
  "Rakefile",
27
27
  "VERSION",
28
28
  "bin/yore",
29
+ "lib/yore/AWSS3Client.rb",
29
30
  "lib/yore/yore_core.rb",
30
31
  "notes.txt",
31
32
  "test.crontab",
33
+ "test/AWS_gem_test.rb",
32
34
  "test/S3_test.rb",
33
35
  "test/test_helper.rb",
34
36
  "test/test_job_a.xml",
35
37
  "test/test_job_b.xml",
38
+ "test/upload_test_content.yor",
36
39
  "test/yore_browsercms_loadsave_test.rb",
37
40
  "test/yore_spree_loadsave_test.rb",
38
41
  "test/yore_test.rb",
@@ -47,7 +50,8 @@ Gem::Specification.new do |s|
47
50
  s.rubygems_version = %q{1.3.5}
48
51
  s.summary = %q{yore (as in "days of yore") is a user data management utility for web applications.}
49
52
  s.test_files = [
50
- "test/S3_test.rb",
53
+ "test/AWS_gem_test.rb",
54
+ "test/S3_test.rb",
51
55
  "test/test_helper.rb",
52
56
  "test/yore_browsercms_loadsave_test.rb",
53
57
  "test/yore_spree_loadsave_test.rb",
data/yore.vpw CHANGED
@@ -1,6 +1,7 @@
1
1
  <!DOCTYPE Workspace SYSTEM "http://www.slickedit.com/dtd/vse/10.0/vpw.dtd">
2
2
  <Workspace Version="10.0" VendorName="SlickEdit">
3
3
  <Projects>
4
+ <Project File="../buzzcore/buzzcore.vpj" />
4
5
  <Project File="yore.vpj" />
5
6
  </Projects>
6
7
  </Workspace>
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: yore
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.11
4
+ version: 0.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - buzzware
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2009-10-17 00:00:00 +08:00
12
+ date: 2009-12-08 00:00:00 +08:00
13
13
  default_executable: yore
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
@@ -49,13 +49,16 @@ files:
49
49
  - Rakefile
50
50
  - VERSION
51
51
  - bin/yore
52
+ - lib/yore/AWSS3Client.rb
52
53
  - lib/yore/yore_core.rb
53
54
  - notes.txt
54
55
  - test.crontab
56
+ - test/AWS_gem_test.rb
55
57
  - test/S3_test.rb
56
58
  - test/test_helper.rb
57
59
  - test/test_job_a.xml
58
60
  - test/test_job_b.xml
61
+ - test/upload_test_content.yor
59
62
  - test/yore_browsercms_loadsave_test.rb
60
63
  - test/yore_spree_loadsave_test.rb
61
64
  - test/yore_test.rb
@@ -91,6 +94,7 @@ signing_key:
91
94
  specification_version: 3
92
95
  summary: yore (as in "days of yore") is a user data management utility for web applications.
93
96
  test_files:
97
+ - test/AWS_gem_test.rb
94
98
  - test/S3_test.rb
95
99
  - test/test_helper.rb
96
100
  - test/yore_browsercms_loadsave_test.rb