ulla 0.9.3
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/.git/COMMIT_EDITMSG +13 -0
- data/.git/HEAD +1 -0
- data/.git/config +11 -0
- data/.git/description +1 -0
- data/.git/hooks/applypatch-msg.sample +15 -0
- data/.git/hooks/commit-msg.sample +24 -0
- data/.git/hooks/post-commit.sample +8 -0
- data/.git/hooks/post-receive.sample +15 -0
- data/.git/hooks/post-update.sample +8 -0
- data/.git/hooks/pre-applypatch.sample +14 -0
- data/.git/hooks/pre-commit.sample +18 -0
- data/.git/hooks/pre-rebase.sample +169 -0
- data/.git/hooks/prepare-commit-msg.sample +36 -0
- data/.git/hooks/update.sample +107 -0
- data/.git/index +0 -0
- data/.git/info/exclude +6 -0
- data/.git/logs/HEAD +3 -0
- data/.git/logs/refs/heads/master +3 -0
- data/.git/logs/refs/remotes/origin/HEAD +1 -0
- data/.git/objects/06/9494e479f28b5751fb135b8e55e8fef3d3a02e +0 -0
- data/.git/objects/22/0df784191ad94983ca1d943e49fe482c9d1069 +0 -0
- data/.git/objects/3b/b6f2b7f563175a13a0ccd723aab761552f448b +0 -0
- data/.git/objects/41/f48aefb4d7a6a87eb423eaae77ae1e8a58dd6c +0 -0
- data/.git/objects/44/d1f1782e3ea1d9fd2f9054784b53e8e810a8ca +0 -0
- data/.git/objects/4f/364c2eac29f5c7fcbf06419c4f58074cd32ace +2 -0
- data/.git/objects/57/1326145a7a4b3e58f3d3008ba343135f213b05 +4 -0
- data/.git/objects/6c/4f0844f62b7345f0651b0fb2829a8f157469fb +3 -0
- data/.git/objects/73/8dc79450de050f12d48a32602f2ddbe6807029 +0 -0
- data/.git/objects/7b/4acb3aee6616d80e295ee21fe8bb7ee93ebe96 +2 -0
- data/.git/objects/9e/0a9235b0d70a8029098070007fb414cb52504e +2 -0
- data/.git/objects/9e/bfcad2906aac4a23a7c9689a47b76723f5d152 +0 -0
- data/.git/objects/a6/578c95f2f474303464b572e9dac716432472b2 +0 -0
- data/.git/objects/a8/65ef5700ff04601c6fc40fa5ede3cc25534723 +0 -0
- data/.git/objects/aa/285cb176668c5e49c54c6e1d3cc27bd47fd4f4 +0 -0
- data/.git/objects/b8/e3828a1082137c4aa4595386bdfb73e3c75b9d +0 -0
- data/.git/objects/c2/fb6afc000952b56354fe195682645000d2aea2 +0 -0
- data/.git/objects/c4/a0553ca0e3c4628e688ecb5e3304a8a8ac0c28 +2 -0
- data/.git/objects/c8/d49f83c4a32cff2d87dd4aa5f83eb7aac3a753 +5 -0
- data/.git/objects/ca/c25e8049075ed4bff993705acb4750b2b62ba9 +0 -0
- data/.git/objects/d2/ff2e939339eb3fb776e064c258e71dfa1cf396 +0 -0
- data/.git/objects/d7/cedf9e2a8ff35b5d7dafdc0f20daed9c65ce44 +0 -0
- data/.git/objects/e2/e81af59e3a6c4aa8daac62add62860ae776ba4 +0 -0
- data/.git/objects/e5/7c47d183ce5dda1a944c7ee1c19c8a0c4bb278 +0 -0
- data/.git/objects/eb/f4a4e1e50bb30731597f776e56b0ccb0c9959f +0 -0
- data/.git/objects/f6/39d6f6cf883fde4b9052012919c1df3288c7da +0 -0
- data/.git/objects/f8/2346f308f49053df108b7c31ac3089e8b4b4ac +0 -0
- data/.git/objects/fb/4b193bb1cbe9041d2f00176f6caa6acfb1fc12 +0 -0
- data/.git/objects/pack/pack-aebf617a0b8e016433238d2f21f542bc5b21bd15.idx +0 -0
- data/.git/objects/pack/pack-aebf617a0b8e016433238d2f21f542bc5b21bd15.pack +0 -0
- data/.git/packed-refs +8 -0
- data/.git/refs/heads/master +1 -0
- data/.git/refs/remotes/origin/HEAD +1 -0
- data/.gitignore +8 -0
- data/History.txt +42 -0
- data/Manifest.txt +90 -0
- data/PostInstall.txt +5 -0
- data/README.rdoc +259 -0
- data/Rakefile +32 -0
- data/bin/ulla +10 -0
- data/config/website.yml +2 -0
- data/config/website.yml.sample +2 -0
- data/lib/math_extensions.rb +7 -0
- data/lib/narray_extensions.rb +22 -0
- data/lib/nmatrix_extensions.rb +245 -0
- data/lib/string_extensions.rb +17 -0
- data/lib/ulla/cli.rb +1742 -0
- data/lib/ulla/environment.rb +34 -0
- data/lib/ulla/environment_class_hash.rb +20 -0
- data/lib/ulla/environment_feature.rb +26 -0
- data/lib/ulla/environment_feature_array.rb +12 -0
- data/lib/ulla/heatmap_array.rb +111 -0
- data/lib/ulla.rb +6 -0
- data/script/console +10 -0
- data/script/destroy +14 -0
- data/script/generate +14 -0
- data/script/txt2html +71 -0
- data/test/test_helper.rb +2 -0
- data/test/test_math_extensions.rb +11 -0
- data/test/test_narray_extensions.rb +14 -0
- data/test/test_nmatrix_extensions.rb +16 -0
- data/test/test_string_extensions.rb +11 -0
- data/test/test_ulla.rb +11 -0
- data/test/ulla/test_cli.rb +9 -0
- data/test/ulla/test_environment_class_hash.rb +25 -0
- data/test/ulla/test_environment_feature.rb +29 -0
- data/website/index.html +16 -0
- data/website/index.txt +217 -0
- data/website/javascripts/rounded_corners_lite.inc.js +285 -0
- data/website/stylesheets/screen.css +158 -0
- data/website/template.html.erb +57 -0
- metadata +215 -0
@@ -0,0 +1,34 @@
|
|
1
|
+
module Ulla
|
2
|
+
class Environment
|
3
|
+
|
4
|
+
attr_accessor :amino_acids,
|
5
|
+
:number,
|
6
|
+
:label,
|
7
|
+
:freq_array,
|
8
|
+
:prob_array,
|
9
|
+
:logo_array,
|
10
|
+
:smooth_prob_array
|
11
|
+
|
12
|
+
def initialize(number, label, amino_acids = "ACDEFGHIKLMNPQRSTVWYJ".split(''))
|
13
|
+
@amino_acids = amino_acids
|
14
|
+
@number = number
|
15
|
+
@label = label
|
16
|
+
@freq_array = $noweight ? NArray.int(@amino_acids.size) : NArray.float(@amino_acids.size)
|
17
|
+
@prob_array = NArray.float(@amino_acids.size)
|
18
|
+
@logo_array = NArray.float(@amino_acids.size)
|
19
|
+
@smooth_prob_array = NArray.float(@amino_acids.size)
|
20
|
+
end
|
21
|
+
|
22
|
+
def increase_residue_count(a, inc = 1.0)
|
23
|
+
@freq_array[@amino_acids.index(a.upcase)] += inc
|
24
|
+
end
|
25
|
+
|
26
|
+
def label_set
|
27
|
+
label.split("").map_with_index { |l, i| "#{i}#{l}" }.to_set
|
28
|
+
end
|
29
|
+
|
30
|
+
def to_s
|
31
|
+
"#{number}-#{label}"
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
module Ulla
|
2
|
+
class EnvironmentClassHash < Hash
|
3
|
+
|
4
|
+
def group_by_non_residue_labels
|
5
|
+
self.values.group_by { |env| env.label[1..-1] }
|
6
|
+
end
|
7
|
+
|
8
|
+
def groups_sorted_by_residue_labels
|
9
|
+
group_by_non_residue_labels.to_a.sort_by { |env_group|
|
10
|
+
env_group[0].split('').map_with_index { |l, i|
|
11
|
+
$env_features[i + 1].labels.index(l)
|
12
|
+
}
|
13
|
+
}
|
14
|
+
end
|
15
|
+
|
16
|
+
def group_size
|
17
|
+
group_by_non_residue_labels.size
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
module Ulla
|
2
|
+
class EnvironmentFeature
|
3
|
+
|
4
|
+
attr_accessor :name, :symbols, :labels, :constrained, :silent
|
5
|
+
|
6
|
+
def initialize(name, symbols, labels, constrained, silent)
|
7
|
+
@name = name
|
8
|
+
@symbols = symbols
|
9
|
+
@labels = labels
|
10
|
+
@constrained = constrained
|
11
|
+
@silent = silent
|
12
|
+
end
|
13
|
+
|
14
|
+
def to_s
|
15
|
+
[name, symbols.join, labels.join, constrained, silent].join(";")
|
16
|
+
end
|
17
|
+
|
18
|
+
def constrained?
|
19
|
+
constrained == "T"
|
20
|
+
end
|
21
|
+
|
22
|
+
def silent?
|
23
|
+
silent == "T"
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,111 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'facets'
|
3
|
+
|
4
|
+
begin
|
5
|
+
require 'RMagick'
|
6
|
+
include Magick
|
7
|
+
rescue
|
8
|
+
$logger.warn "A RubyGems package, 'rmagick' is not found, so heat maps cannot be generated."
|
9
|
+
$no_rmagick = true
|
10
|
+
end
|
11
|
+
|
12
|
+
|
13
|
+
|
14
|
+
module Ulla
|
15
|
+
class HeatmapArray < Array
|
16
|
+
|
17
|
+
def heatmap(options = {})
|
18
|
+
if $no_rmagick
|
19
|
+
return nil
|
20
|
+
end
|
21
|
+
|
22
|
+
opts = {:columns => 4,
|
23
|
+
:rvg_width => nil,
|
24
|
+
:dpi => 100,
|
25
|
+
:title => '',
|
26
|
+
:max_val => nil,
|
27
|
+
:mid_val => nil,
|
28
|
+
:min_val => nil,
|
29
|
+
:print_gradient => true,
|
30
|
+
:gradient_beg_color => '#FFFFFF',
|
31
|
+
:gradient_mid_color => nil,
|
32
|
+
:gradient_end_color => '#FF0000',
|
33
|
+
:gradient_border_width => 1,
|
34
|
+
:gradient_border_color => '#000000'}.merge(options)
|
35
|
+
|
36
|
+
row_images = ImageList.new
|
37
|
+
|
38
|
+
self.each_by(opts[:columns]) { |maps|
|
39
|
+
images = ImageList.new
|
40
|
+
maps.each { |m| images << m }
|
41
|
+
row_images << images.append(false)
|
42
|
+
}
|
43
|
+
|
44
|
+
tbl_img = row_images.append(true)
|
45
|
+
|
46
|
+
unless opts[:print_gradient]
|
47
|
+
return tbl_img
|
48
|
+
else
|
49
|
+
RVG::dpi = opts[:dpi]
|
50
|
+
rvg_width = opts[:rvg_width] * opts[:columns]
|
51
|
+
rvg_height = rvg_width / 10.0
|
52
|
+
|
53
|
+
rvg = RVG.new(rvg_width, rvg_height) do |canvas|
|
54
|
+
canvas.viewbox(0, 0, rvg_width, rvg_height)
|
55
|
+
canvas.background_fill = 'white'
|
56
|
+
canvas.desc = 'gradient key'
|
57
|
+
|
58
|
+
gradient_width = rvg_width / 2.0
|
59
|
+
gradient_height = gradient_width / 15.0
|
60
|
+
|
61
|
+
if opts[:gradient_mid_color]
|
62
|
+
img1 = Image.new(gradient_width / 2,
|
63
|
+
gradient_height,
|
64
|
+
GradientFill.new(0, 0, 0, gradient_width / 2,
|
65
|
+
opts[:gradient_beg_color], opts[:gradient_mid_color]))
|
66
|
+
|
67
|
+
img2 = Image.new(gradient_width / 2,
|
68
|
+
gradient_height,
|
69
|
+
GradientFill.new(0, 0, 0, gradient_width / 2,
|
70
|
+
opts[:gradient_mid_color], opts[:gradient_end_color]))
|
71
|
+
|
72
|
+
img3 = ImageList.new
|
73
|
+
img3 << img1 << img2
|
74
|
+
img = img3.append(false)
|
75
|
+
else
|
76
|
+
img = Image.new(gradient_width,
|
77
|
+
gradient_height,
|
78
|
+
GradientFill.new(0, 0, 0, gradient_width,
|
79
|
+
opts[:gradient_beg_color], opts[:gradient_end_color]))
|
80
|
+
end
|
81
|
+
|
82
|
+
img.border!(opts[:gradient_border_width],
|
83
|
+
opts[:gradient_border_width],
|
84
|
+
opts[:gradient_border_color])
|
85
|
+
|
86
|
+
gradient_x = (rvg_width - gradient_width) / 2.0
|
87
|
+
gradient_y = (rvg_height - gradient_height) / 2.0
|
88
|
+
gradient_font_size = rvg_width / 45.0
|
89
|
+
|
90
|
+
canvas.image(img,
|
91
|
+
gradient_width,
|
92
|
+
gradient_height,
|
93
|
+
gradient_x,
|
94
|
+
gradient_y)
|
95
|
+
|
96
|
+
canvas.text(gradient_x,
|
97
|
+
gradient_y + gradient_height + gradient_font_size * 1.1,
|
98
|
+
"#{'%.1f' % opts[:min_val]}").styles(:font_size => gradient_font_size)
|
99
|
+
|
100
|
+
canvas.text(gradient_x + gradient_width,
|
101
|
+
gradient_y + gradient_height + gradient_font_size * 1.1,
|
102
|
+
"#{'%.1f' % opts[:max_val]}").styles(:font_size => gradient_font_size)
|
103
|
+
end
|
104
|
+
|
105
|
+
fin_img = ImageList.new
|
106
|
+
fin_img << tbl_img << rvg.draw
|
107
|
+
fin_img.append(true)
|
108
|
+
end
|
109
|
+
end
|
110
|
+
end
|
111
|
+
end
|
data/lib/ulla.rb
ADDED
data/script/console
ADDED
@@ -0,0 +1,10 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# File: script/console
|
3
|
+
irb = RUBY_PLATFORM =~ /(:?mswin|mingw)/ ? 'irb.bat' : 'irb'
|
4
|
+
|
5
|
+
libs = " -r irb/completion"
|
6
|
+
# Perhaps use a console_lib to store any extra methods I may want available in the cosole
|
7
|
+
# libs << " -r #{File.dirname(__FILE__) + '/../lib/console_lib/console_logger.rb'}"
|
8
|
+
libs << " -r #{File.dirname(__FILE__) + '/../lib/egor.rb'}"
|
9
|
+
puts "Loading egor gem"
|
10
|
+
exec "#{irb} #{libs} --simple-prompt"
|
data/script/destroy
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
APP_ROOT = File.expand_path(File.join(File.dirname(__FILE__), '..'))
|
3
|
+
|
4
|
+
begin
|
5
|
+
require 'rubigen'
|
6
|
+
rescue LoadError
|
7
|
+
require 'rubygems'
|
8
|
+
require 'rubigen'
|
9
|
+
end
|
10
|
+
require 'rubigen/scripts/destroy'
|
11
|
+
|
12
|
+
ARGV.shift if ['--help', '-h'].include?(ARGV[0])
|
13
|
+
RubiGen::Base.use_component_sources! [:rubygems, :newgem, :newgem_theme, :test_unit]
|
14
|
+
RubiGen::Scripts::Destroy.new.run(ARGV)
|
data/script/generate
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
APP_ROOT = File.expand_path(File.join(File.dirname(__FILE__), '..'))
|
3
|
+
|
4
|
+
begin
|
5
|
+
require 'rubigen'
|
6
|
+
rescue LoadError
|
7
|
+
require 'rubygems'
|
8
|
+
require 'rubigen'
|
9
|
+
end
|
10
|
+
require 'rubigen/scripts/generate'
|
11
|
+
|
12
|
+
ARGV.shift if ['--help', '-h'].include?(ARGV[0])
|
13
|
+
RubiGen::Base.use_component_sources! [:rubygems, :newgem, :newgem_theme, :test_unit]
|
14
|
+
RubiGen::Scripts::Generate.new.run(ARGV)
|
data/script/txt2html
ADDED
@@ -0,0 +1,71 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
load File.dirname(__FILE__) + "/../Rakefile"
|
4
|
+
require 'rubyforge'
|
5
|
+
require 'redcloth'
|
6
|
+
require 'syntax/convertors/html'
|
7
|
+
require 'erb'
|
8
|
+
|
9
|
+
download = "http://rubyforge.org/projects/#{$hoe.rubyforge_name}"
|
10
|
+
version = $hoe.version
|
11
|
+
|
12
|
+
def rubyforge_project_id
|
13
|
+
RubyForge.new.configure.autoconfig["group_ids"][$hoe.rubyforge_name]
|
14
|
+
end
|
15
|
+
|
16
|
+
class Fixnum
|
17
|
+
def ordinal
|
18
|
+
# teens
|
19
|
+
return 'th' if (10..19).include?(self % 100)
|
20
|
+
# others
|
21
|
+
case self % 10
|
22
|
+
when 1: return 'st'
|
23
|
+
when 2: return 'nd'
|
24
|
+
when 3: return 'rd'
|
25
|
+
else return 'th'
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
class Time
|
31
|
+
def pretty
|
32
|
+
return "#{mday}#{mday.ordinal} #{strftime('%B')} #{year}"
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
def convert_syntax(syntax, source)
|
37
|
+
return Syntax::Convertors::HTML.for_syntax(syntax).convert(source).gsub(%r!^<pre>|</pre>$!,'')
|
38
|
+
end
|
39
|
+
|
40
|
+
if ARGV.length >= 1
|
41
|
+
src, template = ARGV
|
42
|
+
template ||= File.join(File.dirname(__FILE__), '/../website/template.html.erb')
|
43
|
+
else
|
44
|
+
puts("Usage: #{File.split($0).last} source.txt [template.html.erb] > output.html")
|
45
|
+
exit!
|
46
|
+
end
|
47
|
+
|
48
|
+
template = ERB.new(File.open(template).read)
|
49
|
+
|
50
|
+
title = nil
|
51
|
+
body = nil
|
52
|
+
File.open(src) do |fsrc|
|
53
|
+
title_text = fsrc.readline
|
54
|
+
body_text_template = fsrc.read
|
55
|
+
body_text = ERB.new(body_text_template).result(binding)
|
56
|
+
syntax_items = []
|
57
|
+
body_text.gsub!(%r!<(pre|code)[^>]*?syntax=['"]([^'"]+)[^>]*>(.*?)</\1>!m){
|
58
|
+
ident = syntax_items.length
|
59
|
+
element, syntax, source = $1, $2, $3
|
60
|
+
syntax_items << "<#{element} class='syntax'>#{convert_syntax(syntax, source)}</#{element}>"
|
61
|
+
"syntax-temp-#{ident}"
|
62
|
+
}
|
63
|
+
title = RedCloth.new(title_text).to_html.gsub(%r!<.*?>!,'').strip
|
64
|
+
body = RedCloth.new(body_text).to_html
|
65
|
+
body.gsub!(%r!(?:<pre><code>)?syntax-temp-(\d+)(?:</code></pre>)?!){ syntax_items[$1.to_i] }
|
66
|
+
end
|
67
|
+
stat = File.stat(src)
|
68
|
+
created = stat.ctime
|
69
|
+
modified = stat.mtime
|
70
|
+
|
71
|
+
$stdout << template.result(binding)
|
data/test/test_helper.rb
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
$:.unshift File.join(File.dirname(__FILE__), "..", "lib")
|
2
|
+
|
3
|
+
require "test/unit"
|
4
|
+
require "narray_extensions"
|
5
|
+
|
6
|
+
class TestArrayExtensions < Test::Unit::TestCase
|
7
|
+
|
8
|
+
def test_pretty_string(opts={})
|
9
|
+
m = NArray.float(3).indgen
|
10
|
+
result ="# A B C\n" +
|
11
|
+
"VAL 0.00 1.00 2.00"
|
12
|
+
assert_equal(result, m.pretty_string(:col_header => %w[A B C], :row_header => 'VAL'))
|
13
|
+
end
|
14
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
$:.unshift File.join(File.dirname(__FILE__), "..", "lib")
|
2
|
+
|
3
|
+
require "test/unit"
|
4
|
+
require "nmatrix_extensions"
|
5
|
+
|
6
|
+
class TestNmatrixExtensions < Test::Unit::TestCase
|
7
|
+
|
8
|
+
def test_pretty_string(opts={})
|
9
|
+
m = NMatrix.float(3,3).indgen
|
10
|
+
result ="# A B C\n" +
|
11
|
+
"VAL 0.00 1.00 2.00\n" +
|
12
|
+
" 3.00 4.00 5.00\n" +
|
13
|
+
" 6.00 7.00 8.00"
|
14
|
+
assert_equal(result, m.pretty_string(:col_header => %w[A B C], :row_header => %w[VAL]))
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,11 @@
|
|
1
|
+
$:.unshift File.join(File.dirname(__FILE__), "..", "lib")
|
2
|
+
|
3
|
+
require "test/unit"
|
4
|
+
require "string_extensions"
|
5
|
+
|
6
|
+
class TestStringExtensions < Test::Unit::TestCase
|
7
|
+
|
8
|
+
def test_remove_internal_spaces
|
9
|
+
assert_equal("hellosemin", "he ll o\r\n sem in\r \n".remove_internal_spaces)
|
10
|
+
end
|
11
|
+
end
|
data/test/test_ulla.rb
ADDED
@@ -0,0 +1,25 @@
|
|
1
|
+
$:.unshift File.join(File.dirname(__FILE__), '..', '..', 'lib', 'ulla')
|
2
|
+
|
3
|
+
require 'test/unit'
|
4
|
+
require 'environment_class_hash'
|
5
|
+
|
6
|
+
class TestEnvironmentClassHash < Test::Unit::TestCase
|
7
|
+
|
8
|
+
include Ulla
|
9
|
+
|
10
|
+
def setup
|
11
|
+
@env_cls = EnvironmentClassHash.new
|
12
|
+
end
|
13
|
+
|
14
|
+
def test_group_by_non_residue_labels
|
15
|
+
assert(true)
|
16
|
+
end
|
17
|
+
|
18
|
+
def test_groups_sorted_by_residue_labels
|
19
|
+
assert(true)
|
20
|
+
end
|
21
|
+
|
22
|
+
def group_size
|
23
|
+
assert(true)
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
$:.unshift File.join(File.dirname(__FILE__), '..', '..', 'lib', 'ulla')
|
2
|
+
|
3
|
+
require 'test/unit'
|
4
|
+
require 'environment_feature'
|
5
|
+
|
6
|
+
class TestEnvironmentFeature < Test::Unit::TestCase
|
7
|
+
|
8
|
+
include Ulla
|
9
|
+
|
10
|
+
def setup
|
11
|
+
@env_ftr = EnvironmentFeature.new('Secondary Structure',
|
12
|
+
'HEPC'.split(''),
|
13
|
+
'HEPC'.split(''),
|
14
|
+
'T',
|
15
|
+
'F')
|
16
|
+
end
|
17
|
+
|
18
|
+
def test_to_s
|
19
|
+
assert_equal('Secondary Structure;HEPC;HEPC;T;F', @env_ftr.to_s)
|
20
|
+
end
|
21
|
+
|
22
|
+
def test_constrained?
|
23
|
+
assert(@env_ftr.constrained?)
|
24
|
+
end
|
25
|
+
|
26
|
+
def silent?
|
27
|
+
assert(!@env_ftr.silent?)
|
28
|
+
end
|
29
|
+
end
|
data/website/index.html
ADDED
@@ -0,0 +1,16 @@
|
|
1
|
+
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
|
2
|
+
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
|
3
|
+
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
|
4
|
+
<head>
|
5
|
+
<meta http-equiv="Refresh" content="5; URL=http://github.com/semin/ulla">
|
6
|
+
<title>
|
7
|
+
ulla: a program for calculating environment-specific substitution tables
|
8
|
+
</title>
|
9
|
+
</head>
|
10
|
+
<body>
|
11
|
+
<p>
|
12
|
+
Egor has been renamed to Ulla, and an official web site for Ulla will be available when our new web contents management system is ready. Until then, this page will be redirected to its Git repository, <a href="http://http://github.com/semin/ulla/">http://github.com/semin/ulla</a> in 5 seconds.
|
13
|
+
</p>
|
14
|
+
- Semin
|
15
|
+
</body>
|
16
|
+
</html>
|