vex 0.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (114) hide show
  1. data/Manifest +112 -0
  2. data/Rakefile +53 -0
  3. data/VERSION +1 -0
  4. data/config/README +2 -0
  5. data/config/dependencies.rb +10 -0
  6. data/config/gem.yml +7 -0
  7. data/init.rb +36 -0
  8. data/lib/nokogiri/nokogiri_ext.rb +96 -0
  9. data/lib/vex.rb +5 -0
  10. data/lib/vex/action_controller.rb +4 -0
  11. data/lib/vex/action_controller/verify_action.rb +97 -0
  12. data/lib/vex/action_controller/whitelisted_actions.rb +45 -0
  13. data/lib/vex/active_record.rb +3 -0
  14. data/lib/vex/active_record/__init__.rb +0 -0
  15. data/lib/vex/active_record/advisory_lock.rb +11 -0
  16. data/lib/vex/active_record/advisory_lock/mysql_adapter.rb +16 -0
  17. data/lib/vex/active_record/advisory_lock/sqlite_adapter.rb +78 -0
  18. data/lib/vex/active_record/belongs_to_many.rb +143 -0
  19. data/lib/vex/active_record/find_by_extension.rb +70 -0
  20. data/lib/vex/active_record/gem.rb +8 -0
  21. data/lib/vex/active_record/lite_table.rb +139 -0
  22. data/lib/vex/active_record/lite_view.rb +140 -0
  23. data/lib/vex/active_record/mass_load.rb +65 -0
  24. data/lib/vex/active_record/mysql_backup.rb +21 -0
  25. data/lib/vex/active_record/plugins/default_value_for/LICENSE.TXT +19 -0
  26. data/lib/vex/active_record/plugins/default_value_for/README.rdoc +421 -0
  27. data/lib/vex/active_record/plugins/default_value_for/Rakefile +6 -0
  28. data/lib/vex/active_record/plugins/default_value_for/init.rb +91 -0
  29. data/lib/vex/active_record/plugins/default_value_for/test.rb +279 -0
  30. data/lib/vex/active_record/plugins/default_value_for/test.sqlite3 +0 -0
  31. data/lib/vex/active_record/random_id.rb +56 -0
  32. data/lib/vex/active_record/resolver.rb +49 -0
  33. data/lib/vex/active_record/serialize_hash.rb +125 -0
  34. data/lib/vex/active_record/to_html.rb +53 -0
  35. data/lib/vex/active_record/validate.rb +76 -0
  36. data/lib/vex/active_record/validation_error_ext.rb +68 -0
  37. data/lib/vex/base.rb +2 -0
  38. data/lib/vex/base/app.rb +75 -0
  39. data/lib/vex/base/array/at_random.rb +17 -0
  40. data/lib/vex/base/array/cross.rb +26 -0
  41. data/lib/vex/base/array/each_batch.rb +32 -0
  42. data/lib/vex/base/array/parallel_map.rb +98 -0
  43. data/lib/vex/base/deprecation.rb +41 -0
  44. data/lib/vex/base/enumerable/deep.rb +95 -0
  45. data/lib/vex/base/enumerable/enumerable_ext.rb +59 -0
  46. data/lib/vex/base/enumerable/progress.rb +71 -0
  47. data/lib/vex/base/filesystem/fast_copy.rb +61 -0
  48. data/lib/vex/base/filesystem/grep.rb +34 -0
  49. data/lib/vex/base/filesystem/lock.rb +43 -0
  50. data/lib/vex/base/filesystem/lock.rb.test.lck +0 -0
  51. data/lib/vex/base/filesystem/lock.rb.test.pid +1 -0
  52. data/lib/vex/base/filesystem/make_dirs.rb +94 -0
  53. data/lib/vex/base/filesystem/parse_filename.rb +36 -0
  54. data/lib/vex/base/filesystem/tmp_file.rb +87 -0
  55. data/lib/vex/base/filesystem/write.rb +43 -0
  56. data/lib/vex/base/hash/compact.rb +38 -0
  57. data/lib/vex/base/hash/cross.rb +117 -0
  58. data/lib/vex/base/hash/easy_access.rb +141 -0
  59. data/lib/vex/base/hash/ensure_keys.rb +18 -0
  60. data/lib/vex/base/hash/extract.rb +71 -0
  61. data/lib/vex/base/hash/extras.rb +62 -0
  62. data/lib/vex/base/hash/inspect.rb +17 -0
  63. data/lib/vex/base/hash/simple_access_methods.rb +74 -0
  64. data/lib/vex/base/invalid_argument/invalid_argument.rb +97 -0
  65. data/lib/vex/base/local_conf.rb +35 -0
  66. data/lib/vex/base/net/http_ext.rb +227 -0
  67. data/lib/vex/base/net/socket_ext.rb +43 -0
  68. data/lib/vex/base/object/insp.rb +123 -0
  69. data/lib/vex/base/object/multiple_attributes.rb +58 -0
  70. data/lib/vex/base/object/singleton_methods.rb +23 -0
  71. data/lib/vex/base/object/with_benchmark.rb +110 -0
  72. data/lib/vex/base/range_array.rb +40 -0
  73. data/lib/vex/base/range_ext.rb +28 -0
  74. data/lib/vex/base/safe_token.rb +156 -0
  75. data/lib/vex/base/string/string_ext.rb +136 -0
  76. data/lib/vex/base/thread/deferred.rb +52 -0
  77. data/lib/vex/base/thread/sleep.rb +11 -0
  78. data/lib/vex/base/time/date_ext.rb +12 -0
  79. data/lib/vex/boot.rb +40 -0
  80. data/lib/vex/boot/array.rb +22 -0
  81. data/lib/vex/boot/blank.rb +41 -0
  82. data/lib/vex/boot/string.rb +60 -0
  83. data/migration/create_request_log.rb +28 -0
  84. data/r.rb +35 -0
  85. data/script/console +19 -0
  86. data/script/rebuild +7 -0
  87. data/tasks/echoe.rake +52 -0
  88. data/tasks/validate_db.rake +14 -0
  89. data/test/ar.rb +30 -0
  90. data/test/auto.rb +31 -0
  91. data/test/base-tests/local_conf.rb +25 -0
  92. data/test/base.rb +2 -0
  93. data/test/boot.rb +3 -0
  94. data/test/config/local.defaults.yml +4 -0
  95. data/test/config/local.yml +8 -0
  96. data/test/test.sqlite3 +0 -0
  97. data/test/test.sqlite3.Class#create.lck +0 -0
  98. data/test/test.sqlite3.Class#create.lck.lck +0 -0
  99. data/test/test.sqlite3.Class#create.lck.pid +1 -0
  100. data/test/test.sqlite3.Class#create.pid +1 -0
  101. data/test/test.sqlite3.LiteView.make.holders__view_dummy.lck +0 -0
  102. data/test/test.sqlite3.LiteView.make.holders__view_dummy.lck.lck +0 -0
  103. data/test/test.sqlite3.LiteView.make.holders__view_dummy.lck.pid +1 -0
  104. data/test/test.sqlite3.LiteView.make.holders__view_dummy.pid +1 -0
  105. data/test/test.sqlite3.vex.lck +0 -0
  106. data/test/test_helper.rb +49 -0
  107. data/test/tmp/copy.dat +1 -0
  108. data/test/tmp/lock.sqlite3 +0 -0
  109. data/test/tmp/lock.sqlite3.etest.lck +0 -0
  110. data/test/tmp/lock.sqlite3.etest.pid +1 -0
  111. data/test/tmp/somedata.dat +61 -0
  112. data/vex.gemspec +49 -0
  113. data/vex.tmproj +186 -0
  114. metadata +305 -0
@@ -0,0 +1,141 @@
1
+ #
2
+ # - allows to use hash.xx.yy where you would have to use
3
+ # hash["xx"][:yy] etc.
4
+ #
5
+ # - supports
6
+ #
7
+ # hash.xx?
8
+ #
9
+ # as a shortcut for hash.key?(:xx) || hash.key?("xx")
10
+ #
11
+ # - does not support assignment, though; i.e.
12
+ #
13
+ # hash.yy = zz
14
+ #
15
+ # will raise a NoMethodError.
16
+ #
17
+ class Hash
18
+ module EasyAccess
19
+ def self.extended(host)
20
+ host.instance_variable_set "@easy_accessible", true
21
+ end
22
+
23
+ def method_missing(sym, *args, &block)
24
+ return super if block_given?
25
+
26
+ if args.length == 0 && sym.to_s =~ /^(.*)\?$/
27
+ !! EasyAccess.check(self, $1)
28
+ elsif args.length == 0
29
+ EasyAccess.fetch(self, sym)
30
+ elsif args.length == 1 && sym.to_s =~ /^(.*)\=$/
31
+ v = args.first
32
+ v = v.dup if v.is_a?(Hash)
33
+ EasyAccess.set(self, $1, v)
34
+ else
35
+ super
36
+ end
37
+ end
38
+
39
+ def respond_to?(sym)
40
+ key = case sym.to_s
41
+ when /^(.*)[=\?]$/
42
+ $1
43
+ else
44
+ sym.to_s
45
+ end
46
+
47
+ EasyAccess.check(self, key) || super
48
+ end
49
+
50
+ def self.check_key(hash, key)
51
+ key if hash.key?(key)
52
+ end
53
+
54
+ def self.check(hash, key)
55
+ check_key(hash, key.to_s) || check_key(hash, key.to_sym)
56
+ end
57
+
58
+ def self.fetch(hash, key)
59
+ if !(k = check(hash, key))
60
+ raise NoMethodError, "undefined key `#{key}' for #{self.inspect}"
61
+ end
62
+
63
+ easy_access hash.fetch(k)
64
+ end
65
+
66
+ def self.set(hash, key, value)
67
+ k = check(hash, key) || key
68
+ hash[k] = value
69
+ end
70
+
71
+ def self.easy_access(obj)
72
+ obj.easy_access! if obj.is_a?(Hash)
73
+ obj
74
+ end
75
+ end
76
+
77
+ def easy_access
78
+ dup.easy_access!
79
+ end
80
+
81
+ def easy_access!
82
+ # extend always returns self
83
+ extend(EasyAccess)
84
+ end
85
+
86
+ def easy_accessible?
87
+ @easy_accessible
88
+ end
89
+ end
90
+
91
+ module Hash::EasyAccess::Etest
92
+ def test_easy_access_hashes
93
+ h = { :a => { "b" => "ccc" }}
94
+ h1 = h.easy_access!
95
+ assert h.easy_accessible?
96
+ assert h1.easy_accessible?
97
+
98
+ assert_equal("ccc", h.a.b)
99
+ assert h1.object_id == h.object_id
100
+
101
+ assert h.a?
102
+ assert !h.b?
103
+ assert h.a.b?
104
+ assert !h.a.c?
105
+ end
106
+
107
+ def test_easy_access_hashes_2
108
+ h = { :a => { "b" => "ccc" }}
109
+ h1 = h.easy_access
110
+ assert !h.easy_accessible?
111
+ assert h1.easy_accessible?
112
+
113
+ assert_equal("ccc", h1.a.b)
114
+ assert h1.object_id != h.object_id
115
+
116
+ assert h1.a?
117
+ assert !h1.b?
118
+ assert h1.a.b?
119
+ assert !h1.a.c?
120
+ end
121
+
122
+ def test_easy_access_assigns
123
+ h = { :a => { "b" => "ccc" }}
124
+ h.easy_access!
125
+
126
+ h.a = 2
127
+
128
+ assert_equal({ :a => 2}, h)
129
+
130
+ h.b = 2
131
+ assert_equal({ :a => 2, "b" => 2}, h)
132
+
133
+ v = { :c => { :d => 2 } }
134
+ assert !v.easy_accessible?
135
+
136
+ h.b = v
137
+ assert_equal(2, h.b.c.d)
138
+ assert !v.easy_accessible?
139
+ assert h.b.easy_accessible?
140
+ end
141
+ end if VEX_TEST == "base"
@@ -0,0 +1,18 @@
1
+ module Hash::EnsureKeys
2
+ def keys?(*keys)
3
+ (keys - self.keys()).empty?
4
+ end
5
+ end
6
+
7
+ class Hash
8
+ include EnsureKeys
9
+ end
10
+
11
+ module Hash::EnsureKeys::Etest
12
+ def test_ensure_keys
13
+ h = { :a => "a" }
14
+ assert_equal true, h.keys?(:a)
15
+ assert_equal true, h.keys?
16
+ assert_equal false, h.keys?(:a, :b)
17
+ end
18
+ end if VEX_TEST == "base"
@@ -0,0 +1,71 @@
1
+ module Hash::Extract
2
+ def extract(*args)
3
+ extract_mapped(:[], *args)
4
+ end
5
+
6
+ # i.e. extract_and_delete
7
+ def extract!(*args)
8
+ extract_mapped(:delete, *args)
9
+ end
10
+
11
+ private
12
+
13
+ def extract_mapped(sym, *args)
14
+ translate = args.extract_options!
15
+
16
+ hash = args.inject({}) do |hash, k|
17
+ hash.update k => self.send(sym, k) if has_key?(k)
18
+ hash
19
+ end
20
+
21
+ translate.inject(hash) do |hash, (k, v)|
22
+ if has_key?(k)
23
+ value = self.send(sym, k)
24
+ hash.update v => value unless v.nil?
25
+ end
26
+ hash
27
+ end
28
+ end
29
+ end
30
+
31
+ class Hash
32
+ include Extract
33
+ end
34
+
35
+ module Hash::Extract::Etest
36
+ def test_extract
37
+ h = { :a => "1", :b => "2" }
38
+ assert_equal(h.extract(:a, :c), {:a => "1"})
39
+ end
40
+
41
+ def orig
42
+ { 1 => 2, 3 => 4, 5 => 6}
43
+ end
44
+
45
+ def test_extract_w_delete!
46
+ h = orig
47
+ assert_equal ({1=>2}), h.extract!(1, 2, 3 => nil)
48
+ assert_equal ({5 => 6}), h
49
+ end
50
+
51
+ def test_extract!
52
+ h = orig
53
+ assert_equal ({1=>2, 3 => 4}), h.extract!(1, 2, 3)
54
+ assert_equal ({5 => 6}), h
55
+
56
+ h = orig
57
+ assert_equal ({1=>2, :a => 4}), h.extract!(1, 2, 3 => :a)
58
+ assert_equal ({5 => 6}), h
59
+ end
60
+
61
+ def test_extract2
62
+ assert_nothing_raised {
63
+ h = orig.freeze
64
+ assert_equal ({1=>2, 3 => 4}), h.extract(1, 2, 3)
65
+ assert_equal orig, h
66
+
67
+ assert_equal ({1=>2, :a => 4}), h.extract(1, 2, 3 => :a)
68
+ assert_equal orig, h
69
+ }
70
+ end
71
+ end if VEX_TEST == "base"
@@ -0,0 +1,62 @@
1
+ module Hash::Extras
2
+ def self.included(klass)
3
+ klass.extend ClassMethods
4
+ end
5
+
6
+ module ClassMethods
7
+ def create(keys, values)
8
+ self[*keys.zip(values).flatten]
9
+ end
10
+ end
11
+
12
+ # compare
13
+ def hmap(&block)
14
+ self.inject({}) { |h, i|
15
+ h.update i[0] => yield(i[0], i[1])
16
+ h
17
+ }
18
+ end
19
+
20
+ def delete_all(*args)
21
+ args.inject([]) do |array, arg|
22
+ array << delete(arg)
23
+ end
24
+ end
25
+
26
+ def select_entries(*args)
27
+ args.inject([]) do |array, arg|
28
+ array << self[arg]
29
+ end
30
+ end
31
+ end
32
+
33
+ class Hash
34
+ include Extras
35
+ end
36
+
37
+ module Hash::Extras::Etest
38
+ def test_create
39
+ h = Hash.create([:a, :b], ["aa", "bb"])
40
+
41
+ assert_equal({ :a => "aa", :b => "bb"}, h)
42
+ end
43
+
44
+ def test_hmap
45
+ h = { 1 => "a", 2 => "b" }
46
+ assert_equal({ 1 => "a", 2 => "bb"}, h.hmap do |k,v| v * k end)
47
+ end
48
+
49
+ def test_delete_all
50
+ h = { 1 => "a", 2 => "b" }
51
+ assert_equal([ "a", nil ], h.delete_all(1, 3))
52
+ assert_equal({ 2 => "b"}, h)
53
+ end
54
+
55
+ def test_select
56
+ h = { 1 => "a", 2 => "b" }
57
+ h_orig = h.dup
58
+
59
+ assert_equal([ "a", nil ], h.select_entries(1, 3))
60
+ assert_equal(h_orig, h)
61
+ end
62
+ end if VEX_TEST == "base"
@@ -0,0 +1,17 @@
1
+
2
+ class Hash
3
+ def inspect
4
+ "{" + to_a.sort_by do |k, v|
5
+ k.to_s
6
+ end.map do |k,v|
7
+ "#{k.inspect} => #{v.inspect}"
8
+ end.join(", ") + "}"
9
+ end
10
+ end
11
+
12
+ module Hash::Etest
13
+ def test_inspect
14
+ h = {"b" => 2, :a => 2}
15
+ assert_equal('{:a => 2, "b" => 2}', h.inspect)
16
+ end
17
+ end if VEX_TEST == "base"
@@ -0,0 +1,74 @@
1
+ class Hash
2
+ def with_simple_access
3
+ Deprecation.report "Hash#with_simple_access", "Hash#easy_access"
4
+ easy_access!
5
+ end
6
+ end
7
+
8
+ module Hash::SimpleAccessMethods; end
9
+
10
+ module Hash::SimpleAccessMethods::Etest
11
+ def test_simple_access
12
+ h = { :a => "aa", :b => "bb", "c" => "cc" }
13
+ Deprecation.quiet do
14
+ h.with_simple_access
15
+ end
16
+
17
+ assert_equal("aa", h.a)
18
+ assert_equal("bb", h.b)
19
+ assert_equal("cc", h.c)
20
+ end
21
+
22
+ def test_missing_methods
23
+ h = { :a => "aa", :b => "bb", "c" => "cc" }
24
+ Deprecation.quiet do
25
+ h.with_simple_access
26
+ end
27
+ assert_raise(NoMethodError) { h.x }
28
+ assert_raise(NoMethodError) { h.a(1) }
29
+ end
30
+
31
+ def test_assignments
32
+ h = { :a => "aa", :b => "bb", "c" => "cc" }
33
+ Deprecation.quiet do
34
+ h.with_simple_access
35
+ end
36
+
37
+ h.a = 2
38
+ assert_equal(2, h.a)
39
+ end
40
+
41
+ def test_respond_to
42
+ h = { :a => "aa", :b => "bb", "c" => "cc" }
43
+ Deprecation.quiet do
44
+ h.with_simple_access
45
+ end
46
+
47
+ assert(h.respond_to?(:a))
48
+ assert(h.respond_to?(:b))
49
+ assert(h.respond_to?(:c))
50
+ assert(h.respond_to?(:"a="))
51
+
52
+ assert(h.respond_to?("a="))
53
+ assert(h.respond_to?("a"))
54
+
55
+ assert(h.respond_to?("c="))
56
+ assert(h.respond_to?("c"))
57
+
58
+ # inherited methods
59
+ assert(h.respond_to?("keys"))
60
+
61
+ # inherited methods
62
+ assert(!h.respond_to?("unknown_key"))
63
+ assert(!h.respond_to?("unknown_key="))
64
+ end
65
+
66
+ def test_simple_access_deep
67
+ h = { :a => { :b => "bb" } }
68
+ Deprecation.quiet do
69
+ h.with_simple_access
70
+ end
71
+
72
+ assert_equal("bb", h.a.b)
73
+ end
74
+ end if VEX_TEST == "base"
@@ -0,0 +1,97 @@
1
+ def ArgumentError.message(default_text, *args)
2
+ msg = args.first.is_a?(String) ? args.shift : default_text
3
+
4
+ case args.length
5
+ when 0 then msg
6
+ when 1 then "#{msg}: #{args.first.inspect}"
7
+ else "#{msg}: #{args.inspect}"
8
+ end
9
+ end
10
+
11
+ class InvalidArgument < ArgumentError
12
+ def initialize(*args)
13
+ super ArgumentError.message("Invalid argument", *args)
14
+ end
15
+ end
16
+
17
+ def invalid_argument!(*args)
18
+ raise InvalidArgument.new(*args)
19
+ end
20
+
21
+ class MissingOptions < ArgumentError
22
+ def initialize(*args)
23
+ super ArgumentError.message("Missing options", *args)
24
+ end
25
+ end
26
+
27
+ def missing_options!(*args)
28
+ raise MissingOptions.new(*args)
29
+ end
30
+
31
+ class MissingImplementation < ArgumentError
32
+ def initialize(*args)
33
+ super ArgumentError.message("Missing options", *args)
34
+ end
35
+ end
36
+
37
+ class Module
38
+ def not_implemented(*args)
39
+ class_eval args.map { |arg| "def #{arg}(*args); not_implemented!; end\n" }.join
40
+ end
41
+ end
42
+
43
+ class Object
44
+ def not_implemented!
45
+ raise MissingImplementation.new "#{self.class}##{caller_method_name}"
46
+ end
47
+
48
+ private
49
+
50
+ def caller_method_name
51
+ parse_caller(caller(2).first).last || "unknown"
52
+ end
53
+
54
+ def parse_caller(at)
55
+ if /^(.+?):(\d+)(?::in `(.*)')?/ =~ at
56
+ file = Regexp.last_match[1]
57
+ line = Regexp.last_match[2].to_i
58
+ method = Regexp.last_match[3]
59
+ [file, line, method]
60
+ end
61
+ end
62
+ end
63
+
64
+ module Module::Etest
65
+ class X
66
+ not_implemented :a, :b
67
+
68
+ def c(x)
69
+ invalid_argument! "This is strange" unless x == 0
70
+ end
71
+
72
+ def d(x)
73
+ missing_options! :a, :b unless x.keys?(:a, :b)
74
+ end
75
+ end
76
+
77
+ def test_missing
78
+ assert_raise(MissingImplementation) { X.new.a }
79
+ assert_raise(MissingImplementation) { X.new.a 1, 2 }
80
+ end
81
+
82
+ def test_missing_options
83
+ assert_raises_kind_of(ArgumentError) {
84
+ X.new.d :a => "b", :c => "d"
85
+ }
86
+ end
87
+
88
+ def test_invalid_argument
89
+ assert_raises_kind_of(ArgumentError) {
90
+ X.new.c 1
91
+ }
92
+
93
+ assert_nothing_raised {
94
+ X.new.c 0
95
+ }
96
+ end
97
+ end if VEX_TEST == "base"