rubyfca 0.2.2 → 0.2.4
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +3 -19
- data/README.rdoc +4 -3
- data/Rakefile +56 -2
- data/VERSION +1 -0
- data/bin/rubyfca +12 -24
- data/lib/{rubyfca/ruby_graphviz.rb → ruby_graphviz.rb} +0 -3
- data/lib/rubyfca.rb +15 -85
- data/lib/{rubyfca/trollop.rb → trollop.rb} +1 -1
- data/rubyfca.gemspec +55 -13
- data/test/test_data.cxt +6 -6
- metadata +51 -36
- checksums.yaml +0 -7
- data/Gemfile +0 -4
- data/lib/rubyfca/version.rb +0 -3
- data/test/test_data.csv +0 -7
data/.gitignore
CHANGED
@@ -1,21 +1,5 @@
|
|
1
|
-
*.
|
2
|
-
|
3
|
-
.bundle
|
4
|
-
.config
|
5
|
-
.yardoc
|
6
|
-
Gemfile.lock
|
7
|
-
InstalledFiles
|
8
|
-
_yardoc
|
1
|
+
*.sw?
|
2
|
+
.DS_Store
|
9
3
|
coverage
|
10
|
-
doc/
|
11
|
-
lib/bundler/man
|
12
|
-
pkg
|
13
4
|
rdoc
|
14
|
-
|
15
|
-
test/tmp
|
16
|
-
test/version_tmp
|
17
|
-
tmp
|
18
|
-
.DS_Store
|
19
|
-
*.bak
|
20
|
-
*.~
|
21
|
-
*.log
|
5
|
+
pkg
|
data/README.rdoc
CHANGED
@@ -4,7 +4,7 @@ Command line tool for Formal Concept Analysis (FCA) written in Ruby.
|
|
4
4
|
|
5
5
|
== Features
|
6
6
|
|
7
|
-
* Convert a Conexp's CXT
|
7
|
+
* Convert a Conexp's CXT file and generate a Graphviz DOT file, or a PNG/JPG/EPS image file.
|
8
8
|
* Adopt the Ganter algorithm (through its Perl implementation of Fcastone by Uta Priss).
|
9
9
|
|
10
10
|
== Installation
|
@@ -19,7 +19,7 @@ Install the gem:
|
|
19
19
|
|
20
20
|
where:
|
21
21
|
<source file>
|
22
|
-
"foo.cxt"
|
22
|
+
"foo.cxt"
|
23
23
|
<output file>
|
24
24
|
"bar.dot", "bar.png", "bar.jpg", or "bar.eps"
|
25
25
|
[options]:
|
@@ -33,6 +33,7 @@ Install the gem:
|
|
33
33
|
|
34
34
|
== ToDo
|
35
35
|
|
36
|
+
* Multiple input formats (such as CSV)
|
36
37
|
* Database connection capability
|
37
38
|
|
38
39
|
== Links
|
@@ -41,4 +42,4 @@ under construction
|
|
41
42
|
|
42
43
|
== Copyright
|
43
44
|
|
44
|
-
Copyright (c) 2009
|
45
|
+
Copyright (c) 2009 Yoichiro Hasebe and Kow Kuroda. See LICENSE for details.
|
data/Rakefile
CHANGED
@@ -1,2 +1,56 @@
|
|
1
|
-
|
2
|
-
require
|
1
|
+
require 'rubygems'
|
2
|
+
require 'rake'
|
3
|
+
|
4
|
+
begin
|
5
|
+
require 'jeweler'
|
6
|
+
Jeweler::Tasks.new do |gem|
|
7
|
+
gem.name = "rubyfca"
|
8
|
+
gem.summary = %Q{TODO: one-line summary of your gem}
|
9
|
+
gem.description = %Q{TODO: longer description of your gem}
|
10
|
+
gem.email = "yohasebe@gmail.com"
|
11
|
+
gem.homepage = "http://github.com/yohasebe/rubyfca"
|
12
|
+
gem.authors = ["Yoichiro Hasebe"]
|
13
|
+
gem.add_development_dependency "thoughtbot-shoulda"
|
14
|
+
# gem is a Gem::Specification... see http://www.rubygems.org/read/chapter/20 for additional settings
|
15
|
+
end
|
16
|
+
rescue LoadError
|
17
|
+
puts "Jeweler (or a dependency) not available. Install it with: sudo gem install jeweler"
|
18
|
+
end
|
19
|
+
|
20
|
+
require 'rake/testtask'
|
21
|
+
Rake::TestTask.new(:test) do |test|
|
22
|
+
test.libs << 'lib' << 'test'
|
23
|
+
test.pattern = 'test/**/*_test.rb'
|
24
|
+
test.verbose = true
|
25
|
+
end
|
26
|
+
|
27
|
+
begin
|
28
|
+
require 'rcov/rcovtask'
|
29
|
+
Rcov::RcovTask.new do |test|
|
30
|
+
test.libs << 'test'
|
31
|
+
test.pattern = 'test/**/*_test.rb'
|
32
|
+
test.verbose = true
|
33
|
+
end
|
34
|
+
rescue LoadError
|
35
|
+
task :rcov do
|
36
|
+
abort "RCov is not available. In order to run rcov, you must: sudo gem install spicycode-rcov"
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
task :test => :check_dependencies
|
41
|
+
|
42
|
+
task :default => :test
|
43
|
+
|
44
|
+
require 'rake/rdoctask'
|
45
|
+
Rake::RDocTask.new do |rdoc|
|
46
|
+
if File.exist?('VERSION')
|
47
|
+
version = File.read('VERSION')
|
48
|
+
else
|
49
|
+
version = ""
|
50
|
+
end
|
51
|
+
|
52
|
+
rdoc.rdoc_dir = 'rdoc'
|
53
|
+
rdoc.title = "rubyfca #{version}"
|
54
|
+
rdoc.rdoc_files.include('README*')
|
55
|
+
rdoc.rdoc_files.include('lib/**/*.rb')
|
56
|
+
end
|
data/VERSION
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
0.2.4
|
data/bin/rubyfca
CHANGED
@@ -1,15 +1,14 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
|
-
# -*- coding: utf-8 -*-
|
3
|
-
Encoding.default_external = "UTF-8"
|
4
|
-
|
5
2
|
|
6
3
|
$:.unshift File.join(File.dirname(__FILE__), '..', 'lib')
|
4
|
+
require 'trollop'
|
7
5
|
require 'rubyfca'
|
6
|
+
require 'ruby_graphviz'
|
8
7
|
|
9
8
|
################ parse options ##########
|
10
9
|
|
11
10
|
opts = Trollop::options do
|
12
|
-
version
|
11
|
+
version = File.read(File.dirname(__FILE__) + "/../VERSION")
|
13
12
|
banner <<-EOS
|
14
13
|
|
15
14
|
RubuFCA converts Conexp CXT data to Graphviz dot format.
|
@@ -19,24 +18,19 @@ Usage:
|
|
19
18
|
|
20
19
|
where:
|
21
20
|
<source file>
|
22
|
-
".cxt"
|
21
|
+
".cxt"
|
23
22
|
<output file>
|
24
23
|
."dot", ".png", ".jpg", or ".eps"
|
25
24
|
[options]:
|
26
25
|
EOS
|
27
26
|
|
27
|
+
opt :circle, "Use circle shaped concept nodes", :default=> false
|
28
28
|
opt :full, "Do not contract concept labels", :default=> false
|
29
|
-
opt :coloring, "Color concept nodes [0 = none (default), 1 = lightblue/pink, 2 = monochrome]", :default => 0
|
30
|
-
opt :straight, "Straighten edges (available when output format is either png, jpg, svg, pdf, or eps)", :default => false
|
31
|
-
opt :nodesep, "Size of separation between sister nodes (from 0.1 to 5.0)", :default => 0.4
|
32
|
-
opt :ranksep, "Size of separation between ranks (from 0.1 to 5.0)", :default => 0.2
|
33
29
|
opt :legend, "Print the legend of concept nodes (available only when using circle node shape)", :default => false
|
34
|
-
opt :
|
35
|
-
|
30
|
+
opt :coloring, "Color concept nodes", :default => false
|
31
|
+
opt :straight, "Straighten edges (available when output format is either png, jpg, or eps)", :default => false
|
36
32
|
end
|
37
|
-
|
38
|
-
Trollop::die :ranksep, "must be within 0.1 - 5.0" if (opts[:ranksep] < 0.1 || opts[:ranksep] > 5.0)
|
39
|
-
Trollop::die :nodesep, "must be within 0.1 - 5.0" if (opts[:nodesep] < 0.1 || opts[:nodesep] > 5.0)
|
33
|
+
|
40
34
|
############### main program ###############
|
41
35
|
|
42
36
|
if ARGV.size != 2
|
@@ -52,17 +46,15 @@ filename2 = ARGV[1] #output filename
|
|
52
46
|
input_type = filename1.slice(/\.[^\.]+\z/).split(//)[1..-1].join("")
|
53
47
|
output_type = filename2.slice(/\.[^\.]+\z/).split(//)[1..-1].join("")
|
54
48
|
|
55
|
-
if (input_type !~ /\A(cxt|csv)\z/ || output_type !~ /\A(dot|png|jpg|
|
49
|
+
if (input_type !~ /\A(cxt|csv)\z/ || output_type !~ /\A(dot|png|jpg|eps)\z/)
|
56
50
|
showerror("These file extensions are not (yet) supported.", 1)
|
57
51
|
end
|
58
52
|
|
59
53
|
#
|
60
|
-
# input data is kept as plain text
|
54
|
+
# input cxt data is kept as plain text
|
61
55
|
#
|
62
|
-
f = File.open(filename1, "r
|
63
|
-
|
56
|
+
f = File.open(filename1, "r")
|
64
57
|
inputdata = f.read
|
65
|
-
inputdata.gsub!(/\r\n?/){"\n"}
|
66
58
|
f.close
|
67
59
|
|
68
60
|
#
|
@@ -80,7 +72,7 @@ end
|
|
80
72
|
# context data is converted to a hash table
|
81
73
|
#
|
82
74
|
begin
|
83
|
-
ctxt = FormalContext.new(inputdata,
|
75
|
+
ctxt = FormalContext.new(inputdata, opts[:full])
|
84
76
|
ctxt.calcurate
|
85
77
|
# rescue => e
|
86
78
|
# puts e
|
@@ -99,10 +91,6 @@ when "png"
|
|
99
91
|
ctxt.generate_img(filename2, "png", opts)
|
100
92
|
when "jpg"
|
101
93
|
ctxt.generate_img(filename2, "jpg", opts)
|
102
|
-
when "svg"
|
103
|
-
ctxt.generate_img(filename2, "svg", opts)
|
104
|
-
when "pdf"
|
105
|
-
ctxt.generate_img(filename2, "pdf", opts)
|
106
94
|
when "eps"
|
107
95
|
ctxt.generate_img(filename2, "eps", opts)
|
108
96
|
end
|
data/lib/rubyfca.rb
CHANGED
@@ -1,18 +1,11 @@
|
|
1
|
-
#!/usr/bin/env ruby
|
2
|
-
# -*- coding: utf-8 -*-
|
3
|
-
|
4
1
|
## lib/rubyfca.rb -- Formal Concept Analysis tool in Ruby
|
5
2
|
## Author:: Yoichiro Hasebe (mailto: yohasebe@gmail.com)
|
6
3
|
## Kow Kuroda (mailto: kuroda@nict.go.jp)
|
7
4
|
## Copyright:: Copyright 2009 Yoichiro Hasebe and Kow Kuroda
|
8
5
|
## License:: GNU GPL version 3
|
9
6
|
|
10
|
-
|
11
|
-
|
12
|
-
require 'csv'
|
7
|
+
$KCODE ='utf-8'
|
13
8
|
require 'ruby_graphviz'
|
14
|
-
require 'version'
|
15
|
-
require 'trollop'
|
16
9
|
|
17
10
|
private
|
18
11
|
|
@@ -46,65 +39,22 @@ end
|
|
46
39
|
class FormalContext
|
47
40
|
|
48
41
|
## Converte cxt data to three basic structures of objects, attributes, and matrix
|
49
|
-
def initialize(input,
|
42
|
+
def initialize(input, label_contraction = true)
|
50
43
|
if input.size == 0
|
51
44
|
showerror("File is empty", 1)
|
52
45
|
end
|
53
|
-
input.gsub!(" ", " ")
|
54
|
-
# begin
|
55
|
-
case mode
|
56
|
-
when /cxt\z/
|
57
|
-
read_cxt(input)
|
58
|
-
when /csv\z/
|
59
|
-
read_csv(input)
|
60
|
-
end
|
61
|
-
# rescue => e
|
62
|
-
# showerror("Input data contains a syntax problem.", 1)
|
63
|
-
# end
|
64
|
-
@label_contraction = label_contraction
|
65
|
-
end
|
66
|
-
|
67
|
-
## process cxt data
|
68
|
-
def read_cxt(input)
|
69
46
|
lines = input.split
|
70
47
|
t1 = 3
|
71
48
|
if (lines[0] !~ /B/i || (2 * lines[1].to_i + lines[2].to_i + t1) != lines.size)
|
72
49
|
showerror("Wrong cxt format!", 1)
|
73
50
|
end
|
51
|
+
|
52
|
+
@label_contraction = label_contraction
|
53
|
+
|
74
54
|
@objects = lines[t1..(lines[1].to_i + t1 - 1)]
|
75
55
|
@attributes = lines[(lines[1].to_i + t1) .. (lines[1].to_i + lines[2].to_i + t1 - 1)]
|
76
56
|
lines = lines[(lines[1].to_i + lines[2].to_i + t1) .. lines.size]
|
77
|
-
@matrix = changecrosssymbol("X", "\\.", lines)
|
78
|
-
end
|
79
|
-
|
80
|
-
# process csv data using the standard csv library
|
81
|
-
def read_csv(input)
|
82
|
-
input = remove_blank(input)
|
83
|
-
data = CSV.parse(input)
|
84
|
-
@objects = trim_ary(data.transpose.first[1..-1])
|
85
|
-
@attributes = trim_ary(data.first[1..-1])
|
86
|
-
@matrix = []
|
87
|
-
data[1..-1].each do |line|
|
88
|
-
@matrix << line[1..-1].collect { |cell| /x/i =~ cell ? 1 : 0 }
|
89
|
-
end
|
90
|
-
end
|
91
|
-
|
92
|
-
def remove_blank(input)
|
93
|
-
blank_removed = ""
|
94
|
-
input.split("\n").each do |line|
|
95
|
-
line = line.strip
|
96
|
-
unless /\A\s*\z/ =~ line
|
97
|
-
blank_removed << line + "\n"
|
98
|
-
end
|
99
|
-
end
|
100
|
-
blank_removed
|
101
|
-
end
|
102
|
-
|
103
|
-
def trim_ary(ary)
|
104
|
-
newary = ary.collect do |cell|
|
105
|
-
cell.strip
|
106
|
-
end
|
107
|
-
newary
|
57
|
+
@matrix = changecrosssymbol("X", "\\.", lines)
|
108
58
|
end
|
109
59
|
|
110
60
|
## Apply a formal concept analysis on the matrix
|
@@ -201,8 +151,8 @@ class FormalContext
|
|
201
151
|
a1 = extension[0].join("")
|
202
152
|
a2 = extension[1].join("")
|
203
153
|
if a1 == a2
|
204
|
-
extension
|
205
|
-
intension
|
154
|
+
shift extension
|
155
|
+
shift intension
|
206
156
|
anzCpt -= 1
|
207
157
|
end
|
208
158
|
|
@@ -334,9 +284,8 @@ class FormalContext
|
|
334
284
|
## For options, see 'rubyfca'
|
335
285
|
def generate_dot(opts)
|
336
286
|
index_max_width = @concepts.size.to_s.split(//).size
|
337
|
-
|
338
|
-
|
339
|
-
clattice = RubyGraphviz.new("clattice", :rankdir => "", :nodesep => nodesep, :ranksep => ranksep)
|
287
|
+
|
288
|
+
clattice = RubyGraphviz.new("clattice", :rankdir => "", :nodesep => "0.4", :ranksep => "0.2")
|
340
289
|
|
341
290
|
if opts[:circle] and opts[:legend]
|
342
291
|
legend = RubyGraphviz.new("legend", :rankdir => "TB", :lebelloc => "t", :centered => "false")
|
@@ -360,9 +309,7 @@ class FormalContext
|
|
360
309
|
attrfull = []
|
361
310
|
0.upto(@gammaM.size - 1) do |j|
|
362
311
|
if @gammaM[j][i] == 2
|
363
|
-
|
364
|
-
# obj = opts[:full] ? @objects[j] + " " + [0x261C].pack("U") : @objects[j]
|
365
|
-
obj = opts[:full] ? @objects[j] + "*" : @objects[j]
|
312
|
+
obj = opts[:full] ? @objects[j] + " " + [0x261C].pack("U") : @objects[j]
|
366
313
|
objfull << obj
|
367
314
|
elsif @gammaM[j][i] == 1
|
368
315
|
objfull << @objects[j]
|
@@ -370,9 +317,7 @@ class FormalContext
|
|
370
317
|
end
|
371
318
|
0.upto(@muM.size - 1) do |k|
|
372
319
|
if @muM[k][i] == 2
|
373
|
-
|
374
|
-
# att = opts[:full] ? @attributes[k] + " " + [0x261C].pack("U") : @attributes[k]
|
375
|
-
att = opts[:full] ? @attributes[k] + "*" : @attributes[k]
|
320
|
+
att = opts[:full] ? @attributes[k] + " " + [0x261C].pack("U") : @attributes[k]
|
376
321
|
attrfull << att
|
377
322
|
elsif @muM[k][i] == 1
|
378
323
|
attrfull << @attributes[k]
|
@@ -383,25 +328,10 @@ class FormalContext
|
|
383
328
|
|
384
329
|
attr_str = attrfull.join('<br />')
|
385
330
|
attr_str = attr_str == "" ? " " : attr_str
|
386
|
-
|
387
|
-
if opts[:coloring] == 0 or /\A\s+\z/ =~ attr_str
|
388
|
-
attr_color = "white"
|
389
|
-
elsif opts[:coloring] == 1
|
390
|
-
attr_color = "lightblue"
|
391
|
-
elsif opts[:coloring] == 2
|
392
|
-
attr_color = "gray87"
|
393
|
-
end
|
394
|
-
|
331
|
+
attr_color = (!opts[:coloring] || /\A\s+\z/ =~ attr_str) ? "white" : "lightblue"
|
395
332
|
obj_str = objfull.join('<br />')
|
396
333
|
obj_str = obj_str == "" ? " " : obj_str
|
397
|
-
|
398
|
-
if opts[:coloring] == 0 or /\A\s+\z/ =~ obj_str
|
399
|
-
obj_color = "white"
|
400
|
-
elsif opts[:coloring] == 1
|
401
|
-
obj_color = "pink"
|
402
|
-
elsif opts[:coloring] == 2
|
403
|
-
obj_color = "gray92"
|
404
|
-
end
|
334
|
+
obj_color = (!opts[:coloring] || /\A\s+\z/ =~ obj_str) ? "white" : "pink"
|
405
335
|
|
406
336
|
label = "<<table border=\"0\" cellborder=\"1\" cellspacing=\"0\">" +
|
407
337
|
"<tr><td balign=\"left\" align=\"left\" bgcolor=\"#{attr_color}\">#{attr_str}</td></tr>" +
|
@@ -415,7 +345,7 @@ class FormalContext
|
|
415
345
|
"<tr><td balign=\"left\" align=\"left\" bgcolor=\"#{obj_color}\">#{obj_str}</td></tr>" +
|
416
346
|
"</table>>"
|
417
347
|
|
418
|
-
if !attrfull.empty?
|
348
|
+
if !attrfull.empty? and !objfull.empty?
|
419
349
|
legend.node("cl#{concept_id}k", :label => concept_id, :style => "invis")
|
420
350
|
legend.node("cl#{concept_id}v", :label => leg, :fillcolor => "white")
|
421
351
|
legend.rank("cl#{concept_id}k", "cl#{concept_id}v", :style => "invis", :length => "0.0")
|
@@ -413,7 +413,7 @@ class Parser
|
|
413
413
|
|
414
414
|
## Print the help message to +stream+.
|
415
415
|
def educate stream=$stdout
|
416
|
-
width # just
|
416
|
+
width # just calculate it now; otherwise we have to be careful not to
|
417
417
|
# call this unless the cursor's at the beginning of a line.
|
418
418
|
|
419
419
|
left = {}
|
data/rubyfca.gemspec
CHANGED
@@ -1,17 +1,59 @@
|
|
1
|
+
# Generated by jeweler
|
2
|
+
# DO NOT EDIT THIS FILE
|
3
|
+
# Instead, edit Jeweler::Tasks in Rakefile, and run `rake gemspec`
|
1
4
|
# -*- encoding: utf-8 -*-
|
2
|
-
require File.expand_path('../lib/rubyfca/version', __FILE__)
|
3
5
|
|
4
|
-
Gem::Specification.new do |
|
5
|
-
|
6
|
-
|
7
|
-
gem.summary = %q{Command line FCA tool written in Ruby}
|
8
|
-
gem.description = %q{Command line Formal Concept Analysis (FCA) tool written in Ruby}
|
9
|
-
gem.homepage = "http://github.com/yohasebe/rubyfca"
|
6
|
+
Gem::Specification.new do |s|
|
7
|
+
s.name = %q{rubyfca}
|
8
|
+
s.version = "0.2.4"
|
10
9
|
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
10
|
+
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
|
+
s.authors = ["Yoichiro Hasebe", "Kow Kuroda"]
|
12
|
+
s.date = %q{2009-09-04}
|
13
|
+
s.default_executable = %q{rubyfca}
|
14
|
+
s.description = %q{Command line Formal Concept Ananlysis (FCA) tool written in Ruby}
|
15
|
+
s.email = %q{yohasebe@gmail.com}
|
16
|
+
s.executables = ["rubyfca"]
|
17
|
+
s.extra_rdoc_files = [
|
18
|
+
"LICENSE",
|
19
|
+
"README.rdoc"
|
20
|
+
]
|
21
|
+
s.files = [
|
22
|
+
".document",
|
23
|
+
".gitignore",
|
24
|
+
"LICENSE",
|
25
|
+
"README.rdoc",
|
26
|
+
"Rakefile",
|
27
|
+
"VERSION",
|
28
|
+
"bin/rubyfca",
|
29
|
+
"lib/ruby_graphviz.rb",
|
30
|
+
"lib/rubyfca.rb",
|
31
|
+
"lib/trollop.rb",
|
32
|
+
"rubyfca.gemspec",
|
33
|
+
"test/rubyfca_test.rb",
|
34
|
+
"test/test_data.cxt",
|
35
|
+
"test/test_helper.rb"
|
36
|
+
]
|
37
|
+
s.homepage = %q{http://github.com/yohasebe/rubyfca}
|
38
|
+
s.rdoc_options = ["--charset=UTF-8"]
|
39
|
+
s.require_paths = ["lib"]
|
40
|
+
s.rubygems_version = %q{1.3.5}
|
41
|
+
s.summary = %q{Command line Formal Concept Analysis (FCA) tool written in Ruby}
|
42
|
+
s.test_files = [
|
43
|
+
"test/rubyfca_test.rb",
|
44
|
+
"test/test_helper.rb"
|
45
|
+
]
|
46
|
+
|
47
|
+
if s.respond_to? :specification_version then
|
48
|
+
current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
|
49
|
+
s.specification_version = 3
|
50
|
+
|
51
|
+
if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
|
52
|
+
s.add_development_dependency(%q<thoughtbot-shoulda>, [">= 0"])
|
53
|
+
else
|
54
|
+
s.add_dependency(%q<thoughtbot-shoulda>, [">= 0"])
|
55
|
+
end
|
56
|
+
else
|
57
|
+
s.add_dependency(%q<thoughtbot-shoulda>, [">= 0"])
|
58
|
+
end
|
17
59
|
end
|
data/test/test_data.cxt
CHANGED
@@ -8,18 +8,18 @@ Sparrow
|
|
8
8
|
Eagle
|
9
9
|
Lion
|
10
10
|
Bonobo
|
11
|
-
Human
|
11
|
+
Human
|
12
12
|
bird
|
13
13
|
mammal
|
14
14
|
ape
|
15
15
|
flying
|
16
16
|
preying
|
17
17
|
talking
|
18
|
-
|
19
|
-
|
20
|
-
|
18
|
+
X.....
|
19
|
+
X..X..
|
20
|
+
X..XX.
|
21
|
+
.X..X.
|
21
22
|
.XX...
|
22
|
-
|
23
|
-
.....X
|
23
|
+
.XX..X
|
24
24
|
|
25
25
|
|
metadata
CHANGED
@@ -1,65 +1,80 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: rubyfca
|
3
|
-
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.2.4
|
5
5
|
platform: ruby
|
6
|
-
authors:
|
6
|
+
authors:
|
7
7
|
- Yoichiro Hasebe
|
8
8
|
- Kow Kuroda
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
-
|
17
|
-
|
12
|
+
|
13
|
+
date: 2009-09-04 00:00:00 +09:00
|
14
|
+
default_executable: rubyfca
|
15
|
+
dependencies:
|
16
|
+
- !ruby/object:Gem::Dependency
|
17
|
+
name: thoughtbot-shoulda
|
18
|
+
type: :development
|
19
|
+
version_requirement:
|
20
|
+
version_requirements: !ruby/object:Gem::Requirement
|
21
|
+
requirements:
|
22
|
+
- - ">="
|
23
|
+
- !ruby/object:Gem::Version
|
24
|
+
version: "0"
|
25
|
+
version:
|
26
|
+
description: Command line Formal Concept Ananlysis (FCA) tool written in Ruby
|
27
|
+
email: yohasebe@gmail.com
|
28
|
+
executables:
|
18
29
|
- rubyfca
|
19
30
|
extensions: []
|
20
|
-
|
21
|
-
|
22
|
-
-
|
23
|
-
-
|
24
|
-
|
31
|
+
|
32
|
+
extra_rdoc_files:
|
33
|
+
- LICENSE
|
34
|
+
- README.rdoc
|
35
|
+
files:
|
36
|
+
- .document
|
37
|
+
- .gitignore
|
25
38
|
- LICENSE
|
26
39
|
- README.rdoc
|
27
40
|
- Rakefile
|
41
|
+
- VERSION
|
28
42
|
- bin/rubyfca
|
43
|
+
- lib/ruby_graphviz.rb
|
29
44
|
- lib/rubyfca.rb
|
30
|
-
- lib/
|
31
|
-
- lib/rubyfca/trollop.rb
|
32
|
-
- lib/rubyfca/version.rb
|
45
|
+
- lib/trollop.rb
|
33
46
|
- rubyfca.gemspec
|
34
47
|
- test/rubyfca_test.rb
|
35
|
-
- test/test_data.csv
|
36
48
|
- test/test_data.cxt
|
37
49
|
- test/test_helper.rb
|
50
|
+
has_rdoc: true
|
38
51
|
homepage: http://github.com/yohasebe/rubyfca
|
39
52
|
licenses: []
|
40
|
-
|
53
|
+
|
41
54
|
post_install_message:
|
42
|
-
rdoc_options:
|
43
|
-
|
55
|
+
rdoc_options:
|
56
|
+
- --charset=UTF-8
|
57
|
+
require_paths:
|
44
58
|
- lib
|
45
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
46
|
-
requirements:
|
59
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
60
|
+
requirements:
|
47
61
|
- - ">="
|
48
|
-
- !ruby/object:Gem::Version
|
49
|
-
version:
|
50
|
-
|
51
|
-
|
62
|
+
- !ruby/object:Gem::Version
|
63
|
+
version: "0"
|
64
|
+
version:
|
65
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
66
|
+
requirements:
|
52
67
|
- - ">="
|
53
|
-
- !ruby/object:Gem::Version
|
54
|
-
version:
|
68
|
+
- !ruby/object:Gem::Version
|
69
|
+
version: "0"
|
70
|
+
version:
|
55
71
|
requirements: []
|
72
|
+
|
56
73
|
rubyforge_project:
|
57
|
-
rubygems_version:
|
74
|
+
rubygems_version: 1.3.5
|
58
75
|
signing_key:
|
59
|
-
specification_version:
|
60
|
-
summary: Command line FCA tool written in Ruby
|
61
|
-
test_files:
|
76
|
+
specification_version: 3
|
77
|
+
summary: Command line Formal Concept Analysis (FCA) tool written in Ruby
|
78
|
+
test_files:
|
62
79
|
- test/rubyfca_test.rb
|
63
|
-
- test/test_data.csv
|
64
|
-
- test/test_data.cxt
|
65
80
|
- test/test_helper.rb
|
checksums.yaml
DELETED
@@ -1,7 +0,0 @@
|
|
1
|
-
---
|
2
|
-
SHA1:
|
3
|
-
metadata.gz: 1a7c7bc3a45c296b6a2a7447106284ff7cef7871
|
4
|
-
data.tar.gz: d5da0d7b0dffe7d8b33dd662133222bbe0720c10
|
5
|
-
SHA512:
|
6
|
-
metadata.gz: 99a30f945baf45ec345c9ed614b9de725a743784f09136434117db65d6e2a7bef10ccf3cd9131eb28d1d5364efa9bf8d464e9ff939bbe789ef81a0ea2b2b109f
|
7
|
-
data.tar.gz: 4642dbe52edc0c57d17f3d8401f8531a29b2019327180114d9d7e38a375d76f858d6801e359036151bc88cdffe7186a17ea55a84754d64b41919afa747c1adeb
|
data/Gemfile
DELETED
data/lib/rubyfca/version.rb
DELETED