ahoward-helene 0.0.3

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.
Files changed (72) hide show
  1. data/Rakefile +274 -0
  2. data/helene.gemspec +26 -0
  3. data/lib/helene.rb +113 -0
  4. data/lib/helene/attempt.rb +46 -0
  5. data/lib/helene/aws.rb +50 -0
  6. data/lib/helene/config.rb +147 -0
  7. data/lib/helene/content_type.rb +15 -0
  8. data/lib/helene/content_type.yml +661 -0
  9. data/lib/helene/error.rb +12 -0
  10. data/lib/helene/logging.rb +55 -0
  11. data/lib/helene/objectpool.rb +220 -0
  12. data/lib/helene/rails.rb +21 -0
  13. data/lib/helene/rightscale/acf/right_acf_interface.rb +379 -0
  14. data/lib/helene/rightscale/awsbase/benchmark_fix.rb +39 -0
  15. data/lib/helene/rightscale/awsbase/right_awsbase.rb +803 -0
  16. data/lib/helene/rightscale/awsbase/support.rb +111 -0
  17. data/lib/helene/rightscale/ec2/right_ec2.rb +1737 -0
  18. data/lib/helene/rightscale/net_fix.rb +160 -0
  19. data/lib/helene/rightscale/right_aws.rb +71 -0
  20. data/lib/helene/rightscale/right_http_connection.rb +507 -0
  21. data/lib/helene/rightscale/s3/right_s3.rb +1094 -0
  22. data/lib/helene/rightscale/s3/right_s3_interface.rb +1180 -0
  23. data/lib/helene/rightscale/sdb/active_sdb.rb +930 -0
  24. data/lib/helene/rightscale/sdb/right_sdb_interface.rb +696 -0
  25. data/lib/helene/rightscale/sqs/right_sqs.rb +388 -0
  26. data/lib/helene/rightscale/sqs/right_sqs_gen2.rb +286 -0
  27. data/lib/helene/rightscale/sqs/right_sqs_gen2_interface.rb +444 -0
  28. data/lib/helene/rightscale/sqs/right_sqs_interface.rb +596 -0
  29. data/lib/helene/s3.rb +34 -0
  30. data/lib/helene/s3/bucket.rb +379 -0
  31. data/lib/helene/s3/grantee.rb +134 -0
  32. data/lib/helene/s3/key.rb +162 -0
  33. data/lib/helene/s3/owner.rb +16 -0
  34. data/lib/helene/sdb.rb +9 -0
  35. data/lib/helene/sdb/base.rb +1204 -0
  36. data/lib/helene/sdb/base/associations.rb +481 -0
  37. data/lib/helene/sdb/base/attributes.rb +90 -0
  38. data/lib/helene/sdb/base/connection.rb +20 -0
  39. data/lib/helene/sdb/base/error.rb +20 -0
  40. data/lib/helene/sdb/base/hooks.rb +82 -0
  41. data/lib/helene/sdb/base/literal.rb +52 -0
  42. data/lib/helene/sdb/base/logging.rb +23 -0
  43. data/lib/helene/sdb/base/transactions.rb +53 -0
  44. data/lib/helene/sdb/base/type.rb +137 -0
  45. data/lib/helene/sdb/base/types.rb +123 -0
  46. data/lib/helene/sdb/base/validations.rb +256 -0
  47. data/lib/helene/sdb/cast.rb +114 -0
  48. data/lib/helene/sdb/connection.rb +36 -0
  49. data/lib/helene/sdb/error.rb +5 -0
  50. data/lib/helene/sdb/interface.rb +412 -0
  51. data/lib/helene/sdb/sentinel.rb +15 -0
  52. data/lib/helene/sleepcycle.rb +29 -0
  53. data/lib/helene/superhash.rb +297 -0
  54. data/lib/helene/util.rb +132 -0
  55. data/test/auth.rb +31 -0
  56. data/test/helper.rb +98 -0
  57. data/test/integration/begin.rb +0 -0
  58. data/test/integration/ensure.rb +8 -0
  59. data/test/integration/s3/bucket.rb +106 -0
  60. data/test/integration/sdb/associations.rb +45 -0
  61. data/test/integration/sdb/creating.rb +13 -0
  62. data/test/integration/sdb/emptiness.rb +56 -0
  63. data/test/integration/sdb/hooks.rb +19 -0
  64. data/test/integration/sdb/limits.rb +27 -0
  65. data/test/integration/sdb/saving.rb +21 -0
  66. data/test/integration/sdb/selecting.rb +39 -0
  67. data/test/integration/sdb/types.rb +31 -0
  68. data/test/integration/sdb/validations.rb +60 -0
  69. data/test/integration/setup.rb +27 -0
  70. data/test/integration/teardown.rb +21 -0
  71. data/test/loader.rb +39 -0
  72. metadata +139 -0
@@ -0,0 +1,90 @@
1
+ module Helene
2
+ module Sdb
3
+ class Base
4
+ class Attribute
5
+ attr_accessor 'base'
6
+ attr_accessor 'name'
7
+ attr_accessor 'type'
8
+ attr_accessor 'nilable'
9
+ attr_accessor 'default'
10
+ attr_accessor 'has_default'
11
+ alias_method 'has_default?', 'has_default'
12
+
13
+ def initialize(*args, &block)
14
+ options = args.extract_options!.to_options!
15
+
16
+ @base = args.shift || raise(ArgumentError, 'no base')
17
+
18
+ @name = args.shift || raise(ArgumentError, 'no name')
19
+ @name = @name.to_s
20
+
21
+ type = args.empty? ? (options[:type]||:string) : args.shift.to_s.to_sym
22
+
23
+ @type = Type.for(type) || raise(ArgumentError, {:type => type}.inspect)
24
+
25
+ not_nilable = [:nil, :null, :nilable, :nullable].any?{|k| options[k]==false}
26
+ @nilable = !not_nilable
27
+
28
+ @default = options[:default]
29
+ @has_default = options.has_key?(:default)
30
+
31
+ code = <<-__
32
+ def #{ name }()
33
+ attributes[#{ name.inspect }]
34
+ end
35
+ alias_method #{ name.inspect }+'?', #{ name.inspect }
36
+ def #{ name }=(value)
37
+ attributes[#{ name.inspect }]=value
38
+ end
39
+ if not #{ @nilable }
40
+ validates_presence_of #{ name.inspect }
41
+ end
42
+ __
43
+
44
+ @base.module_eval(code, __FILE__, __LINE__)
45
+ end
46
+
47
+ def initialize_record(record)
48
+ unless record.attributes.has_key?(name)
49
+ value =
50
+ if has_default?
51
+ default.respond_to?(:call) ? record.instance_eval(&default) : default
52
+ else
53
+ nil
54
+ end
55
+ record.attributes[name] = value
56
+ end
57
+
58
+ if type.sti?
59
+ record.attributes[name] = record.class.name
60
+ end
61
+ end
62
+ end
63
+
64
+ class << Base
65
+ def attributes_table
66
+ @attributes_table ||= (Base==self ? SuperHash.new() : SuperHash.new(superclass.attributes_table))
67
+ #@attributes_table ||= (Base==self ? Array.fields() : superclass.attributes_table.clone)
68
+ end
69
+
70
+ def attributes
71
+ attributes_table.values
72
+ end
73
+
74
+ def attribute(*args, &block)
75
+ attribute = Attribute.new(self, *args, &block)
76
+ attributes_table[attribute.name] = attribute
77
+ end
78
+
79
+ def attribute_for(name)
80
+ attributes_table[name.to_s]
81
+ end
82
+
83
+ def type_for(name)
84
+ name = name.to_s
85
+ attributes_table[name].type if attributes_table.has_key?(name)
86
+ end
87
+ end
88
+ end
89
+ end
90
+ end
@@ -0,0 +1,20 @@
1
+ module Helene
2
+ module Sdb
3
+ class Base
4
+ class << Base
5
+ def connections(&block)
6
+ Sdb.connections(&block)
7
+ end
8
+
9
+ def connection
10
+ Sdb.connection
11
+ end
12
+ end
13
+
14
+ def connection
15
+ self.class.connection
16
+ end
17
+
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,20 @@
1
+ module Helene
2
+ module Sdb
3
+ class Base
4
+ class Error < Helene::Error; end
5
+ class RecordNotFound < Error; end
6
+ class RecordInvalid < Error; end
7
+ class RecordNotSaved < Error; end
8
+
9
+ class << Base
10
+ def error!(message)
11
+ raise Error.new(message.to_s)
12
+ end
13
+ end
14
+
15
+ def error!(message)
16
+ self.class.error!(message)
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,82 @@
1
+ module Helene
2
+ module Sdb
3
+ class Base
4
+ HOOKS = [
5
+ :before_initialize,
6
+ :after_initialize,
7
+ :before_load,
8
+ :after_load,
9
+ :before_create,
10
+ :after_create,
11
+ :before_update,
12
+ :after_update,
13
+ :before_validation,
14
+ :after_validation,
15
+ :before_save,
16
+ :after_save,
17
+ :before_destroy,
18
+ :after_destroy,
19
+ :before_delete,
20
+ :after_delete
21
+ ] unless defined?(HOOKS)
22
+
23
+ class << Base
24
+ unless defined?(HOOK_METHOD_AFTER_ASSOCIATION_WARNING)
25
+ HOOK_METHOD_AFTER_ASSOCIATION_WARNING = <<-__
26
+ *IMPORTANT:* In order for inheritance to work for the callback
27
+ queues, you must specify the callbacks before specifying the
28
+ associations. Otherwise, you might trigger the loading of a child
29
+ before the parent has registered the callbacks and they won’t be
30
+ inherited.
31
+ __
32
+ end
33
+
34
+ # Some fancy code generation here in order to define the hook class methods...
35
+ unless defined?(HOOK_METHOD_STR)
36
+ HOOK_METHOD_STR = <<-__
37
+ def Base.%s(method = nil, &block)
38
+ unless block
39
+ (raise Error, 'No hook method specified') unless method
40
+ block = lambda {send method}
41
+ end
42
+ add_hook(%s, &block)
43
+ end
44
+ __
45
+ end
46
+
47
+ def def_hook_method(m) #:nodoc:
48
+ instance_eval(HOOK_METHOD_STR % [m.to_s, m.inspect])
49
+ end
50
+
51
+ # Returns the hooks hash for the model class.
52
+ def hooks #:nodoc:
53
+ @hooks ||= Hash.new {|h, k| h[k] = []}
54
+ end
55
+
56
+ def hooks= hooks
57
+ @hooks = hooks
58
+ end
59
+
60
+ def add_hook(hook, &block) #:nodoc:
61
+ chain = hooks[hook]
62
+ chain << block
63
+ define_method(hook) do
64
+ return false if super == false
65
+ chain.each {|h| break false if instance_eval(&h) == false}
66
+ end
67
+ end
68
+
69
+ # Returns true if the model class or any of its ancestors have defined
70
+ # hooks for the given hook key. Notice that this method cannot detect
71
+ # hooks defined using overridden methods.
72
+ #def has_hooks?(key)
73
+ #has = hooks[key] && !hooks[key].empty?
74
+ #has || ((self != Base) && superclass.has_hooks?(key))
75
+ #end
76
+ end
77
+
78
+ HOOKS.each {|h| define_method(h) {}}
79
+ HOOKS.each {|h| def_hook_method(h)}
80
+ end
81
+ end
82
+ end
@@ -0,0 +1,52 @@
1
+ module Helene
2
+ module Sdb
3
+ class Base
4
+ class Literal < ::String
5
+ def Literal.for(*args)
6
+ new(args.join).freeze
7
+ end
8
+ def literal?
9
+ true
10
+ end
11
+ def literal
12
+ self
13
+ end
14
+ def inspect
15
+ "#{ self.class.name }(#{ string.inspect })"
16
+ end
17
+ def string
18
+ "#{ self }"
19
+ end
20
+ end
21
+
22
+ class << Base
23
+ def literal(*args)
24
+ Literal.for(*args)
25
+ end
26
+ def Literal(*args)
27
+ Literal.for(*args)
28
+ end
29
+ def literal?(*args)
30
+ args.all?{|arg| Literal === arg}
31
+ end
32
+ def Literal?(*args)
33
+ args.all?{|arg| Literal === arg}
34
+ end
35
+ end
36
+
37
+
38
+ def literal(*args)
39
+ Literal.for(*args)
40
+ end
41
+ def Literal(*args)
42
+ Literal.for(*args)
43
+ end
44
+ def literal?(*args)
45
+ args.all?{|arg| Literal === arg}
46
+ end
47
+ def Literal?(*args)
48
+ args.all?{|arg| Literal === arg}
49
+ end
50
+ end
51
+ end
52
+ end
@@ -0,0 +1,23 @@
1
+ module Helene
2
+ module Sdb
3
+ class Base
4
+ class << Base
5
+ def logger
6
+ Helene.logger
7
+ end
8
+
9
+ def log(*args, &block)
10
+ Helene.log(*args, &block)
11
+ end
12
+ end
13
+
14
+ def logger
15
+ Helene.logger
16
+ end
17
+
18
+ def log(*args, &block)
19
+ Helene.log(*args, &block)
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,53 @@
1
+ module Helene
2
+ module Sdb
3
+ class Base
4
+ module Transaction
5
+ attr_writer :id
6
+ attr_writer :time
7
+
8
+ def call(*args, &block)
9
+ return block.call() if id?
10
+ @id = generate_id
11
+ @time = Time.now.utc
12
+ begin
13
+ block.call()
14
+ ensure
15
+ @id = @time = nil
16
+ end
17
+ end
18
+
19
+ def id?
20
+ defined?(@id) and @id
21
+ end
22
+
23
+ def id
24
+ id? ? @id : generate_id
25
+ end
26
+
27
+ def generate_id
28
+ UUID.timestamp_create().to_s
29
+ end
30
+
31
+ def time?
32
+ defined?(@time) and @time
33
+ end
34
+
35
+ def time
36
+ time? ? @time : Time.now.utc
37
+ end
38
+
39
+ extend self
40
+ end
41
+
42
+ class << Base
43
+ def transaction(&block)
44
+ Transaction.call(&block)
45
+ end
46
+ end
47
+
48
+ def transaction(&block)
49
+ self.class.transaction.call(&block)
50
+ end
51
+ end
52
+ end
53
+ end
@@ -0,0 +1,137 @@
1
+ module Helene
2
+ module Sdb
3
+ class Base
4
+ class Type
5
+ unless defined?(INT_FMT)
6
+ INT_N_BYTES = [42].pack('i').size
7
+ INT_N_BITS = INT_N_BYTES * 8
8
+ INT_MAX = 2 ** (INT_N_BITS - 2) - 1
9
+ INT_MIN = -INT_MAX - 1
10
+ INT_OFF = INT_MAX / 2
11
+ INT_MAX_SIZE = INT_MAX.to_s.size
12
+ INT_MIN_SIZE = INT_MAX.to_s.size
13
+ INT_SIZE = [INT_MAX_SIZE, INT_MIN_SIZE].max
14
+ INT_FMT = "%0#{ INT_SIZE }d"
15
+ end
16
+
17
+ class << Type
18
+ def ruby_to_sdb(value)
19
+ value==nil ? Sentinel.Nil : value
20
+ end
21
+
22
+ def sdb_to_ruby(value)
23
+ value==Sentinel.Nil ? nil : value
24
+ end
25
+
26
+ def to_condition(value)
27
+ value==nil ? Sentinel.Nil : value
28
+ end
29
+
30
+ def ruby_to_sdb_for(&block)
31
+ block ||= lambda{|value| value}
32
+ lambda{|value| value==nil ? Sentinel.Nil : block.call(value)}
33
+ end
34
+
35
+ def sdb_to_ruby_for(&block)
36
+ block ||= lambda{|value| value}
37
+ lambda{|value| value==Sentinel.Nil ? nil : block.call(value)}
38
+ end
39
+
40
+ def to_condition_for(&block)
41
+ block ||= lambda{|value| value}
42
+ lambda{|value| value==nil ? Sentinel.Nil : block.call(value)}
43
+ end
44
+
45
+ def array_of_string value
46
+ [value].flatten.map{|val| val.to_s}
47
+ end
48
+
49
+ def format(&block)
50
+ define_method(:format, &block)
51
+ end
52
+
53
+ def list
54
+ @list ||= Array.fields
55
+ end
56
+
57
+ def for name
58
+ list[name.to_s.underscore]
59
+ end
60
+
61
+ def listify(*list)
62
+ [list].join(',').strip.split(%r/\s*,\s*/)
63
+ end
64
+
65
+ def name
66
+ @name ||= super
67
+ end
68
+ attr_writer :name
69
+
70
+ def type(name, *args, &block)
71
+ name = name.to_s.underscore
72
+ type = new(name, &block)
73
+ list[type.name] = type
74
+
75
+ ["set_of_#{ name.singularize }", "set_of_#{ name.pluralize }"].uniq.each do |set_of_name|
76
+ set_of_type =
77
+ new(set_of_name) do
78
+ ruby_to_sdb do |values|
79
+ values = Array(values).flatten
80
+ values.each{|value| type.ruby_to_sdb(value)}
81
+ end
82
+ sdb_to_ruby do |values|
83
+ values = Array(values).flatten
84
+ values.each{|value| type.sdb_to_ruby(value)}
85
+ end
86
+ end
87
+ list[set_of_type.name] = set_of_type
88
+ end
89
+
90
+ type
91
+ end
92
+ alias_method 'register_type', 'type'
93
+ end
94
+
95
+ # instance methods
96
+ #
97
+ attr_accessor :name
98
+
99
+ def initialize name, &block
100
+ @name = name
101
+ @ruby_to_sdb = Type.method(:ruby_to_sdb).to_proc
102
+ @sdb_to_ruby = Type.method(:sdb_to_ruby).to_proc
103
+ @to_condition = nil
104
+ instance_eval(&block)
105
+ end
106
+
107
+ def ruby_to_sdb(value=nil, &block)
108
+ if block
109
+ @ruby_to_sdb = Type.ruby_to_sdb_for(&block)
110
+ else
111
+ @ruby_to_sdb.call(value)
112
+ end
113
+ end
114
+
115
+ def sdb_to_ruby(value=nil, &block)
116
+ if block
117
+ @sdb_to_ruby = Type.sdb_to_ruby_for(&block)
118
+ else
119
+ @sdb_to_ruby.call(value)
120
+ end
121
+ end
122
+
123
+ def to_condition(value=nil, &block)
124
+ if block
125
+ @to_condition = Type.to_condition_for(&block)
126
+ else
127
+ (@to_condition || @ruby_to_sdb).call(value)
128
+ end
129
+ end
130
+
131
+ def sti?
132
+ name == 'sti'
133
+ end
134
+ end
135
+ end
136
+ end
137
+ end