vex 0.2
Sign up to get free protection for your applications and to get access to all the features.
- 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"
|