vex 0.2

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 (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,34 @@
1
+ module File::Grep
2
+ def grep(rex, *files)
3
+ files = files.flatten
4
+
5
+ unless block_given?
6
+ results = []
7
+ grep(rex, files) do |line, file, *args|
8
+ results << [ line, file ]
9
+ end
10
+ return results
11
+ end
12
+
13
+ files.each do |file|
14
+ File.readlines(file).each do |line|
15
+ next unless matches = (rex.match(line))
16
+ yield line, file, matches
17
+ end
18
+ end
19
+ end
20
+ end
21
+
22
+ File.extend File::Grep
23
+
24
+ module File::Grep::Etest
25
+ def test_grep
26
+ assert_equal 4, File.grep(/Etest/, __FILE__).length
27
+ assert_equal 5, File.grep(/ETEST/i, __FILE__).length
28
+ end
29
+
30
+ def test_greps
31
+ assert_equal 8, File.grep(/Etest/, [ __FILE__, __FILE__ ]).length
32
+ assert_equal 8, File.grep(/Etest/, __FILE__, __FILE__ ).length
33
+ end
34
+ end if VEX_TEST == "base"
@@ -0,0 +1,43 @@
1
+ module File::Lock
2
+ #
3
+ # File.locked implements recursive locking based on lock files.
4
+ def locked(path, &block)
5
+ file = File.open "#{path}.lck", "w+"
6
+ begin
7
+ # First try to lock the file nonblockingly.
8
+ # Failing that it might be already locked by *this* process.
9
+ # Otherwise it is locked by someone else.
10
+ if locked = file.flock(File::LOCK_EX | File::LOCK_NB)
11
+ File.write("#{path}.pid", Thread.uid)
12
+ elsif File.read("#{path}.pid") == Thread.uid
13
+ # already locked by us.
14
+ else
15
+ locked = file.flock(File::LOCK_EX)
16
+ end
17
+
18
+ yield
19
+ ensure
20
+ file.flock(File::LOCK_UN) if locked
21
+ end
22
+ end
23
+ end
24
+
25
+ File.extend File::Lock
26
+
27
+ module File::Lock::Etest
28
+ TESTFILE = "#{__FILE__}.test"
29
+
30
+ def test_lock
31
+ i = 1
32
+ File.locked TESTFILE do
33
+ File.locked TESTFILE do
34
+ i = 2
35
+ end
36
+ end
37
+
38
+ assert_equal(2, i)
39
+ end
40
+
41
+ def test_lock_unsuccessful
42
+ end
43
+ end if VEX_TEST == "base"
File without changes
@@ -0,0 +1 @@
1
+ 7394.106710
@@ -0,0 +1,94 @@
1
+ module Dir::MakeDirs
2
+ def exists?(path)
3
+ begin
4
+ Dir.open(path) && true
5
+ rescue Errno::ENOENT, Errno::ENOTDIR
6
+ false
7
+ end
8
+ end
9
+
10
+ def mkdirs(path)
11
+ paths = path.split("/")
12
+ paths.each_with_index do |path, idx|
13
+ p = paths[0..idx].join("/")
14
+ next if p.empty? # This is root
15
+ next if exists?(p)
16
+ mkdir(p)
17
+ end
18
+ end
19
+
20
+ def rmdirs(path)
21
+ Dir.glob("#{path}/**/*", File::FNM_DOTMATCH).sort.reverse.each do |file|
22
+ if File.directory?(file)
23
+ next if file =~ /\/\.\.?$/
24
+ Dir.rmdir(file)
25
+ else
26
+ File.unlink(file)
27
+ end
28
+ end
29
+
30
+ Dir.rmdir(path)
31
+ end
32
+
33
+ def tmp(do_unlink = true, &block)
34
+ path = "#{App.tmpdir}/#{$$}_#{Thread.current.object_id}"
35
+ Dir.mkdirs path
36
+
37
+ r = yield(path)
38
+ ensure
39
+ Dir.rmdirs(path) if path && do_unlink
40
+ end
41
+ end
42
+
43
+ Dir.extend Dir::MakeDirs
44
+
45
+ module Dir::MakeDirs::Etest
46
+ def test_mkdirs
47
+ base = File.dirname(__FILE__) + "/dirtest"
48
+
49
+ assert !Dir.exists?(base)
50
+ Dir.mkdirs "#{base}/a/b/c"
51
+ Dir.mkdirs "#{base}/a/b/.dot"
52
+ assert Dir.exists?(base)
53
+ assert Dir.exists?("#{base}/a/b/c")
54
+
55
+ File.touch "#{base}/a/b/x.y"
56
+ File.touch "#{base}/a/b/.x.y"
57
+ File.touch "#{base}/a/b/..x.y"
58
+ File.touch "#{base}/a/b/.dot/a"
59
+
60
+ Dir.rmdirs("#{base}")
61
+ assert !Dir.exists?(base)
62
+ assert !Dir.exists?("#{base}/a/b/c")
63
+ end
64
+
65
+ def test_exists
66
+ assert Dir.exists?(File.dirname(__FILE__))
67
+ assert !Dir.exists?(__FILE__)
68
+ assert !Dir.exists?(__FILE__ + ".unknown")
69
+ assert !Dir.exists?(__FILE__ + ":invalid")
70
+ end
71
+
72
+ def test_tmpdir
73
+ p = nil
74
+ Dir.tmp do |pdir|
75
+ p = pdir
76
+ end
77
+
78
+ assert p.starts_with?("#{App.tmpdir}/")
79
+ assert_file_doesnt_exist p
80
+ end
81
+
82
+ def test_tmpdir_unlinks_on_raise
83
+ p = nil
84
+ assert_raise(RuntimeError) {
85
+ Dir.tmp do |pdir|
86
+ p = pdir
87
+ raise RuntimeError
88
+ end
89
+ }
90
+
91
+ assert p.starts_with?("#{App.tmpdir}/")
92
+ assert_file_doesnt_exist p
93
+ end
94
+ end if VEX_TEST == "base"
@@ -0,0 +1,36 @@
1
+ class File
2
+ def self.basename_wo_ext(s)
3
+ bn = File.basename(s)
4
+ if bn =~ /^(.*)\.([^.]*)$/
5
+ $1
6
+ else
7
+ bn
8
+ end
9
+ end
10
+
11
+ #
12
+ # File.extname_wo_dot("x.y") => "y"
13
+ # File.extname_wo_dot("x.") => ""
14
+ # File.extname_wo_dot(".y") => ""
15
+ # File.extname_wo_dot("x") => ""
16
+ #
17
+ def self.extname_wo_dot(s)
18
+ File.extname(s) =~ /^\.([^.]*)$/ ? $1 : ""
19
+ end
20
+ end
21
+
22
+ module File::Etest
23
+ def test_extname_wo_dot
24
+ assert_equal "y", File.extname_wo_dot("x.y")
25
+ assert_equal "", File.extname_wo_dot("x.")
26
+ assert_equal "", File.extname_wo_dot(".y")
27
+ assert_equal "", File.extname_wo_dot("x")
28
+ end
29
+
30
+ def test_basename_wo_ext
31
+ assert_equal "x", File.basename_wo_ext("x.y")
32
+ assert_equal "x", File.basename_wo_ext("x.")
33
+ assert_equal "", File.basename_wo_ext(".y")
34
+ assert_equal "x", File.basename_wo_ext("x")
35
+ end
36
+ end if VEX_TEST == "base"
@@ -0,0 +1,87 @@
1
+ module FileUtils::TmpFile
2
+ def self.counter
3
+ Thread.current["tmpfiles"] ||= 0
4
+ Thread.current["tmpfiles"] += 1
5
+ end
6
+
7
+ #
8
+ # tmpfile("xx.jpg") do |dest|
9
+ # Net.download("http://xx.yy.zz/a.jpg", dest)
10
+ # end
11
+ #
12
+ # the block gets the temp file name, which is guaranteed to be
13
+ # unique amongst all running processes.
14
+ #
15
+ # If the path parameter is set the temporary file will be fastcopied
16
+ # to that output file.
17
+ def tmpfile(path=nil, &block)
18
+ raise ArgumentError, "This no longer supports Symbol parameters" if path.is_a?(Symbol)
19
+ ext = "#{Thread.uid}_#{FileUtils::TmpFile.counter}"
20
+
21
+ case path
22
+ when nil
23
+ tmp = "#{App.tmpdir}/data.#{ext}"
24
+ else
25
+ Dir.mkdirs(File.dirname(path))
26
+ tmp = "#{path}.tmp#{ext}"
27
+ end
28
+
29
+ begin
30
+ result = yield(tmp)
31
+ if result != false && path && File.exist?(tmp)
32
+ FileUtils.fast_copy(tmp, path)
33
+ end
34
+ return result
35
+ ensure
36
+ File.unlink(tmp) if File.exists?(tmp)
37
+ end
38
+ end
39
+ end
40
+
41
+ FileUtils.extend FileUtils::TmpFile
42
+
43
+ module FileUtils::TmpFile::Etest
44
+ def test_tmpfile
45
+ assert File.exist?(__FILE__)
46
+
47
+ # so something successfully via a tmp file
48
+ FileUtils.fast_copy __FILE__, "tmp/copy.dat"
49
+ assert File.exist?("tmp/copy.dat")
50
+
51
+ FileUtils.tmpfile "tmp/copy.dat" do |dest|
52
+ false
53
+ end
54
+
55
+ assert_equal File.size(__FILE__), File.size("tmp/copy.dat")
56
+
57
+ FileUtils.tmpfile "tmp/copy.dat" do |dest|
58
+ File.write(dest, "hey")
59
+ end
60
+
61
+ assert_equal 3, File.size("tmp/copy.dat")
62
+
63
+ FileUtils.fast_copy __FILE__, "tmp/copy.dat"
64
+ assert_equal File.size(__FILE__), File.size("tmp/copy.dat")
65
+
66
+ FileUtils.tmpfile "tmp/copy.dat" do |dest|
67
+ File.write(dest, "hey")
68
+ false
69
+ end
70
+
71
+ assert_equal File.size(__FILE__), File.size("tmp/copy.dat")
72
+
73
+ FileUtils.tmpfile "tmp/copy.dat" do |dest|
74
+ File.write(dest, "hey")
75
+ nil
76
+ end
77
+
78
+ assert_equal 3, File.size("tmp/copy.dat")
79
+
80
+ r = FileUtils.tmpfile "tmp/copy.dat" do |dest|
81
+ File.write(dest, "hey")
82
+ "fourfour"
83
+ end
84
+
85
+ assert_equal "fourfour", r
86
+ end
87
+ end if VEX_TEST == "base"
@@ -0,0 +1,43 @@
1
+ module File::Write
2
+ def touch(*files)
3
+ files.each do |file|
4
+ File.open(file, "w") do |f|
5
+ end
6
+ end
7
+ end
8
+
9
+ def write(path, data)
10
+ File.open(path, "w+") do |file|
11
+ file.write(data)
12
+ end
13
+ path
14
+ end
15
+ end
16
+
17
+ File.extend File::Write
18
+
19
+ module File::Write::Etest
20
+ TESTFILE = "#{__FILE__}.test"
21
+
22
+ def test_touches
23
+ assert !File.exist?(TESTFILE)
24
+ File.touch TESTFILE
25
+ assert File.exist?(TESTFILE)
26
+ File.touch TESTFILE
27
+ assert File.exist?(TESTFILE)
28
+ File.unlink TESTFILE
29
+ assert !File.exist?(TESTFILE)
30
+ end
31
+
32
+ def test_writes
33
+ assert !File.exist?(TESTFILE)
34
+ File.write TESTFILE, "blabber"
35
+ assert_equal("blabber", File.read(TESTFILE))
36
+ File.write TESTFILE, "bla"
37
+ assert_equal("bla", File.read(TESTFILE))
38
+ File.write TESTFILE, ""
39
+ assert_equal("", File.read(TESTFILE))
40
+ File.unlink TESTFILE
41
+ assert !File.exist?(TESTFILE)
42
+ end
43
+ end if VEX_TEST == "base"
@@ -0,0 +1,38 @@
1
+ module Hash::Compact
2
+ def compact
3
+ dup.compact!
4
+ end
5
+
6
+ def compact!
7
+ empty = []
8
+ each { |k,v| empty << k if v.nil? }
9
+ empty.each do |k| delete(k) end
10
+ self
11
+ end
12
+ end
13
+
14
+ class Hash
15
+ include Compact
16
+ end
17
+
18
+ module Hash::Compact::Etest
19
+ def test_compact_no
20
+ h = { 1 => 2 }
21
+ assert_equal(h.compact, h)
22
+ assert_not_equal(h.compact.object_id, h.object_id)
23
+ assert_equal(h.compact!.object_id, h.object_id)
24
+ assert_equal(h.compact!, h.compact)
25
+ end
26
+
27
+ def test_compact
28
+ h = { 1 => nil }
29
+ assert_equal(h.compact, {})
30
+ h.compact!
31
+ assert_equal(h, {})
32
+ end
33
+
34
+ def test_compact_2
35
+ h = { nil => 1 }
36
+ assert_equal(h.compact, { nil => 1})
37
+ end
38
+ end if VEX_TEST == "base"
@@ -0,0 +1,117 @@
1
+ module Hash::Cross
2
+ #
3
+ # { :a => [ 1, 2], :b => [ "bb", "cc"], :c => :cc }.cross =>
4
+ #
5
+ # [
6
+ # { :a => 1, :b => "bb", :c => :cc },
7
+ # { :a => 2, :b => "bb", :c => :cc },
8
+ # { :a => 1, :b => "cc", :c => :cc },
9
+ # { :a => 2, :b => "cc", :c => :cc }
10
+ # ]
11
+ #
12
+ def cross(*keys)
13
+ dup.send :do_cross, *keys
14
+ end
15
+
16
+ private
17
+
18
+ def do_cross(*keys)
19
+ keys = self.keys if keys.empty?
20
+ keys = keys.select { |key| self[key].is_a?(Array) }
21
+
22
+ crossing = self.extract! *keys
23
+
24
+ array = [ self ]
25
+
26
+ keys.each do |key|
27
+ r = []
28
+
29
+ values = crossing[key]
30
+ array.each do |obj|
31
+ values.each do |value|
32
+ # Note: the following (instead of the obj.dup.update() results in a ~10%
33
+ # faster cross implementation
34
+ o = obj.dup
35
+ o[key] = value
36
+ r << o
37
+ end
38
+ end
39
+ array = r
40
+ end
41
+
42
+ array
43
+ end
44
+ end
45
+
46
+ class Hash
47
+ include Cross
48
+ end
49
+
50
+ module Hash::Cross::Etest
51
+ def assert_equal_sets(a, b)
52
+ return assert_equal_sets(Set.new(a), b) unless a.is_a?(Set)
53
+ return assert_equal_sets(a, Set.new(b)) unless b.is_a?(Set)
54
+
55
+ assert_equal(a, b)
56
+ end
57
+
58
+ def test_cross_1
59
+ uncrossed = { :a => [ 1, 2], :b => [ "bb", "cc"], :c => :cc }
60
+ uncrossed_orig = uncrossed.dup
61
+
62
+ crossed = [
63
+ { :a => [1, 2], :b => "bb", :c => :cc },
64
+ { :a => [1, 2], :b => "cc", :c => :cc }
65
+ ]
66
+
67
+ assert_equal_sets(crossed, uncrossed.cross(:b))
68
+ assert_equal(uncrossed_orig, uncrossed)
69
+ end
70
+
71
+ def test_cross_2
72
+ uncrossed = { :a => [ 1, 2], :b => [ "bb", "cc"], :c => :cc }
73
+ uncrossed_orig = uncrossed.dup
74
+
75
+ crossed = [
76
+ { :a => 1, :b => "bb", :c => :cc },
77
+ { :a => 2, :b => "bb", :c => :cc },
78
+ { :a => 1, :b => "cc", :c => :cc },
79
+ { :a => 2, :b => "cc", :c => :cc }
80
+ ]
81
+
82
+ assert_equal_sets(crossed, uncrossed.cross)
83
+ assert_equal(uncrossed_orig, uncrossed)
84
+ end
85
+
86
+ def test_cross_2_w_order
87
+ uncrossed = { :a => [ 1, 2], :b => [ "bb", "cc"], :c => :cc }
88
+ uncrossed_orig = uncrossed.dup
89
+
90
+ crossed = [
91
+ { :a => 1, :b => "bb", :c => :cc },
92
+ { :a => 1, :b => "cc", :c => :cc },
93
+ { :a => 2, :b => "bb", :c => :cc },
94
+ { :a => 2, :b => "cc", :c => :cc }
95
+ ]
96
+
97
+ assert_equal(crossed, uncrossed.cross(:a, :b))
98
+ assert_equal(uncrossed_orig, uncrossed)
99
+ end
100
+
101
+ def test_cross_simple
102
+ uncrossed = { :a => :b }
103
+ assert_equal([{:a=>:b}], uncrossed.cross)
104
+
105
+ uncrossed = { :a => [ 1, :b ] }
106
+ assert_equal([{:a=>1}, {:a=>:b}], uncrossed.cross)
107
+ end
108
+
109
+ # def xtest_benchmark_1
110
+ # benchmark do
111
+ # 5000.times do
112
+ # uncrossed = { :a => [ 1, 2], :b => [ "bb", "cc"], :c => :cc }
113
+ # uncrossed.cross
114
+ # end
115
+ # end
116
+ # end
117
+ end if VEX_TEST == "base"