stamina-gui 0.5.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/CHANGELOG.md +78 -0
- data/LICENCE.md +22 -0
- data/examples/0-reference/1-automaton-adl.rb +52 -0
- data/examples/0-reference/2-sample-adl.rb +56 -0
- data/examples/1-automata/1-introduction.rb +0 -0
- data/examples/1-automata/2-metrics.rb +0 -0
- data/examples/2-regular-languages/1-introduction.rb +22 -0
- data/examples/2-regular-languages/2-complement.rb +14 -0
- data/examples/2-regular-languages/3-difference.rb +5 -0
- data/examples/3-grammar-induction/1-introduction.rb +34 -0
- data/examples/3-grammar-induction/2-kernel.rb +32 -0
- data/examples/3-grammar-induction/3-characteristic-sample.rb +49 -0
- data/lib/stamina-gui/stamina-gui.rb +1 -0
- data/lib/stamina-gui/stamina/command/gui.rb +19 -0
- data/lib/stamina-gui/stamina/gui.rb +2 -0
- data/lib/stamina-gui/stamina/gui/app.rb +69 -0
- data/lib/stamina-gui/stamina/gui/examples.rb +68 -0
- data/lib/stamina-gui/stamina/gui/public/css/images/ui-bg_diagonals-thick_18_b81900_40x40.png +0 -0
- data/lib/stamina-gui/stamina/gui/public/css/images/ui-bg_diagonals-thick_20_666666_40x40.png +0 -0
- data/lib/stamina-gui/stamina/gui/public/css/images/ui-bg_flat_10_000000_40x100.png +0 -0
- data/lib/stamina-gui/stamina/gui/public/css/images/ui-bg_glass_100_f6f6f6_1x400.png +0 -0
- data/lib/stamina-gui/stamina/gui/public/css/images/ui-bg_glass_100_fdf5ce_1x400.png +0 -0
- data/lib/stamina-gui/stamina/gui/public/css/images/ui-bg_glass_65_ffffff_1x400.png +0 -0
- data/lib/stamina-gui/stamina/gui/public/css/images/ui-bg_gloss-wave_35_f6a828_500x100.png +0 -0
- data/lib/stamina-gui/stamina/gui/public/css/images/ui-bg_highlight-soft_100_eeeeee_1x100.png +0 -0
- data/lib/stamina-gui/stamina/gui/public/css/images/ui-bg_highlight-soft_75_ffe45c_1x100.png +0 -0
- data/lib/stamina-gui/stamina/gui/public/css/images/ui-icons_222222_256x240.png +0 -0
- data/lib/stamina-gui/stamina/gui/public/css/images/ui-icons_228ef1_256x240.png +0 -0
- data/lib/stamina-gui/stamina/gui/public/css/images/ui-icons_ef8c08_256x240.png +0 -0
- data/lib/stamina-gui/stamina/gui/public/css/images/ui-icons_ffd27a_256x240.png +0 -0
- data/lib/stamina-gui/stamina/gui/public/css/images/ui-icons_ffffff_256x240.png +0 -0
- data/lib/stamina-gui/stamina/gui/public/css/jquery-ui-1.8.16.css +568 -0
- data/lib/stamina-gui/stamina/gui/public/css/stamina.less +63 -0
- data/lib/stamina-gui/stamina/gui/public/feedback.html +1 -0
- data/lib/stamina-gui/stamina/gui/public/js/ace-eclipse.js +1 -0
- data/lib/stamina-gui/stamina/gui/public/js/ace-ruby.js +1 -0
- data/lib/stamina-gui/stamina/gui/public/js/ace-textmate.js +1 -0
- data/lib/stamina-gui/stamina/gui/public/js/ace-twilight.js +1 -0
- data/lib/stamina-gui/stamina/gui/public/js/ace.js +1 -0
- data/lib/stamina-gui/stamina/gui/public/js/jquery-1.6.2.min.js +18 -0
- data/lib/stamina-gui/stamina/gui/public/js/jquery-ui-1.8.16.min.js +791 -0
- data/lib/stamina-gui/stamina/gui/public/js/less-1.1.3.min.js +16 -0
- data/lib/stamina-gui/stamina/gui/public/js/mustache.js +325 -0
- data/lib/stamina-gui/stamina/gui/public/js/stamina.js +75 -0
- data/lib/stamina-gui/stamina/gui/templates/image.erb +3 -0
- data/lib/stamina-gui/stamina/gui/templates/index.erb +67 -0
- metadata +136 -0
data/CHANGELOG.md
ADDED
@@ -0,0 +1,78 @@
|
|
1
|
+
# 0.5.0 / FIX ME
|
2
|
+
|
3
|
+
* Breaking features.
|
4
|
+
|
5
|
+
* Support for ruby 1.8.7 has been definitely removed.
|
6
|
+
|
7
|
+
* Major enhancements
|
8
|
+
|
9
|
+
* The project has been split in different sub gems (core, induction and gui). This
|
10
|
+
implies a lot of internal changes, but the public API has not been affected. A main
|
11
|
+
'stamina' gem automatically includes all sub gems so previous behavior is guaranteed.
|
12
|
+
|
13
|
+
* Minor enhancements
|
14
|
+
* Fixed a bug with bundler usage in main stamina binary
|
15
|
+
* adl2dot command now support samples as input in addition to automata. In that case,
|
16
|
+
the dot result models a PTA (prefix tree acceptor)
|
17
|
+
* Added --png to 'stamina adl2dot'
|
18
|
+
|
19
|
+
# 0.4.0 / 2011-05-01
|
20
|
+
|
21
|
+
* Major Enhancements
|
22
|
+
|
23
|
+
* Added Automaton#to_adl as an shortcut for Stamina::ADL::print_automaton(...)
|
24
|
+
* Added Sample#to_pta taken from Induction::Commons
|
25
|
+
* Added Automaton completion (all strings parsable) under Automaton#complete[!?]
|
26
|
+
* Added Automaton stripping (removal of unreachable states) under Automaton#strip[!]
|
27
|
+
* Added Automaton minimization (Hopcroft + Pitchies) under Automaton#minimize
|
28
|
+
* Added Abbadingo generators under Abbadingo::RandomDFA and Abbadingo::RandomSample
|
29
|
+
* Added a main 'stamina' command relying on Quickl. classiy/adl2dot commands become
|
30
|
+
subcommands of stamina itself (see stamina --help for a list of available commands).
|
31
|
+
Induction command (rpni and redblue) are now handled by a 'stamina infer' with
|
32
|
+
options.
|
33
|
+
* Error states and now correctly handled in ADL::parse and ADL::flush
|
34
|
+
* RedBlue has been renamed as BlueFringe everywhere (red_?blue -> blue_fringe)
|
35
|
+
|
36
|
+
* Minnor Enhancements
|
37
|
+
* Added a few optimizations here and there
|
38
|
+
|
39
|
+
* Bug fixes
|
40
|
+
|
41
|
+
* Fixed a bug in Automaton#depth when some states are unreachable
|
42
|
+
|
43
|
+
# 0.3.1 / 2011-03-24
|
44
|
+
|
45
|
+
* Major Enhancements
|
46
|
+
|
47
|
+
* Implemented the decoration algorithm of Damas10, allowing to decorate states
|
48
|
+
with information propagated from states to states until a fixpoint is reached.
|
49
|
+
* Added Automaton::Metrics module, automatically included, with useful metrics
|
50
|
+
like automaton depth, accepting ratio and so on.
|
51
|
+
* Added Scoring module and Classifier#classification_scoring(sample) method
|
52
|
+
with common measures from information retrieval.
|
53
|
+
|
54
|
+
* On the devel side
|
55
|
+
|
56
|
+
* Moved specific automaton tests under test/stamina/automaton/...
|
57
|
+
|
58
|
+
# 0.3.0 / 2011-03-24
|
59
|
+
|
60
|
+
* On the devel side
|
61
|
+
|
62
|
+
* The project structure is now handled by Noe
|
63
|
+
* Ensures that tests are correctly executed under ruby 1.9.2
|
64
|
+
|
65
|
+
|
66
|
+
# 0.2.2 / 2010-10-22
|
67
|
+
|
68
|
+
* Major Enhancements
|
69
|
+
|
70
|
+
* Sample#<< does not detect inconsistencies anymore, to ensure a linear method instead of a quadratic one.
|
71
|
+
|
72
|
+
* On the devel side
|
73
|
+
|
74
|
+
* Fixes a bug in Rakefile that lead to test failures under ruby 1.8.7
|
75
|
+
|
76
|
+
# 0.2.1 / 2010-05-01
|
77
|
+
|
78
|
+
* Main public version for the official competition, extracted from private SVN.
|
data/LICENCE.md
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
The MIT License
|
2
|
+
|
3
|
+
Copyright (c) 2008-2009 University of Louvain
|
4
|
+
(Universite catholique de Louvain-la-Neuve, Belgium)
|
5
|
+
|
6
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
7
|
+
of this software and associated documentation files (the "Software"), to deal
|
8
|
+
in the Software without restriction, including without limitation the rights
|
9
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
10
|
+
copies of the Software, and to permit persons to whom the Software is
|
11
|
+
furnished to do so, subject to the following conditions:
|
12
|
+
|
13
|
+
The above copyright notice and this permission notice shall be included in
|
14
|
+
all copies or substantial portions of the Software.
|
15
|
+
|
16
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
17
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
18
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
19
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
20
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
21
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
22
|
+
THE SOFTWARE.
|
@@ -0,0 +1,52 @@
|
|
1
|
+
code = <<-ADL
|
2
|
+
# First, it allows line comments 'a la' ruby, that is, lines starting with '#'
|
3
|
+
# are simply ignored. White spaces may also be inserted between the comment
|
4
|
+
# symbol like
|
5
|
+
# this
|
6
|
+
# Empty lines are also ignored:
|
7
|
+
|
8
|
+
# Still about comments and white spaces: end-of-line comments are also supported
|
9
|
+
# (see documentation on right later). Moreover, white spaces and tabs are allowed
|
10
|
+
# at beginning and end of lines as well as between state and edge elements.
|
11
|
+
|
12
|
+
# Next, the first (non comment or empty) line of the file must contain the number
|
13
|
+
# of states then the number of edges of the automaton: (white spaces between them,
|
14
|
+
# whitespace before and after are allowed) we refer to these two numbers as
|
15
|
+
# state_count and edge_count respectively (here: five states and six edges)
|
16
|
+
5 6
|
17
|
+
|
18
|
+
# Then, we expect exactly state_count state definitions. A state definition is
|
19
|
+
# composed of three informations: 1) a state identifier (any string), 2) 'true'
|
20
|
+
# or 'false' for initial flag, 3) 'true' or 'false' for accepting flag. These
|
21
|
+
# informations are simply separated by white spaces:
|
22
|
+
0 true false # here a state with identifier 0
|
23
|
+
# this state is initial and not accepting
|
24
|
+
|
25
|
+
identified_state false true # this kind of identifier is also allowed
|
26
|
+
# this state is not initial but is accepting
|
27
|
+
|
28
|
+
# other states below ...
|
29
|
+
2 false false
|
30
|
+
3 false true
|
31
|
+
4 false false
|
32
|
+
|
33
|
+
# Then, we expect exactly edge_count edge definitions. An edge definition is
|
34
|
+
# simple as well: source and target state identifiers followed by a labeling
|
35
|
+
# input symbol (any word).
|
36
|
+
0 identified_state hello # the first edge says hello from source
|
37
|
+
# state 0 to state identified_state
|
38
|
+
|
39
|
+
identified_state 2 w # identified_state 'sends' w to state 2
|
40
|
+
|
41
|
+
# and other edges below ...
|
42
|
+
2 3 o
|
43
|
+
3 4 r
|
44
|
+
4 4 l
|
45
|
+
4 0 d
|
46
|
+
|
47
|
+
# This automaton grammar does not provide a way to define empty symbols
|
48
|
+
# (something like '', which is interpreted for itself) nor does it provide an
|
49
|
+
# epsilon predefined character. You'll have to post-process your automaton
|
50
|
+
# yourself, sorry!
|
51
|
+
ADL
|
52
|
+
result = automaton(code)
|
@@ -0,0 +1,56 @@
|
|
1
|
+
code = <<-ADL
|
2
|
+
# First, it allows line comments 'a la' ruby, that is, lines starting with '#'
|
3
|
+
# are simply ignored. Whitespaces may also be inserted before the comment symbol
|
4
|
+
# like
|
5
|
+
# this
|
6
|
+
# Empty lines are also ignored:
|
7
|
+
|
8
|
+
# Still about comments and whitespaces: end-of-line comments are NOT supported
|
9
|
+
# because they would not allow using '#' as a input string symbol. Whitespaces
|
10
|
+
# and tabs are allowed (and ignored) at begining and end of lines as well as
|
11
|
+
# between input symbols (see later).
|
12
|
+
|
13
|
+
# Next, a sample is a sequence of input strings, separated by newlines (aka
|
14
|
+
# carriage return). An input string is simply a sequence of input symbols,
|
15
|
+
# separated by whitespace(s) or tabs. Symbols are simple characters or words.
|
16
|
+
# An input string is labeled as positive if its first symbol is '+', negative
|
17
|
+
# if it's '-' and unlabeled of the first symbol is '?' ('+', '-' and '?' symbols
|
18
|
+
# won't be not part of the input string itself). If the string does not start with one
|
19
|
+
# of these symbols, it is considered as an error string and ADL raises an error.
|
20
|
+
# '+', '-' and '?' anywhere else in the string count for themselve. So, positive,
|
21
|
+
# negative and unlabeled strings respectively looks like:
|
22
|
+
+ a b a b
|
23
|
+
- a a
|
24
|
+
? a b
|
25
|
+
|
26
|
+
# That's all ... here are some other examples and comments:
|
27
|
+
|
28
|
+
# This is the positive empty string (negative empty string is a simple '-' line,
|
29
|
+
# not shown here because it would create an inconsistent sample; unlabeled empty
|
30
|
+
# string is simply the '?' line):
|
31
|
+
+
|
32
|
+
|
33
|
+
# We've said earlier that words are accepted as input symbols, and we warn you
|
34
|
+
# that the following strings are not equivalent (the first has two symbols only,
|
35
|
+
# the second has ten symbols and the last has only one.
|
36
|
+
+ hello world
|
37
|
+
+ h e l l o w o r l d
|
38
|
+
+ helloworld
|
39
|
+
|
40
|
+
# but whitespaces and tabs do not count, so the following positive string is already
|
41
|
+
# part of this sample:
|
42
|
+
+ h e l l o w o r l d
|
43
|
+
|
44
|
+
# The following strings are supported: '+' and '-' count for themselve, expect
|
45
|
+
# the first, and the last is part of a '+a' symbol.
|
46
|
+
+ a + b - a - b +a
|
47
|
+
|
48
|
+
# A last example, to insist on comment rules: here all '#" count for themselve:
|
49
|
+
+ # a # b a b # and all these words are symbols too !!
|
50
|
+
|
51
|
+
# This sample grammar does not provide a way to define empty symbols
|
52
|
+
# (something like '', which is interpreted for itself) nor does it provide an
|
53
|
+
# epsilon predefined character. You'll have to post-process your sample
|
54
|
+
# yourself, sorry!
|
55
|
+
ADL
|
56
|
+
result = sample(code)
|
File without changes
|
File without changes
|
@@ -0,0 +1,22 @@
|
|
1
|
+
#
|
2
|
+
# Stamina recognizes regular expressions thanks the `regular` function.
|
3
|
+
#
|
4
|
+
|
5
|
+
# Let's build a regular language
|
6
|
+
abstar = regular("(a b)*")
|
7
|
+
|
8
|
+
# More complex regular languages may be put on multiple lines
|
9
|
+
complex = regular <<-LANG
|
10
|
+
(a b)+
|
11
|
+
| a+
|
12
|
+
| b
|
13
|
+
LANG
|
14
|
+
|
15
|
+
# Sometimes, it is useful to capture the universal regular language
|
16
|
+
# over an alphabet, that is,
|
17
|
+
univ = regular("(a | b | c | d | e)*")
|
18
|
+
|
19
|
+
# Here is a friendly shortcut, very useful if the alphabet become
|
20
|
+
# large
|
21
|
+
univ2 = sigma_star('a'..'e')
|
22
|
+
assert univ <=> univ2
|
@@ -0,0 +1,14 @@
|
|
1
|
+
abstar = regular("(a b)*")
|
2
|
+
|
3
|
+
# The complement of a regular language language L is defined as
|
4
|
+
# the set of strings not belonging to L
|
5
|
+
complement = abstar**-1
|
6
|
+
|
7
|
+
# The complement of the complement is the regular language itself
|
8
|
+
compcomp = complement**-1
|
9
|
+
assert abstar <=> compcomp
|
10
|
+
|
11
|
+
# Also observe that the complement of a regular language can be
|
12
|
+
# computed explicitly as the
|
13
|
+
otherway = regular("(a | b)*") - abstar
|
14
|
+
assert otherway <=> complement
|
@@ -0,0 +1,34 @@
|
|
1
|
+
#
|
2
|
+
# This is the introduction example for Stamina induction algorithms
|
3
|
+
#
|
4
|
+
# Classical induction is aimed at learning a regular language from a
|
5
|
+
# `positive` sample, under the control of a `negative` sample.
|
6
|
+
#
|
7
|
+
# Samples are commonly captured through a Prefix Tree Acceptor (PTA).
|
8
|
+
# A PTA capturing both a positive and a negative sample is called an
|
9
|
+
# Augmented PTA (APTA)
|
10
|
+
#
|
11
|
+
|
12
|
+
# a positive sample will be captured through a PTA
|
13
|
+
# (accepting states capture positive strings)
|
14
|
+
positive = sample <<-SAMPLE
|
15
|
+
+
|
16
|
+
+ a
|
17
|
+
+ b b
|
18
|
+
+ b b a
|
19
|
+
+ b a a b
|
20
|
+
+ b a a a b a
|
21
|
+
SAMPLE
|
22
|
+
|
23
|
+
# a negative sample will be captured through a PTA
|
24
|
+
# (no accepting states, but error states capturing negative
|
25
|
+
# strings)
|
26
|
+
negative = sample <<-SAMPLE
|
27
|
+
- b
|
28
|
+
- a b
|
29
|
+
- a b a
|
30
|
+
SAMPLE
|
31
|
+
|
32
|
+
# The union of samples is recognized as follows, and captured through
|
33
|
+
# an APTA (observe that both accepting and error states are present)
|
34
|
+
training = positive + negative
|
@@ -0,0 +1,32 @@
|
|
1
|
+
lang = automaton <<-ADL
|
2
|
+
3 5
|
3
|
+
0 true true
|
4
|
+
1 false false
|
5
|
+
2 false true
|
6
|
+
0 1 a
|
7
|
+
1 1 a
|
8
|
+
1 2 b
|
9
|
+
2 2 b
|
10
|
+
2 0 a
|
11
|
+
ADL
|
12
|
+
|
13
|
+
# In a canonical automaton A(lang) of language `lang`, the set of short prefixes
|
14
|
+
# is the set of first strings in standard order, each leading to a particular
|
15
|
+
# state of the canonical automaton. As a consequence, there are as many short
|
16
|
+
# pre-fixes as states in A(lang). In other words, the short prefixes uniquely
|
17
|
+
# identify the states of A(lang).
|
18
|
+
prefixes = short_prefixes(lang)
|
19
|
+
|
20
|
+
# The kernel of a language is made of its short prefixes extended by one symbol
|
21
|
+
# together with the empty string. By construction, the short prefixes all belong
|
22
|
+
# to the kernel. The kernel elements capture the transitions of the canonical
|
23
|
+
# automaton A(lang). Indeed, they are obtained by adding one symbol to the short
|
24
|
+
# pre-fixes which capture its states.
|
25
|
+
kernel = kernel(lang)
|
26
|
+
|
27
|
+
characteristic = characteristic_sample(lang)
|
28
|
+
|
29
|
+
# A characteristic sample is such that RPNI will find the target automaton if
|
30
|
+
# invoked
|
31
|
+
rpnied = rpni(characteristic)
|
32
|
+
assert (regular(lang) - rpnied).empty?
|
@@ -0,0 +1,49 @@
|
|
1
|
+
target = automaton <<-ADL
|
2
|
+
3 5
|
3
|
+
0 true true
|
4
|
+
1 false false
|
5
|
+
2 false true
|
6
|
+
0 1 a
|
7
|
+
1 1 a
|
8
|
+
1 2 b
|
9
|
+
2 2 b
|
10
|
+
2 0 a
|
11
|
+
ADL
|
12
|
+
|
13
|
+
characteristic = sample <<-ADL
|
14
|
+
# Sp(L) - short prefixes
|
15
|
+
# ?
|
16
|
+
# ? a
|
17
|
+
# ? a b
|
18
|
+
#
|
19
|
+
# N(L) - kernel
|
20
|
+
# ?
|
21
|
+
# ? a
|
22
|
+
# ? a a
|
23
|
+
# ? a b
|
24
|
+
# ? a b b
|
25
|
+
# ? a b a
|
26
|
+
#
|
27
|
+
# these strings for the first condition of the characteristic
|
28
|
+
# sample specification
|
29
|
+
+
|
30
|
+
+ a b
|
31
|
+
+ a a b
|
32
|
+
+ a b b
|
33
|
+
+ a b a
|
34
|
+
# these strings for the second condition
|
35
|
+
- a
|
36
|
+
- b
|
37
|
+
- a a
|
38
|
+
+ a b b a
|
39
|
+
- a b a b
|
40
|
+
- a a a
|
41
|
+
- b b
|
42
|
+
- b b b
|
43
|
+
+ a b b b
|
44
|
+
- b a
|
45
|
+
- b a b
|
46
|
+
ADL
|
47
|
+
|
48
|
+
learned = rpni(characteristic)
|
49
|
+
assert learned <=> target
|
@@ -0,0 +1 @@
|
|
1
|
+
require_relative 'stamina/gui'
|
@@ -0,0 +1,19 @@
|
|
1
|
+
module Stamina
|
2
|
+
class Command
|
3
|
+
#
|
4
|
+
# Launches the Stamina Web GUI
|
5
|
+
#
|
6
|
+
# SYNOPSIS
|
7
|
+
# #{program_name} #{command_name}
|
8
|
+
#
|
9
|
+
class Gui < Quickl::Command(__FILE__, __LINE__)
|
10
|
+
|
11
|
+
# Command execution
|
12
|
+
def execute(args)
|
13
|
+
require_relative '../gui'
|
14
|
+
Stamina::Gui::App.run!
|
15
|
+
end
|
16
|
+
|
17
|
+
end # class Gui
|
18
|
+
end # class Command
|
19
|
+
end # module Stamina
|
@@ -0,0 +1,69 @@
|
|
1
|
+
require 'tmpdir'
|
2
|
+
require 'json'
|
3
|
+
require 'sinatra/base'
|
4
|
+
require_relative 'examples'
|
5
|
+
module Stamina
|
6
|
+
module Gui
|
7
|
+
class App < Sinatra::Base
|
8
|
+
|
9
|
+
### business
|
10
|
+
|
11
|
+
def go_for(tempdir, src)
|
12
|
+
source = File.join(tempdir, "source.rb")
|
13
|
+
File.open(source, "w"){|io| io << src}
|
14
|
+
Stamina::Command::Run.run(["--all", "--gif", source])
|
15
|
+
end
|
16
|
+
|
17
|
+
### file helpers
|
18
|
+
|
19
|
+
def self._(path)
|
20
|
+
File.expand_path(path, File.dirname(__FILE__))
|
21
|
+
end
|
22
|
+
def _(path); self.class._(path); end
|
23
|
+
|
24
|
+
set :public_folder, _('public')
|
25
|
+
set :views, _('templates')
|
26
|
+
set :tmpdir, Dir.mktmpdir("stamina-gui")
|
27
|
+
|
28
|
+
get '/' do
|
29
|
+
erb :index, :locals => {
|
30
|
+
:examples => Gui::Examples.new
|
31
|
+
}
|
32
|
+
end
|
33
|
+
|
34
|
+
# example handlers
|
35
|
+
get '/examples/:folder/:file' do
|
36
|
+
cache_control :no_cache
|
37
|
+
expires 0, :no_cache
|
38
|
+
send_file File.join(Gui::Examples::FOLDER,
|
39
|
+
params[:folder],
|
40
|
+
"#{params[:file]}.rb")
|
41
|
+
end
|
42
|
+
|
43
|
+
# THE go post service
|
44
|
+
|
45
|
+
post '/go' do
|
46
|
+
context = go_for(settings.tmpdir, params[:src])
|
47
|
+
content_type :json
|
48
|
+
context.collect{|k,v|
|
49
|
+
(k != :main and v.respond_to?(:to_dot)) ? k : nil
|
50
|
+
}.compact.to_json
|
51
|
+
end
|
52
|
+
|
53
|
+
# image results
|
54
|
+
|
55
|
+
get '/image/:name' do
|
56
|
+
cache_control :no_cache
|
57
|
+
expires 0, :no_cache
|
58
|
+
erb :image, :locals => { :name => params[:name] }
|
59
|
+
end
|
60
|
+
|
61
|
+
get '/automata/*' do
|
62
|
+
cache_control :no_cache
|
63
|
+
expires 0, :no_cache
|
64
|
+
send_file File.join(settings.tmpdir, params[:splat])
|
65
|
+
end
|
66
|
+
|
67
|
+
end # class App
|
68
|
+
end # module Gui
|
69
|
+
end # module Stamina
|