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.
- data/Manifest +112 -0
- data/Rakefile +53 -0
- data/VERSION +1 -0
- data/config/README +2 -0
- data/config/dependencies.rb +10 -0
- data/config/gem.yml +7 -0
- data/init.rb +36 -0
- data/lib/nokogiri/nokogiri_ext.rb +96 -0
- data/lib/vex.rb +5 -0
- data/lib/vex/action_controller.rb +4 -0
- data/lib/vex/action_controller/verify_action.rb +97 -0
- data/lib/vex/action_controller/whitelisted_actions.rb +45 -0
- data/lib/vex/active_record.rb +3 -0
- data/lib/vex/active_record/__init__.rb +0 -0
- data/lib/vex/active_record/advisory_lock.rb +11 -0
- data/lib/vex/active_record/advisory_lock/mysql_adapter.rb +16 -0
- data/lib/vex/active_record/advisory_lock/sqlite_adapter.rb +78 -0
- data/lib/vex/active_record/belongs_to_many.rb +143 -0
- data/lib/vex/active_record/find_by_extension.rb +70 -0
- data/lib/vex/active_record/gem.rb +8 -0
- data/lib/vex/active_record/lite_table.rb +139 -0
- data/lib/vex/active_record/lite_view.rb +140 -0
- data/lib/vex/active_record/mass_load.rb +65 -0
- data/lib/vex/active_record/mysql_backup.rb +21 -0
- data/lib/vex/active_record/plugins/default_value_for/LICENSE.TXT +19 -0
- data/lib/vex/active_record/plugins/default_value_for/README.rdoc +421 -0
- data/lib/vex/active_record/plugins/default_value_for/Rakefile +6 -0
- data/lib/vex/active_record/plugins/default_value_for/init.rb +91 -0
- data/lib/vex/active_record/plugins/default_value_for/test.rb +279 -0
- data/lib/vex/active_record/plugins/default_value_for/test.sqlite3 +0 -0
- data/lib/vex/active_record/random_id.rb +56 -0
- data/lib/vex/active_record/resolver.rb +49 -0
- data/lib/vex/active_record/serialize_hash.rb +125 -0
- data/lib/vex/active_record/to_html.rb +53 -0
- data/lib/vex/active_record/validate.rb +76 -0
- data/lib/vex/active_record/validation_error_ext.rb +68 -0
- data/lib/vex/base.rb +2 -0
- data/lib/vex/base/app.rb +75 -0
- data/lib/vex/base/array/at_random.rb +17 -0
- data/lib/vex/base/array/cross.rb +26 -0
- data/lib/vex/base/array/each_batch.rb +32 -0
- data/lib/vex/base/array/parallel_map.rb +98 -0
- data/lib/vex/base/deprecation.rb +41 -0
- data/lib/vex/base/enumerable/deep.rb +95 -0
- data/lib/vex/base/enumerable/enumerable_ext.rb +59 -0
- data/lib/vex/base/enumerable/progress.rb +71 -0
- data/lib/vex/base/filesystem/fast_copy.rb +61 -0
- data/lib/vex/base/filesystem/grep.rb +34 -0
- data/lib/vex/base/filesystem/lock.rb +43 -0
- data/lib/vex/base/filesystem/lock.rb.test.lck +0 -0
- data/lib/vex/base/filesystem/lock.rb.test.pid +1 -0
- data/lib/vex/base/filesystem/make_dirs.rb +94 -0
- data/lib/vex/base/filesystem/parse_filename.rb +36 -0
- data/lib/vex/base/filesystem/tmp_file.rb +87 -0
- data/lib/vex/base/filesystem/write.rb +43 -0
- data/lib/vex/base/hash/compact.rb +38 -0
- data/lib/vex/base/hash/cross.rb +117 -0
- data/lib/vex/base/hash/easy_access.rb +141 -0
- data/lib/vex/base/hash/ensure_keys.rb +18 -0
- data/lib/vex/base/hash/extract.rb +71 -0
- data/lib/vex/base/hash/extras.rb +62 -0
- data/lib/vex/base/hash/inspect.rb +17 -0
- data/lib/vex/base/hash/simple_access_methods.rb +74 -0
- data/lib/vex/base/invalid_argument/invalid_argument.rb +97 -0
- data/lib/vex/base/local_conf.rb +35 -0
- data/lib/vex/base/net/http_ext.rb +227 -0
- data/lib/vex/base/net/socket_ext.rb +43 -0
- data/lib/vex/base/object/insp.rb +123 -0
- data/lib/vex/base/object/multiple_attributes.rb +58 -0
- data/lib/vex/base/object/singleton_methods.rb +23 -0
- data/lib/vex/base/object/with_benchmark.rb +110 -0
- data/lib/vex/base/range_array.rb +40 -0
- data/lib/vex/base/range_ext.rb +28 -0
- data/lib/vex/base/safe_token.rb +156 -0
- data/lib/vex/base/string/string_ext.rb +136 -0
- data/lib/vex/base/thread/deferred.rb +52 -0
- data/lib/vex/base/thread/sleep.rb +11 -0
- data/lib/vex/base/time/date_ext.rb +12 -0
- data/lib/vex/boot.rb +40 -0
- data/lib/vex/boot/array.rb +22 -0
- data/lib/vex/boot/blank.rb +41 -0
- data/lib/vex/boot/string.rb +60 -0
- data/migration/create_request_log.rb +28 -0
- data/r.rb +35 -0
- data/script/console +19 -0
- data/script/rebuild +7 -0
- data/tasks/echoe.rake +52 -0
- data/tasks/validate_db.rake +14 -0
- data/test/ar.rb +30 -0
- data/test/auto.rb +31 -0
- data/test/base-tests/local_conf.rb +25 -0
- data/test/base.rb +2 -0
- data/test/boot.rb +3 -0
- data/test/config/local.defaults.yml +4 -0
- data/test/config/local.yml +8 -0
- data/test/test.sqlite3 +0 -0
- data/test/test.sqlite3.Class#create.lck +0 -0
- data/test/test.sqlite3.Class#create.lck.lck +0 -0
- data/test/test.sqlite3.Class#create.lck.pid +1 -0
- data/test/test.sqlite3.Class#create.pid +1 -0
- data/test/test.sqlite3.LiteView.make.holders__view_dummy.lck +0 -0
- data/test/test.sqlite3.LiteView.make.holders__view_dummy.lck.lck +0 -0
- data/test/test.sqlite3.LiteView.make.holders__view_dummy.lck.pid +1 -0
- data/test/test.sqlite3.LiteView.make.holders__view_dummy.pid +1 -0
- data/test/test.sqlite3.vex.lck +0 -0
- data/test/test_helper.rb +49 -0
- data/test/tmp/copy.dat +1 -0
- data/test/tmp/lock.sqlite3 +0 -0
- data/test/tmp/lock.sqlite3.etest.lck +0 -0
- data/test/tmp/lock.sqlite3.etest.pid +1 -0
- data/test/tmp/somedata.dat +61 -0
- data/vex.gemspec +49 -0
- data/vex.tmproj +186 -0
- metadata +305 -0
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
class Thread
|
|
2
|
+
def self.uid
|
|
3
|
+
"#{$$}.#{Thread.current.object_id}"
|
|
4
|
+
end
|
|
5
|
+
|
|
6
|
+
def self.deferred(&block)
|
|
7
|
+
new {
|
|
8
|
+
Thread.current.abort_on_exception = true
|
|
9
|
+
|
|
10
|
+
begin
|
|
11
|
+
yield
|
|
12
|
+
rescue
|
|
13
|
+
App.logger.warn "Caught exception in background processing: #{$!}"
|
|
14
|
+
end
|
|
15
|
+
}
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
module Thread::Etest
|
|
20
|
+
def test_deferred
|
|
21
|
+
i = 0
|
|
22
|
+
Thread.deferred do
|
|
23
|
+
i = 1
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
Thread.sleep 0.05
|
|
27
|
+
assert_equal(1, i)
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
def test_deferred_exception
|
|
31
|
+
i = 0
|
|
32
|
+
Thread.deferred do
|
|
33
|
+
i = 1
|
|
34
|
+
raise
|
|
35
|
+
i = 2
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
Thread.sleep 0.05
|
|
39
|
+
assert_equal(1, i)
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
def test_pids
|
|
43
|
+
pids = [ Thread.uid ]
|
|
44
|
+
|
|
45
|
+
Thread.deferred { pids[1] = Thread.uid }
|
|
46
|
+
Thread.deferred { pids[2] = Thread.uid }
|
|
47
|
+
|
|
48
|
+
Thread.sleep 0.05
|
|
49
|
+
assert_equal(pids, pids.compact)
|
|
50
|
+
assert_equal(pids, pids.uniq)
|
|
51
|
+
end
|
|
52
|
+
end if VEX_TEST == "base"
|
data/lib/vex/boot.rb
ADDED
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
module Vex
|
|
2
|
+
ROOT=File.expand_path "#{File.dirname(__FILE__)}/../vex"
|
|
3
|
+
|
|
4
|
+
def self.version
|
|
5
|
+
@version ||= File.read("#{ROOT}/../../VERSION")
|
|
6
|
+
end
|
|
7
|
+
|
|
8
|
+
#
|
|
9
|
+
# load all modules from a specific directory.
|
|
10
|
+
# This loads first all files in or under that directory,
|
|
11
|
+
# sorted alphabetically. Hint: use files __init__.rb
|
|
12
|
+
# for stuff that must be loaded first.
|
|
13
|
+
def self.load_directory(directory)
|
|
14
|
+
# load plugins first
|
|
15
|
+
plugin_dir = "#{ROOT}/#{directory}/plugins"
|
|
16
|
+
Dir.glob("#{plugin_dir}/*").each do |file|
|
|
17
|
+
load_plugin file if File.directory?(file)
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
(Dir.glob("#{ROOT}/#{directory}/**/*.rb") - [__FILE__]).sort.each do |file|
|
|
21
|
+
next if file[0, plugin_dir.length] == plugin_dir
|
|
22
|
+
load file
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
def self.load_plugin(directory)
|
|
27
|
+
$:.push(directory)
|
|
28
|
+
init_rb = "#{directory}/init.rb"
|
|
29
|
+
require(init_rb) if File.exists?(init_rb)
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
Vex.load_directory "../../config"
|
|
34
|
+
Vex.load_directory "boot"
|
|
35
|
+
|
|
36
|
+
module Vex::Etest
|
|
37
|
+
def test_version
|
|
38
|
+
assert_not_nil(Vex.version)
|
|
39
|
+
end
|
|
40
|
+
end
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
class Array
|
|
2
|
+
def extract_options!
|
|
3
|
+
if last.is_a?(Hash)
|
|
4
|
+
pop
|
|
5
|
+
else
|
|
6
|
+
{}
|
|
7
|
+
end
|
|
8
|
+
end
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
module Array::Etest
|
|
12
|
+
def test_extract_options
|
|
13
|
+
arr = %w(1 2)
|
|
14
|
+
assert_equal({}, arr.extract_options!)
|
|
15
|
+
assert_equal(%w(1 2), arr)
|
|
16
|
+
|
|
17
|
+
arr = [ 1, 2, { :a => :b }]
|
|
18
|
+
assert_equal({ :a => :b }, arr.extract_options!)
|
|
19
|
+
assert_equal( [ 1, 2 ], arr)
|
|
20
|
+
end
|
|
21
|
+
end if VEX_TEST == "boot"
|
|
22
|
+
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
class Object
|
|
2
|
+
def blank?
|
|
3
|
+
false
|
|
4
|
+
end
|
|
5
|
+
end
|
|
6
|
+
|
|
7
|
+
class NilClass
|
|
8
|
+
def blank?
|
|
9
|
+
true
|
|
10
|
+
end
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
class FalseClass
|
|
14
|
+
def blank?
|
|
15
|
+
true
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
module Enumerable
|
|
20
|
+
def blank?
|
|
21
|
+
empty?
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
class String
|
|
26
|
+
alias :blank? :empty?
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
module Blank
|
|
30
|
+
module Etest
|
|
31
|
+
def test_blanks
|
|
32
|
+
assert_equal true, nil.blank?
|
|
33
|
+
assert_equal true, [].blank?
|
|
34
|
+
assert_equal true, false.blank?
|
|
35
|
+
assert_equal true, {}.blank?
|
|
36
|
+
assert_equal true, "".blank?
|
|
37
|
+
|
|
38
|
+
assert_equal false, 1.blank?
|
|
39
|
+
end
|
|
40
|
+
end
|
|
41
|
+
end if VEX_TEST == "boot"
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
class String
|
|
2
|
+
def starts_with?(other)
|
|
3
|
+
return false if other.length > length
|
|
4
|
+
|
|
5
|
+
self[0, other.length] == other
|
|
6
|
+
end
|
|
7
|
+
|
|
8
|
+
def ends_with?(other)
|
|
9
|
+
return false if other.length > length
|
|
10
|
+
|
|
11
|
+
self[self.length-other.length..-1] == other
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def constantize
|
|
15
|
+
names = self.split('::')
|
|
16
|
+
raise ArgumentError, "Cannot be blank" if blank?
|
|
17
|
+
|
|
18
|
+
names.shift if names.first.empty?
|
|
19
|
+
|
|
20
|
+
names.inject(Object) do |constant, name|
|
|
21
|
+
constant.const_get(name) || constant.const_missing(name)
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
module String::Etest
|
|
27
|
+
def test_starts_with
|
|
28
|
+
assert "abcde".starts_with?("")
|
|
29
|
+
assert "abcde".starts_with?("a")
|
|
30
|
+
assert "abcde".starts_with?("ab")
|
|
31
|
+
assert "abcde".starts_with?("abc")
|
|
32
|
+
assert "abcde".starts_with?("abcd")
|
|
33
|
+
assert "abcde".starts_with?("abcde")
|
|
34
|
+
|
|
35
|
+
assert !("abcde".starts_with?("abcdef"))
|
|
36
|
+
assert !("abcde".starts_with?("xy"))
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
def test_ends_with
|
|
40
|
+
assert "abcde".ends_with?("")
|
|
41
|
+
assert "abcde".ends_with?("e")
|
|
42
|
+
assert "abcde".ends_with?("de")
|
|
43
|
+
assert "abcde".ends_with?("cde")
|
|
44
|
+
assert "abcde".ends_with?("bcde")
|
|
45
|
+
assert "abcde".ends_with?("abcde")
|
|
46
|
+
|
|
47
|
+
assert !("abcde".ends_with?("abcdef"))
|
|
48
|
+
assert !("abcde".ends_with?("xy"))
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
def test_constantize
|
|
52
|
+
assert_equal String, "String".constantize
|
|
53
|
+
assert_raise(NameError) {
|
|
54
|
+
"I::Dont::Know::This".constantize
|
|
55
|
+
}
|
|
56
|
+
assert_raise(ArgumentError) {
|
|
57
|
+
"".constantize
|
|
58
|
+
}
|
|
59
|
+
end
|
|
60
|
+
end if VEX_TEST == "boot"
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
class CreateRequestLog < ActiveRecord::Migration
|
|
2
|
+
TABLE_NAME = ImprovedLogging::TABLE_NAME
|
|
3
|
+
|
|
4
|
+
def self.up
|
|
5
|
+
create_table TABLE_NAME, :force => true do |t|
|
|
6
|
+
t.integer :user_id # account ID
|
|
7
|
+
t.string :ip # remote IP
|
|
8
|
+
t.integer :xhr # yes/no
|
|
9
|
+
t.string :method # get/post etc.
|
|
10
|
+
t.string :protocol # http:/https:
|
|
11
|
+
t.string :host # host
|
|
12
|
+
t.string :path # path
|
|
13
|
+
t.string :query # query param
|
|
14
|
+
t.string :action # controller + action
|
|
15
|
+
t.string :status # result status
|
|
16
|
+
t.integer :msecs # time needed
|
|
17
|
+
t.integer :queries # of SQL queries needed
|
|
18
|
+
t.integer :sql_select # of SQL queries needed
|
|
19
|
+
t.integer :sql_update # of SQL queries needed
|
|
20
|
+
t.integer :sql_insert # of SQL queries needed
|
|
21
|
+
t.integer :sql_delete # of SQL queries needed
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
def self.down
|
|
26
|
+
drop_table(TABLE_NAME) rescue nil
|
|
27
|
+
end
|
|
28
|
+
end
|
data/r.rb
ADDED
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
def a
|
|
2
|
+
puts "a"
|
|
3
|
+
end
|
|
4
|
+
|
|
5
|
+
def b
|
|
6
|
+
puts "b"
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
def f
|
|
10
|
+
a
|
|
11
|
+
yield
|
|
12
|
+
ensure
|
|
13
|
+
b
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
f do
|
|
22
|
+
puts "inner"
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
cc = nil
|
|
27
|
+
|
|
28
|
+
f do
|
|
29
|
+
callcc { |s| cc = s }
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
cc.call
|
|
33
|
+
|
|
34
|
+
#
|
|
35
|
+
#a
|
data/script/console
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
#!/usr/bin/env ruby
|
|
2
|
+
#
|
|
3
|
+
# Start a console that initializes the gem
|
|
4
|
+
#
|
|
5
|
+
require "irb"
|
|
6
|
+
require "rubygems"
|
|
7
|
+
|
|
8
|
+
begin
|
|
9
|
+
require 'wirble'
|
|
10
|
+
Wirble.init
|
|
11
|
+
Wirble.colorize
|
|
12
|
+
rescue LoadError
|
|
13
|
+
STDERR.puts "To enable colorized and tab completed run 'gem install wirble'"
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
$: << "#{File.dirname(__FILE__)}/../lib"
|
|
17
|
+
require "#{File.dirname(__FILE__)}/../init.rb"
|
|
18
|
+
|
|
19
|
+
IRB.start
|
data/script/rebuild
ADDED
data/tasks/echoe.rake
ADDED
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
unless defined?(SKIP_ECHOE)
|
|
2
|
+
|
|
3
|
+
#
|
|
4
|
+
# GEM settings
|
|
5
|
+
#
|
|
6
|
+
GEM_ROOT = File.expand_path("#{File.dirname(__FILE__)}/..")
|
|
7
|
+
|
|
8
|
+
if gem_config = YAML.load(File.read("#{GEM_ROOT}/config/gem.yml"))
|
|
9
|
+
require 'echoe'
|
|
10
|
+
|
|
11
|
+
#
|
|
12
|
+
# a dependency reader
|
|
13
|
+
module Dependency
|
|
14
|
+
@@dependencies = []
|
|
15
|
+
|
|
16
|
+
def self.require(file)
|
|
17
|
+
@@dependencies << file
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def self.load
|
|
21
|
+
eval File.read("#{GEM_ROOT}/config/dependencies.rb"), binding
|
|
22
|
+
@@dependencies
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
Echoe.new(File.basename(GEM_ROOT), File.read("#{GEM_ROOT}/VERSION")) do |p|
|
|
27
|
+
gem_config.each do |k,v|
|
|
28
|
+
p.send "#{k}=",v
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
p.runtime_dependencies = Dependency.load
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
desc "Rebuild and install the gem"
|
|
35
|
+
task :rebuild => %w(manifest default build_gemspec package) do
|
|
36
|
+
gem = Dir.glob("pkg/*.gem").sort_by do |filename|
|
|
37
|
+
File.new(filename).mtime
|
|
38
|
+
end.last
|
|
39
|
+
|
|
40
|
+
puts "============================================="
|
|
41
|
+
puts "Installing gem..."
|
|
42
|
+
|
|
43
|
+
system "gem install #{gem} > /dev/null 2>&1"
|
|
44
|
+
|
|
45
|
+
puts ""
|
|
46
|
+
puts "I built and installed the gem for you. To upload, run "
|
|
47
|
+
puts
|
|
48
|
+
puts " gem push #{gem}"
|
|
49
|
+
end
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
end
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
namespace :db do
|
|
2
|
+
desc "Validate all models in the database"
|
|
3
|
+
task :validate => :environment do
|
|
4
|
+
ActiveRecord::Validate.all
|
|
5
|
+
end
|
|
6
|
+
|
|
7
|
+
namespace :validate do
|
|
8
|
+
desc "Purge all invalid models form the database"
|
|
9
|
+
task :purge => :environment do
|
|
10
|
+
ActiveRecord::Validate.purge
|
|
11
|
+
end
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
end
|
data/test/ar.rb
ADDED
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
#
|
|
2
|
+
# set up AR
|
|
3
|
+
|
|
4
|
+
# require "rubygems"
|
|
5
|
+
|
|
6
|
+
require 'rubygems'
|
|
7
|
+
require 'sqlite3'
|
|
8
|
+
require 'active_record'
|
|
9
|
+
|
|
10
|
+
LOGFILE = "log/test.log"
|
|
11
|
+
SQLITE_FILE = ":memory:"
|
|
12
|
+
|
|
13
|
+
#
|
|
14
|
+
# -- set up active record for tests -----------------------------------
|
|
15
|
+
ACTIVE_RECORD = {
|
|
16
|
+
:adapter => "sqlite3",
|
|
17
|
+
:database => ":memory:"
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
ActiveRecord::Base.logger ||= Logger.new $STDERR
|
|
21
|
+
|
|
22
|
+
#
|
|
23
|
+
# setup connection
|
|
24
|
+
ActiveRecord::Base.establish_connection ACTIVE_RECORD
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
#
|
|
28
|
+
# start tests
|
|
29
|
+
VEX_TEST="active_record"
|
|
30
|
+
load "#{File.dirname(__FILE__)}/test_helper.rb"
|