rbridge 0.1.2 → 0.2.0
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.tar.gz.sig +0 -0
- data/Authors.txt +1 -4
- data/History.txt +9 -0
- data/Manifest.txt +3 -3
- data/README.txt +2 -2
- data/Rakefile +1 -1
- data/Todo.txt +6 -0
- data/bin/rulang +67 -3
- data/lib/erlang_adapter.rb +3 -3
- data/lib/mnesia_adapter.rb +23 -0
- data/lib/rbridge.rb +43 -22
- data/rulang_server/{rulang → rulang.erl} +18 -19
- metadata +7 -7
- metadata.gz.sig +0 -0
- data/.DS_Store +0 -0
- data/lib/vosetools.rb +0 -144
data.tar.gz.sig
CHANGED
Binary file
|
data/Authors.txt
CHANGED
data/History.txt
CHANGED
@@ -1,3 +1,12 @@
|
|
1
|
+
== 0.2.0 / 2008-04-24 (vosechu)
|
2
|
+
* 1 major enhancement
|
3
|
+
* Actually runs headless via the rulang command.
|
4
|
+
|
5
|
+
* 3 minor enhancements
|
6
|
+
* Uses optparse for clearer command-line options.
|
7
|
+
* Option to specify port, compile directory, mnesia directory, sname, and location of server file.
|
8
|
+
* Some error checking, and debug output added. Checks to see if server is already running on specified port.
|
9
|
+
|
1
10
|
== 0.1.2 / 2008-01-10 (vosechu)
|
2
11
|
* major enhancements
|
3
12
|
* Runs headless by using the rulang command or via the command-line using the
|
data/Manifest.txt
CHANGED
@@ -1,14 +1,14 @@
|
|
1
|
-
.DS_Store
|
2
1
|
Authors.txt
|
3
2
|
GPL.txt
|
4
3
|
History.txt
|
5
4
|
Manifest.txt
|
6
5
|
README.txt
|
7
6
|
Rakefile
|
7
|
+
Todo.txt
|
8
8
|
bin/rulang
|
9
9
|
lib/erlang_adapter.rb
|
10
|
+
lib/mnesia_adapter.rb
|
10
11
|
lib/rbridge.rb
|
11
|
-
|
12
|
-
rulang_server/rulang
|
12
|
+
rulang_server/rulang.erl
|
13
13
|
spec/rulang_spec.rb
|
14
14
|
spec/spec_helper.rb
|
data/README.txt
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
rbridge
|
2
2
|
ruby-mnesia.rubyforge.com
|
3
|
-
by Toshiyuki Hirooka, Chuck Vose
|
3
|
+
by Toshiyuki Hirooka, Chuck Vose
|
4
4
|
|
5
5
|
== DESCRIPTION:
|
6
6
|
|
@@ -55,7 +55,7 @@ more expressive or complex code is needed.
|
|
55
55
|
|
56
56
|
RBridge - A Ruby to Erlang bridge allowing the use of Erlang commands within
|
57
57
|
normal Ruby code.
|
58
|
-
Copyright (C) 2008 Toshiyuki Hirooka <toshi.hirooka@gmail.com>
|
58
|
+
Copyright (C) 2008 Toshiyuki Hirooka <toshi.hirooka@gmail.com>, Chuck Vose <vosechu@gmail.com>
|
59
59
|
|
60
60
|
This program is free software; you can redistribute it and/or
|
61
61
|
modify it under the terms of the GNU General Public License
|
data/Rakefile
CHANGED
@@ -6,7 +6,7 @@ require './lib/rbridge.rb'
|
|
6
6
|
|
7
7
|
Hoe.new('rbridge', RBridge::VERSION) do |p|
|
8
8
|
p.rubyforge_name = 'ruby-mnesia'
|
9
|
-
p.author = ['Chuck Vose', 'Toshiyuki Hirooka'
|
9
|
+
p.author = ['Chuck Vose', 'Toshiyuki Hirooka']
|
10
10
|
p.email = 'vosechu@gmail.com'
|
11
11
|
p.summary = 'RBridge allows the use of Erlang code within the Ruby environment'
|
12
12
|
p.description = p.paragraphs_of('README.txt', 1..4).join("\n\n")
|
data/Todo.txt
ADDED
@@ -0,0 +1,6 @@
|
|
1
|
+
- Get the erlang adaptor to handle hashes
|
2
|
+
- Add error checking to the rulang server for things like servers already running on a port.
|
3
|
+
- Build more tests, specifically the standard CRUD and a few join queries.
|
4
|
+
- database.yml should say where beam/mnesia live
|
5
|
+
- make record files importable (via rr command)
|
6
|
+
- make sure when we start mnesia it's not just running over an old mnesia instance.
|
data/bin/rulang
CHANGED
@@ -1,4 +1,68 @@
|
|
1
|
-
#!/usr/local/bin/ruby -
|
1
|
+
#!/usr/local/bin/ruby -w
|
2
2
|
|
3
|
-
|
4
|
-
|
3
|
+
require 'optparse'
|
4
|
+
|
5
|
+
options = {}
|
6
|
+
OptionParser.new do |opts|
|
7
|
+
opts.banner = "Usage: rulang [options]"
|
8
|
+
|
9
|
+
# Default of port 9900 and compiling the beam in the same folder as the erlang file.
|
10
|
+
options[:port] = 9900
|
11
|
+
options[:server_path] = File.expand_path(File.join(File.dirname(__FILE__), "..", "rulang_server"))
|
12
|
+
options[:beam_path] = options[:server_path]
|
13
|
+
|
14
|
+
opts.on("-v", "--verbose", "Run verbosely") do |v|
|
15
|
+
options[:verbose] = v
|
16
|
+
end
|
17
|
+
opts.on("-q", "--quiet", "Run quietly") do |q|
|
18
|
+
options[:quiet] = q
|
19
|
+
end
|
20
|
+
opts.on("-p", "--port Port", "Port Number to Connect To") do |p|
|
21
|
+
options[:port] = p
|
22
|
+
end
|
23
|
+
opts.on("-o", "--beam-path Path", "Path to Compile To") do |o|
|
24
|
+
options[:beam_path] = File.expand_path(o)
|
25
|
+
end
|
26
|
+
opts.on("-m", "--mnesia-path Path", "Path to Mnesia Directory") do |m|
|
27
|
+
options[:mnesia_path] = m
|
28
|
+
end
|
29
|
+
opts.on("-s", "--sname", "Node Name for Clustering") do |s|
|
30
|
+
options[:sname] = s
|
31
|
+
end
|
32
|
+
opts.on("--server-path", "Path to rulang.erl") do |sp|
|
33
|
+
options[:server_path] = sp
|
34
|
+
end
|
35
|
+
|
36
|
+
opts.on_tail("-h", "--help", "Show this message") do
|
37
|
+
puts opts
|
38
|
+
exit
|
39
|
+
end
|
40
|
+
|
41
|
+
opts.on_tail("--version", "Show version") do
|
42
|
+
puts OptionParser::Version.join('.')
|
43
|
+
exit
|
44
|
+
end
|
45
|
+
end.parse!
|
46
|
+
|
47
|
+
# Find out if there's already a beam file on this port
|
48
|
+
pid = `ps ax | grep beam | grep -v grep | grep 'rulang:main(\\\[#{options[:port]}\\\])'`
|
49
|
+
if pid && !pid.empty?
|
50
|
+
puts "Server already running on #{options[:port]}"
|
51
|
+
exit
|
52
|
+
end
|
53
|
+
|
54
|
+
# Commands to execute
|
55
|
+
compile = "erlc -o #{options[:beam_path]} #{File.join(options[:server_path], "rulang.erl")}"
|
56
|
+
start = "cd #{options[:beam_path]}; erl #{"-sname #{options[:sname]}" if options[:sname]} -detached -mnesia #{"dir '\"#{options[:mnesia_path]}\"'" if options[:mnesia_path]} -eval 'rulang:main([#{options[:port]}])'"
|
57
|
+
|
58
|
+
# Debug output
|
59
|
+
puts "Commands", compile, start if ENV['DEBUG'] == 'true'
|
60
|
+
|
61
|
+
puts "[Rulang Server]\n" unless options[:quiet]
|
62
|
+
puts "Compiling rulang beam...\n" if options[:verbose]
|
63
|
+
`#{compile}`
|
64
|
+
puts "Starting rulang server...\n" if options[:verbose]
|
65
|
+
`#{start}`
|
66
|
+
puts "Compile path: '#{options[:beam_path]}'\n" if options[:verbose]
|
67
|
+
puts "Mnesia path: '#{File.expand_path(options[:mnesia_path])}'\n" if options[:mnesia_path] && options[:verbose]
|
68
|
+
puts "PID: " + `ps ax | grep beam | grep -v grep | tail -n1 | cut -f 2 -d " "` if options[:verbose]
|
data/lib/erlang_adapter.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
# RBridge - A Ruby to Erlang bridge allowing the use of Erlang commands within
|
2
2
|
# normal Ruby code.
|
3
|
-
# Copyright (C) 2008 Toshiyuki Hirooka <toshi.hirooka@gmail.com>
|
3
|
+
# Copyright (C) 2008 Toshiyuki Hirooka <toshi.hirooka@gmail.com>, Chuck Vose <vosechu@gmail.com>
|
4
4
|
#
|
5
5
|
# This program is free software; you can redistribute it and/or
|
6
6
|
# modify it under the terms of the GNU General Public License
|
@@ -31,9 +31,9 @@ class ErlangAdapter
|
|
31
31
|
|
32
32
|
# Send commands to the Erlang server to be evaluated. Must have trailing
|
33
33
|
# whitespace to differentiate between floats and EOL.
|
34
|
-
def eval(command)
|
34
|
+
def eval(command)
|
35
35
|
socket = TCPSocket.new(@host, @port)
|
36
|
-
|
36
|
+
|
37
37
|
# There has to be a trailing space at the end of a command for erl_scan:tokens
|
38
38
|
# to process the string.
|
39
39
|
command << '.' if command.scan(/\.\w*/).empty?
|
@@ -0,0 +1,23 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'ruby-debug'
|
3
|
+
require 'rbridge'
|
4
|
+
|
5
|
+
class MnesiaAdapter
|
6
|
+
attr_reader :connection, :path
|
7
|
+
|
8
|
+
def initialize
|
9
|
+
@connection = RBridge.new(nil, 'localhost', 9900)
|
10
|
+
|
11
|
+
@connection.erl("mnesia:start().")
|
12
|
+
@connection.erl("mnesia:create_schema([node()]).")
|
13
|
+
|
14
|
+
debugger
|
15
|
+
|
16
|
+
|
17
|
+
@connection.erl("rr('tables.hrl').")
|
18
|
+
|
19
|
+
puts "here"
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
MnesiaAdapter.new
|
data/lib/rbridge.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
# RBridge - A Ruby to Erlang bridge allowing the use of Erlang commands within
|
2
2
|
# normal Ruby code.
|
3
|
-
# Copyright (C) 2008 Toshiyuki Hirooka <toshi.hirooka@gmail.com>
|
3
|
+
# Copyright (C) 2008 Toshiyuki Hirooka <toshi.hirooka@gmail.com>, Chuck Vose <vosechu@gmail.com>
|
4
4
|
#
|
5
5
|
# This program is free software; you can redistribute it and/or
|
6
6
|
# modify it under the terms of the GNU General Public License
|
@@ -17,13 +17,13 @@
|
|
17
17
|
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
18
18
|
|
19
19
|
require "socket"
|
20
|
-
require "
|
20
|
+
require "erlang_adapter"
|
21
21
|
|
22
22
|
#
|
23
23
|
# Erlang サーバの関数を Ruby のメソッドのように扱えるようにするクラス
|
24
24
|
#
|
25
25
|
class RBridge
|
26
|
-
VERSION = "0.
|
26
|
+
VERSION = "0.2.0"
|
27
27
|
|
28
28
|
# [Mod]
|
29
29
|
# Erlang module to use when using ruby-style access (the default is "erlang")
|
@@ -56,25 +56,46 @@ class RBridge
|
|
56
56
|
erl(command, block)
|
57
57
|
end
|
58
58
|
|
59
|
+
# def sql_erl(command, block=nil)
|
60
|
+
# res = command.scan(/[^\ ]+/)
|
61
|
+
# case res[0]
|
62
|
+
# when /select/i
|
63
|
+
# erl_command = "Q = qlc:q([X || X <- mnesia:table(#{res[3]})]),
|
64
|
+
# F = fun() -> qlc:e(Q) end,
|
65
|
+
# {atomic, Val} = mnesia:transaction(F),
|
66
|
+
# Val."
|
67
|
+
# else
|
68
|
+
# erl_command = nil
|
69
|
+
# end
|
70
|
+
#
|
71
|
+
# puts erl_command
|
72
|
+
# erl(erl_command, block)
|
73
|
+
# end
|
74
|
+
|
59
75
|
# Send commands to Erlang to be processed.
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
#
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
76
|
+
def erl(command, block=nil)
|
77
|
+
# log_p command
|
78
|
+
begin
|
79
|
+
if @async == true then
|
80
|
+
# If we're asynchronous generate a thread around the call then pass
|
81
|
+
# the results back to a block to display.
|
82
|
+
Thread.new do
|
83
|
+
res = @erlang.eval(command)
|
84
|
+
raise res if @erlang.is_error(res)
|
85
|
+
block.call(eval(res))
|
86
|
+
end
|
87
|
+
elsif @async == false then
|
88
|
+
# Blocking mode should just eval and wait for data to come back.
|
89
|
+
res = @erlang.eval(command)
|
90
|
+
raise res if @erlang.is_error(res)
|
91
|
+
eval res
|
92
|
+
end
|
93
|
+
rescue => res
|
94
|
+
raise "[Error]=>#{res}"
|
95
|
+
end
|
79
96
|
end
|
97
|
+
|
98
|
+
# def tv
|
99
|
+
# erl("tv:start().")
|
100
|
+
# end
|
80
101
|
end
|
@@ -1,8 +1,7 @@
|
|
1
|
-
#!/usr/bin/env escript
|
2
1
|
%% -*- erlang -*-
|
3
2
|
% RBridge - A Ruby to Erlang bridge allowing the use of Erlang commands within
|
4
3
|
% normal Ruby code.
|
5
|
-
% Copyright (C) 2008 Toshiyuki Hirooka <toshi.hirooka@gmail.com>
|
4
|
+
% Copyright (C) 2008 Toshiyuki Hirooka <toshi.hirooka@gmail.com>, Chuck Vose <vosechu@gmail.com>
|
6
5
|
%
|
7
6
|
% This program is free software; you can redistribute it and/or
|
8
7
|
% modify it under the terms of the GNU General Public License
|
@@ -17,19 +16,19 @@
|
|
17
16
|
% You should have received a copy of the GNU General Public License
|
18
17
|
% along with this program; if not, write to the Free Software
|
19
18
|
% Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
19
|
+
-module(rulang).
|
20
|
+
-export([start_server/1, stop_server/0, loop/1, handle_connection/1, main/1, usage/0]).
|
20
21
|
|
21
|
-
|
22
|
-
|
23
|
-
main([String]) ->
|
22
|
+
main([Port]) ->
|
24
23
|
try
|
25
|
-
|
26
|
-
start_server(N)
|
24
|
+
start_server(Port)
|
27
25
|
catch
|
28
26
|
_:_ ->
|
27
|
+
% TODO: This should report the error as well as the usage
|
29
28
|
usage()
|
30
29
|
end;
|
31
30
|
main(_) ->
|
32
|
-
|
31
|
+
usage().
|
33
32
|
|
34
33
|
usage() ->
|
35
34
|
io:format("./rulang [port number]").
|
@@ -40,7 +39,6 @@ start_server(Port) ->
|
|
40
39
|
{ok, ListenSocket} = gen_tcp:listen(Port, [binary, {packet, 0}, {active, false}]),
|
41
40
|
io:format("[RBridge Server Started]~n"),
|
42
41
|
loop(ListenSocket).
|
43
|
-
|
44
42
|
|
45
43
|
% Just kill the parent thread.
|
46
44
|
stop_server() ->
|
@@ -54,26 +52,27 @@ loop(ListenSocket) ->
|
|
54
52
|
case gen_tcp:accept(ListenSocket) of
|
55
53
|
|
56
54
|
% If the connection is valid read the commands and attempt to eval them.
|
57
|
-
|
58
|
-
|
59
|
-
|
55
|
+
{ok, Socket} ->
|
56
|
+
spawn(fun() ->
|
57
|
+
handle_connection(Socket)
|
60
58
|
end),
|
61
|
-
|
62
|
-
|
59
|
+
|
60
|
+
% Continue the loop
|
61
|
+
loop(ListenSocket)
|
63
62
|
end.
|
64
63
|
|
65
64
|
% Wrapper that catches errors and closes the socket after we're done with it.
|
66
65
|
handle_connection(Socket) ->
|
67
|
-
|
68
|
-
|
69
|
-
|
66
|
+
% Try to execute the commands in the tcp socket.
|
67
|
+
try communication(Socket)
|
68
|
+
% But catch any errors and pass them along to the tcp socket so we can see
|
70
69
|
% them in ruby.
|
71
70
|
catch
|
72
71
|
error:Reason ->
|
73
|
-
|
72
|
+
{gen_tcp:send(Socket, io_lib:format("Error: ~p~n", [Reason]))}
|
74
73
|
end,
|
75
74
|
% Finally make sure the socket gets closed.
|
76
|
-
|
75
|
+
ok = gen_tcp:close(Socket).
|
77
76
|
|
78
77
|
% Try to evaluate the code submitted throwing an exception if the evaluation
|
79
78
|
% doesn't work.
|
metadata
CHANGED
@@ -1,12 +1,11 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rbridge
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ""
|
6
6
|
authors:
|
7
7
|
- Chuck Vose
|
8
8
|
- Toshiyuki Hirooka
|
9
|
-
- Sean Steiger-McRae
|
10
9
|
autorequire:
|
11
10
|
bindir: bin
|
12
11
|
cert_chain:
|
@@ -32,7 +31,7 @@ cert_chain:
|
|
32
31
|
6uVjBw==
|
33
32
|
-----END CERTIFICATE-----
|
34
33
|
|
35
|
-
date: 2008-
|
34
|
+
date: 2008-05-24 00:00:00 -07:00
|
36
35
|
default_executable:
|
37
36
|
dependencies:
|
38
37
|
- !ruby/object:Gem::Dependency
|
@@ -42,7 +41,7 @@ dependencies:
|
|
42
41
|
requirements:
|
43
42
|
- - ">="
|
44
43
|
- !ruby/object:Gem::Version
|
45
|
-
version: 1.
|
44
|
+
version: 1.5.3
|
46
45
|
version:
|
47
46
|
description: "== DESCRIPTION: RBridge allows the use of Erlang code within a Ruby program. Optionally allowing asynchronous access and ruby-like syntax or by using Erlang code directly when more expressive or complex code is needed. == FEATURES/PROBLEMS: * Allows use of Erlang code within Ruby * Doesn't yet allow Ruby code within Erlang"
|
48
47
|
email: vosechu@gmail.com
|
@@ -56,19 +55,20 @@ extra_rdoc_files:
|
|
56
55
|
- History.txt
|
57
56
|
- Manifest.txt
|
58
57
|
- README.txt
|
58
|
+
- Todo.txt
|
59
59
|
files:
|
60
|
-
- .DS_Store
|
61
60
|
- Authors.txt
|
62
61
|
- GPL.txt
|
63
62
|
- History.txt
|
64
63
|
- Manifest.txt
|
65
64
|
- README.txt
|
66
65
|
- Rakefile
|
66
|
+
- Todo.txt
|
67
67
|
- bin/rulang
|
68
68
|
- lib/erlang_adapter.rb
|
69
|
+
- lib/mnesia_adapter.rb
|
69
70
|
- lib/rbridge.rb
|
70
|
-
-
|
71
|
-
- rulang_server/rulang
|
71
|
+
- rulang_server/rulang.erl
|
72
72
|
- spec/rulang_spec.rb
|
73
73
|
- spec/spec_helper.rb
|
74
74
|
has_rdoc: true
|
metadata.gz.sig
CHANGED
Binary file
|
data/.DS_Store
DELETED
Binary file
|
data/lib/vosetools.rb
DELETED
@@ -1,144 +0,0 @@
|
|
1
|
-
# # These files may not be used in this project but are merely notes collected
|
2
|
-
# # and inserted into all of Chuck Vose's projects. Please disregard them
|
3
|
-
# # unless they help you.
|
4
|
-
|
5
|
-
# # PLUGINS:
|
6
|
-
# # Autotest with UnitRecord
|
7
|
-
# # By default, running autotest in the Rails directory will run the unit tests.
|
8
|
-
# # To run the functional tests, do: AUTOTEST='functional' autotest
|
9
|
-
# ruby script/plugin install http://svn.soniciq.com/public/rails/plugins/iq_autotest
|
10
|
-
# # Query Analyzer to see what we're doing under the surface
|
11
|
-
# # Courtesy of Bob Silva at http://agilewebdevelopment.com/plugins/query_analyzer
|
12
|
-
# ruby script/plugin install http://svn.nfectio.us/plugins/query_analyzer
|
13
|
-
# # Dev mode performance cacher by Josh Goebel
|
14
|
-
# # Caches dev code after file changes to make refreshes happen in the background
|
15
|
-
# ruby script/plugin install http://svn.techno-weenie.net/projects/plugins/dev_mode_performance_fixes/
|
16
|
-
# # Rspec for running BDD
|
17
|
-
# ruby script/plugin install svn://rubyforge.org/var/svn/rspec/tags/CURRENT/rspec
|
18
|
-
# ruby script/plugin install svn://rubyforge.org/var/svn/rspec/tags/CURRENT/rspec_on_rails
|
19
|
-
|
20
|
-
# # GEMS:
|
21
|
-
# # UnitRecord disconnects tests from the database and restructures tests into
|
22
|
-
# # Proper unit/functional tests. (Unit == no database, no externals). Run
|
23
|
-
# # rake vose:convert_to_unitrecord[_and_commit] after installing.
|
24
|
-
# sudo gem install unit_record
|
25
|
-
# # Zentest provides test generation and autotest for hands free testing
|
26
|
-
# # RSpec ~/.autotest file from http://reinh.com/2007/9/6/rspec-autotest-and-growl-oh-my
|
27
|
-
# # Test::Unit ~/.autotest file from
|
28
|
-
# sudo gem install zentest
|
29
|
-
# # Dust provides some handy helper methods to testing
|
30
|
-
# sudo gem install dust
|
31
|
-
# # Mocha allows cross unit tests by mocking and stubbing functions
|
32
|
-
# sudo gem install mocha
|
33
|
-
|
34
|
-
require 'rubygems'
|
35
|
-
# require 'mocha'
|
36
|
-
# require 'stubba'
|
37
|
-
# require 'dust'
|
38
|
-
|
39
|
-
# require 'factory'
|
40
|
-
|
41
|
-
module Vosetools
|
42
|
-
def log_p(message)
|
43
|
-
require 'pp'
|
44
|
-
|
45
|
-
p "*********************"
|
46
|
-
pp message
|
47
|
-
p "*********************"
|
48
|
-
|
49
|
-
# if !message.is_a?(Array)
|
50
|
-
# `growlnotify -m "#{message}"`
|
51
|
-
# end
|
52
|
-
end
|
53
|
-
|
54
|
-
def profile
|
55
|
-
require 'ruby-prof'
|
56
|
-
|
57
|
-
result = RubyProf.profile do
|
58
|
-
yield
|
59
|
-
end
|
60
|
-
|
61
|
-
# Print a flat profile to text
|
62
|
-
printer = RubyProf::FlatPrinter.new(result)
|
63
|
-
printer.print(STDOUT, 5)
|
64
|
-
end
|
65
|
-
|
66
|
-
# def has_a(obj)
|
67
|
-
# class_eval do
|
68
|
-
# define_method(:method_missing) do |*values|
|
69
|
-
# if obj.methods.include?(values[0])
|
70
|
-
# log_p values
|
71
|
-
# obj.send!(:values[0], values[1..(values.length-1)])
|
72
|
-
# end
|
73
|
-
# end
|
74
|
-
# end
|
75
|
-
# end
|
76
|
-
end
|
77
|
-
|
78
|
-
# # Adapted from http://sami.samhuri.net/2007/4/11/activerecord-base-find_or_create-and-find_or_initialize
|
79
|
-
# # Originally created by sjs
|
80
|
-
# module ActiveRecordExtensions
|
81
|
-
# def self.included(base)
|
82
|
-
# base.extend(ClassMethods)
|
83
|
-
# end
|
84
|
-
#
|
85
|
-
# module ClassMethods
|
86
|
-
# def find_or_create(params)
|
87
|
-
# begin
|
88
|
-
# return self.find(params[:id])
|
89
|
-
# rescue ActiveRecord::RecordNotFound => e
|
90
|
-
# attrs = {}
|
91
|
-
#
|
92
|
-
# # search for valid attributes in params
|
93
|
-
# self.column_names.map(&:to_sym).each do |attrib|
|
94
|
-
# # skip unknown columns, and the id field
|
95
|
-
# next if params[attrib].nil? || attrib == :id
|
96
|
-
#
|
97
|
-
# attrs[attrib] = params[attrib]
|
98
|
-
# end
|
99
|
-
#
|
100
|
-
# # call the appropriate ActiveRecord finder method
|
101
|
-
# found = self.send("find_by_#{attrs.keys.join('_and_')}", *attrs.values) if !attrs.empty?
|
102
|
-
#
|
103
|
-
# if found && !found.nil?
|
104
|
-
# return found
|
105
|
-
# else
|
106
|
-
# return self.create(params)
|
107
|
-
# end
|
108
|
-
# end
|
109
|
-
# end
|
110
|
-
# alias create_or_find find_or_create
|
111
|
-
# end
|
112
|
-
# end
|
113
|
-
#
|
114
|
-
# ActiveRecord::Base.send(:include, ActiveRecordExtensions)
|
115
|
-
|
116
|
-
# Copyright: Jay Philips
|
117
|
-
# jicksta.com/articles/2007/08/04/the-methodphitamine
|
118
|
-
module Kernel
|
119
|
-
protected
|
120
|
-
def it() It.new end
|
121
|
-
alias its it
|
122
|
-
end
|
123
|
-
|
124
|
-
class It
|
125
|
-
|
126
|
-
undef_method(*(instance_methods - %w*__id__ __send__*))
|
127
|
-
|
128
|
-
def initialize
|
129
|
-
@methods = []
|
130
|
-
end
|
131
|
-
|
132
|
-
def method_missing(*args, &block)
|
133
|
-
@methods << [args, block] unless args == [:respond_to?, :to_proc]
|
134
|
-
self
|
135
|
-
end
|
136
|
-
|
137
|
-
def to_proc
|
138
|
-
lambda do |obj|
|
139
|
-
@methods.inject(obj) do |current,(args,block)|
|
140
|
-
current.send(*args, &block)
|
141
|
-
end
|
142
|
-
end
|
143
|
-
end
|
144
|
-
end
|