bel 0.3.0.beta1-x64-mingw32
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/INSTALL.md +19 -0
 - data/INSTALL_RUBY.md +107 -0
 - data/LICENSE +191 -0
 - data/README.md +319 -0
 - data/bel.gemspec +67 -0
 - data/bin/bel2rdf +134 -0
 - data/bin/bel_compare +177 -0
 - data/bin/bel_parse +60 -0
 - data/bin/bel_rdfschema +72 -0
 - data/bin/bel_summarize +86 -0
 - data/bin/bel_upgrade +175 -0
 - data/bin/bel_upgrade_term +163 -0
 - data/ext/mri/bel-ast.c +221 -0
 - data/ext/mri/bel-ast.h +82 -0
 - data/ext/mri/bel-node-stack.c +83 -0
 - data/ext/mri/bel-node-stack.h +26 -0
 - data/ext/mri/bel-parse-statement.c +122296 -0
 - data/ext/mri/bel-parse-term.c +117670 -0
 - data/ext/mri/bel-parser.c +91 -0
 - data/ext/mri/bel-parser.h +13 -0
 - data/ext/mri/bel-token.c +161 -0
 - data/ext/mri/bel-token.h +58 -0
 - data/ext/mri/bel-tokenize-term.c +391 -0
 - data/ext/mri/extconf.rb +8 -0
 - data/ext/mri/libbel.c +5 -0
 - data/ext/mri/libbel.def +26 -0
 - data/lib/bel.rb +17 -0
 - data/lib/bel/completion.rb +53 -0
 - data/lib/bel/completion_rule.rb +236 -0
 - data/lib/bel/language.rb +1052 -0
 - data/lib/bel/namespace.rb +323 -0
 - data/lib/bel/quoting.rb +29 -0
 - data/lib/bel/rdf.rb +314 -0
 - data/lib/bel/script.rb +239632 -0
 - data/lib/features.rb +21 -0
 - data/lib/libbel.rb +201 -0
 - data/lib/libbel.so +0 -0
 - data/lib/util.rb +125 -0
 - metadata +269 -0
 
    
        data/bel.gemspec
    ADDED
    
    | 
         @@ -0,0 +1,67 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            Gem::Specification.new do |spec|
         
     | 
| 
      
 2 
     | 
    
         
            +
              spec.name                     = 'bel'
         
     | 
| 
      
 3 
     | 
    
         
            +
              spec.version                  = '0.3.0.beta1'
         
     | 
| 
      
 4 
     | 
    
         
            +
              spec.summary                  = '''
         
     | 
| 
      
 5 
     | 
    
         
            +
                                                Process BEL with ruby.
         
     | 
| 
      
 6 
     | 
    
         
            +
                                              '''.gsub(%r{^\s+}, ' ').gsub(%r{\n}, '')
         
     | 
| 
      
 7 
     | 
    
         
            +
              spec.description              = '''
         
     | 
| 
      
 8 
     | 
    
         
            +
                                                The BEL gem allows the reading, writing,
         
     | 
| 
      
 9 
     | 
    
         
            +
                                                and processing of BEL (Biological Expression
         
     | 
| 
      
 10 
     | 
    
         
            +
                                                Language) with a natural DSL.
         
     | 
| 
      
 11 
     | 
    
         
            +
                                              '''.gsub(%r{^\s+}, ' ').gsub(%r{\n}, '')
         
     | 
| 
      
 12 
     | 
    
         
            +
              spec.license                  = 'Apache-2.0'
         
     | 
| 
      
 13 
     | 
    
         
            +
              spec.authors                  = [
         
     | 
| 
      
 14 
     | 
    
         
            +
                                                'Anthony Bargnesi',
         
     | 
| 
      
 15 
     | 
    
         
            +
                                                'Natalie Catlett',
         
     | 
| 
      
 16 
     | 
    
         
            +
                                                'Nick Bargnesi',
         
     | 
| 
      
 17 
     | 
    
         
            +
                                                'William Hayes'
         
     | 
| 
      
 18 
     | 
    
         
            +
                                              ]
         
     | 
| 
      
 19 
     | 
    
         
            +
              spec.email                    = [
         
     | 
| 
      
 20 
     | 
    
         
            +
                                                'abargnesi@selventa.com',
         
     | 
| 
      
 21 
     | 
    
         
            +
                                                'ncatlett@selventa.com',
         
     | 
| 
      
 22 
     | 
    
         
            +
                                                'nbargnesi@selventa.com',
         
     | 
| 
      
 23 
     | 
    
         
            +
                                                'whayes@selventa.com'
         
     | 
| 
      
 24 
     | 
    
         
            +
                                              ]
         
     | 
| 
      
 25 
     | 
    
         
            +
              spec.files                    = [
         
     | 
| 
      
 26 
     | 
    
         
            +
                                                Dir.glob("lib/**/*.rb"),
         
     | 
| 
      
 27 
     | 
    
         
            +
                                                Dir.glob("ext/**/*.{c,h,def}"),
         
     | 
| 
      
 28 
     | 
    
         
            +
                                                __FILE__,
         
     | 
| 
      
 29 
     | 
    
         
            +
                                                'LICENSE',
         
     | 
| 
      
 30 
     | 
    
         
            +
                                                'INSTALL.md',
         
     | 
| 
      
 31 
     | 
    
         
            +
                                                'INSTALL_RUBY.md',
         
     | 
| 
      
 32 
     | 
    
         
            +
                                                'README.md'
         
     | 
| 
      
 33 
     | 
    
         
            +
                                              ].flatten!
         
     | 
| 
      
 34 
     | 
    
         
            +
              spec.executables              = Dir.glob('bin/*').map(&File.method(:basename))
         
     | 
| 
      
 35 
     | 
    
         
            +
              spec.homepage                 = 'https://github.com/OpenBEL/bel.rb'
         
     | 
| 
      
 36 
     | 
    
         
            +
              spec.rdoc_options             = [
         
     | 
| 
      
 37 
     | 
    
         
            +
                                                '--title', 'BEL Ruby Documentation',
         
     | 
| 
      
 38 
     | 
    
         
            +
                                                '--main', 'README.md',
         
     | 
| 
      
 39 
     | 
    
         
            +
                                                '--line-numbers',
         
     | 
| 
      
 40 
     | 
    
         
            +
                                                '--exclude', 'lib/bel/script.rb',
         
     | 
| 
      
 41 
     | 
    
         
            +
                                                'README.md',
         
     | 
| 
      
 42 
     | 
    
         
            +
                                                'INSTALL.md',
         
     | 
| 
      
 43 
     | 
    
         
            +
                                                'INSTALL_RUBY.md',
         
     | 
| 
      
 44 
     | 
    
         
            +
                                                'LICENSE'
         
     | 
| 
      
 45 
     | 
    
         
            +
                                              ]
         
     | 
| 
      
 46 
     | 
    
         
            +
             
     | 
| 
      
 47 
     | 
    
         
            +
              spec.extensions              << 'ext/mri/extconf.rb'
         
     | 
| 
      
 48 
     | 
    
         
            +
              spec.required_ruby_version    = '>= 1.9.2'
         
     | 
| 
      
 49 
     | 
    
         
            +
             
     | 
| 
      
 50 
     | 
    
         
            +
              # runtime
         
     | 
| 
      
 51 
     | 
    
         
            +
              spec.add_dependency             'ffi',           '~> 1.9'
         
     | 
| 
      
 52 
     | 
    
         
            +
             
     | 
| 
      
 53 
     | 
    
         
            +
              # test rdf functionality
         
     | 
| 
      
 54 
     | 
    
         
            +
              spec.add_development_dependency 'uuid',          '~> 2.3'
         
     | 
| 
      
 55 
     | 
    
         
            +
              spec.add_development_dependency 'addressable',   '~> 2.3'
         
     | 
| 
      
 56 
     | 
    
         
            +
              spec.add_development_dependency 'rdf',           '~> 1.1'
         
     | 
| 
      
 57 
     | 
    
         
            +
             
     | 
| 
      
 58 
     | 
    
         
            +
              # development gems
         
     | 
| 
      
 59 
     | 
    
         
            +
              spec.add_development_dependency 'bundler',       '~> 1.7'
         
     | 
| 
      
 60 
     | 
    
         
            +
              spec.add_development_dependency 'rake',          '~> 10.4'
         
     | 
| 
      
 61 
     | 
    
         
            +
              spec.add_development_dependency 'rake-compiler', '~> 0.9'
         
     | 
| 
      
 62 
     | 
    
         
            +
              spec.add_development_dependency 'rspec',         '~> 3.2'
         
     | 
| 
      
 63 
     | 
    
         
            +
              spec.add_development_dependency 'yard',          '~> 0.8'
         
     | 
| 
      
 64 
     | 
    
         
            +
              spec.add_development_dependency 'rdoc',          '~> 4.2'
         
     | 
| 
      
 65 
     | 
    
         
            +
            end
         
     | 
| 
      
 66 
     | 
    
         
            +
            # vim: ts=2 sw=2:
         
     | 
| 
      
 67 
     | 
    
         
            +
            # encoding: utf-8
         
     | 
    
        data/bin/bel2rdf
    ADDED
    
    | 
         @@ -0,0 +1,134 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            #!/usr/bin/env ruby
         
     | 
| 
      
 2 
     | 
    
         
            +
            # bel2rdf: Convert BEL to RDF triples.
         
     | 
| 
      
 3 
     | 
    
         
            +
            #
         
     | 
| 
      
 4 
     | 
    
         
            +
            # From BEL file
         
     | 
| 
      
 5 
     | 
    
         
            +
            # usage: bel2rdf -b file.bel
         
     | 
| 
      
 6 
     | 
    
         
            +
            #
         
     | 
| 
      
 7 
     | 
    
         
            +
            # From file
         
     | 
| 
      
 8 
     | 
    
         
            +
            # usage: bel2rdf --bel [FILE]
         
     | 
| 
      
 9 
     | 
    
         
            +
            #
         
     | 
| 
      
 10 
     | 
    
         
            +
            # From standard in
         
     | 
| 
      
 11 
     | 
    
         
            +
            # usage: echo "<BEL DOCUMENT STRING>" | bel2rdf
         
     | 
| 
      
 12 
     | 
    
         
            +
            #
         
     | 
| 
      
 13 
     | 
    
         
            +
            # Format option
         
     | 
| 
      
 14 
     | 
    
         
            +
            # usage: bel2rdf --bel [FILE] --format [ntriples | nquads | turtle]
         
     | 
| 
      
 15 
     | 
    
         
            +
             
     | 
| 
      
 16 
     | 
    
         
            +
            require 'bel'
         
     | 
| 
      
 17 
     | 
    
         
            +
            require 'optparse'
         
     | 
| 
      
 18 
     | 
    
         
            +
            require 'set'
         
     | 
| 
      
 19 
     | 
    
         
            +
            require 'open-uri'
         
     | 
| 
      
 20 
     | 
    
         
            +
             
     | 
| 
      
 21 
     | 
    
         
            +
            # setup and parse options
         
     | 
| 
      
 22 
     | 
    
         
            +
            options = {
         
     | 
| 
      
 23 
     | 
    
         
            +
              format: 'ntriples',
         
     | 
| 
      
 24 
     | 
    
         
            +
              schema: false
         
     | 
| 
      
 25 
     | 
    
         
            +
            }
         
     | 
| 
      
 26 
     | 
    
         
            +
            OptionParser.new do |opts|
         
     | 
| 
      
 27 
     | 
    
         
            +
              opts.banner = '''Converts BEL statements to RDF triples.
         
     | 
| 
      
 28 
     | 
    
         
            +
            Usage: bel2rdf --bel [FILE]'''
         
     | 
| 
      
 29 
     | 
    
         
            +
             
     | 
| 
      
 30 
     | 
    
         
            +
              opts.on('-b', '--bel FILE', 'BEL file to convert.  STDIN (standard in) can also be used for BEL content.') do |bel|
         
     | 
| 
      
 31 
     | 
    
         
            +
                options[:bel] = bel
         
     | 
| 
      
 32 
     | 
    
         
            +
              end
         
     | 
| 
      
 33 
     | 
    
         
            +
             
     | 
| 
      
 34 
     | 
    
         
            +
              opts.on('-f', '--format FORMAT', 'RDF file format.') do |format|
         
     | 
| 
      
 35 
     | 
    
         
            +
                options[:format] = format.downcase
         
     | 
| 
      
 36 
     | 
    
         
            +
              end
         
     | 
| 
      
 37 
     | 
    
         
            +
             
     | 
| 
      
 38 
     | 
    
         
            +
              opts.on('-s', '--[no-]schema', 'Write BEL RDF schema?') do |schema|
         
     | 
| 
      
 39 
     | 
    
         
            +
                options[:schema] = schema
         
     | 
| 
      
 40 
     | 
    
         
            +
              end
         
     | 
| 
      
 41 
     | 
    
         
            +
            end.parse!
         
     | 
| 
      
 42 
     | 
    
         
            +
             
     | 
| 
      
 43 
     | 
    
         
            +
            # option guards
         
     | 
| 
      
 44 
     | 
    
         
            +
            unless options[:bel] or not STDIN.tty?
         
     | 
| 
      
 45 
     | 
    
         
            +
              $stderr.puts "No bel content provided.  Either use --bel option or STDIN (standard in).  Use -h / --help for details." 
         
     | 
| 
      
 46 
     | 
    
         
            +
              exit 1
         
     | 
| 
      
 47 
     | 
    
         
            +
            end
         
     | 
| 
      
 48 
     | 
    
         
            +
            if options[:bel] and not File.exists? options[:bel]
         
     | 
| 
      
 49 
     | 
    
         
            +
              $stderr.puts "No file for bel, #{options[:bel]}"
         
     | 
| 
      
 50 
     | 
    
         
            +
              exit 1
         
     | 
| 
      
 51 
     | 
    
         
            +
            end
         
     | 
| 
      
 52 
     | 
    
         
            +
            unless ['ntriples', 'nquads', 'turtle'].include? options[:format]
         
     | 
| 
      
 53 
     | 
    
         
            +
              $stderr.puts "Format was not one of: ntriples, nquads, or turtle"
         
     | 
| 
      
 54 
     | 
    
         
            +
              exit 1
         
     | 
| 
      
 55 
     | 
    
         
            +
            end
         
     | 
| 
      
 56 
     | 
    
         
            +
             
     | 
| 
      
 57 
     | 
    
         
            +
             
     | 
| 
      
 58 
     | 
    
         
            +
            class Main
         
     | 
| 
      
 59 
     | 
    
         
            +
              include BEL::Language
         
     | 
| 
      
 60 
     | 
    
         
            +
             
     | 
| 
      
 61 
     | 
    
         
            +
              def initialize(content, writer)
         
     | 
| 
      
 62 
     | 
    
         
            +
                BEL::Script.parse(content).find_all { |obj|
         
     | 
| 
      
 63 
     | 
    
         
            +
                  obj.is_a? Statement
         
     | 
| 
      
 64 
     | 
    
         
            +
                }.each do |stmt|
         
     | 
| 
      
 65 
     | 
    
         
            +
                  triples = stmt.to_rdf[1]
         
     | 
| 
      
 66 
     | 
    
         
            +
                  triples.each do |triple|
         
     | 
| 
      
 67 
     | 
    
         
            +
                    writer << triple
         
     | 
| 
      
 68 
     | 
    
         
            +
                  end
         
     | 
| 
      
 69 
     | 
    
         
            +
                end
         
     | 
| 
      
 70 
     | 
    
         
            +
              end
         
     | 
| 
      
 71 
     | 
    
         
            +
            end
         
     | 
| 
      
 72 
     | 
    
         
            +
             
     | 
| 
      
 73 
     | 
    
         
            +
            class Serializer
         
     | 
| 
      
 74 
     | 
    
         
            +
              attr_reader :writer
         
     | 
| 
      
 75 
     | 
    
         
            +
             
     | 
| 
      
 76 
     | 
    
         
            +
              def initialize(stream, format)
         
     | 
| 
      
 77 
     | 
    
         
            +
                rdf_writer = find_writer(format)
         
     | 
| 
      
 78 
     | 
    
         
            +
                @writer = rdf_writer.new($stdout, {
         
     | 
| 
      
 79 
     | 
    
         
            +
                    :stream => stream
         
     | 
| 
      
 80 
     | 
    
         
            +
                  }
         
     | 
| 
      
 81 
     | 
    
         
            +
                )
         
     | 
| 
      
 82 
     | 
    
         
            +
              end
         
     | 
| 
      
 83 
     | 
    
         
            +
             
     | 
| 
      
 84 
     | 
    
         
            +
              def <<(trpl)
         
     | 
| 
      
 85 
     | 
    
         
            +
                @writer.write_statement(RDF::Statement(*trpl))
         
     | 
| 
      
 86 
     | 
    
         
            +
              end
         
     | 
| 
      
 87 
     | 
    
         
            +
             
     | 
| 
      
 88 
     | 
    
         
            +
              def done
         
     | 
| 
      
 89 
     | 
    
         
            +
                @writer.write_epilogue
         
     | 
| 
      
 90 
     | 
    
         
            +
              end
         
     | 
| 
      
 91 
     | 
    
         
            +
             
     | 
| 
      
 92 
     | 
    
         
            +
              private
         
     | 
| 
      
 93 
     | 
    
         
            +
             
     | 
| 
      
 94 
     | 
    
         
            +
              def find_writer(format)
         
     | 
| 
      
 95 
     | 
    
         
            +
                case format
         
     | 
| 
      
 96 
     | 
    
         
            +
                  when 'nquads'
         
     | 
| 
      
 97 
     | 
    
         
            +
                    BEL::RDF::RDF::NQuads::Writer
         
     | 
| 
      
 98 
     | 
    
         
            +
                  when 'turtle'
         
     | 
| 
      
 99 
     | 
    
         
            +
                    begin
         
     | 
| 
      
 100 
     | 
    
         
            +
                      require 'rdf/turtle'
         
     | 
| 
      
 101 
     | 
    
         
            +
                      BEL::RDF::RDF::Turtle::Writer
         
     | 
| 
      
 102 
     | 
    
         
            +
                    rescue LoadError
         
     | 
| 
      
 103 
     | 
    
         
            +
                      $stderr.puts """Turtle format not supported.
         
     | 
| 
      
 104 
     | 
    
         
            +
            Install the 'rdf-turtle' gem."""
         
     | 
| 
      
 105 
     | 
    
         
            +
                      raise
         
     | 
| 
      
 106 
     | 
    
         
            +
                    end
         
     | 
| 
      
 107 
     | 
    
         
            +
                  when 'ntriples'
         
     | 
| 
      
 108 
     | 
    
         
            +
                    BEL::RDF::RDF::NTriples::Writer
         
     | 
| 
      
 109 
     | 
    
         
            +
                end
         
     | 
| 
      
 110 
     | 
    
         
            +
              end
         
     | 
| 
      
 111 
     | 
    
         
            +
            end
         
     | 
| 
      
 112 
     | 
    
         
            +
             
     | 
| 
      
 113 
     | 
    
         
            +
            # create writer for format
         
     | 
| 
      
 114 
     | 
    
         
            +
            rdf_writer = ::Serializer.new(true, options[:format])
         
     | 
| 
      
 115 
     | 
    
         
            +
             
     | 
| 
      
 116 
     | 
    
         
            +
            # first write schema if desired
         
     | 
| 
      
 117 
     | 
    
         
            +
            if options[:schema]
         
     | 
| 
      
 118 
     | 
    
         
            +
              BEL::RDF::vocabulary_rdf.each do |trpl|
         
     | 
| 
      
 119 
     | 
    
         
            +
                rdf_writer << trpl
         
     | 
| 
      
 120 
     | 
    
         
            +
              end
         
     | 
| 
      
 121 
     | 
    
         
            +
            end
         
     | 
| 
      
 122 
     | 
    
         
            +
             
     | 
| 
      
 123 
     | 
    
         
            +
            # read bel content
         
     | 
| 
      
 124 
     | 
    
         
            +
            content =
         
     | 
| 
      
 125 
     | 
    
         
            +
              if options[:bel]
         
     | 
| 
      
 126 
     | 
    
         
            +
                File.open(options[:bel]).read
         
     | 
| 
      
 127 
     | 
    
         
            +
              else
         
     | 
| 
      
 128 
     | 
    
         
            +
                $stdin.read
         
     | 
| 
      
 129 
     | 
    
         
            +
              end
         
     | 
| 
      
 130 
     | 
    
         
            +
             
     | 
| 
      
 131 
     | 
    
         
            +
            # parse and write rdf
         
     | 
| 
      
 132 
     | 
    
         
            +
            Main.new(content, rdf_writer)
         
     | 
| 
      
 133 
     | 
    
         
            +
            # vim: ts=2 sw=2:
         
     | 
| 
      
 134 
     | 
    
         
            +
            # encoding: utf-8
         
     | 
    
        data/bin/bel_compare
    ADDED
    
    | 
         @@ -0,0 +1,177 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            #!/usr/bin/env ruby
         
     | 
| 
      
 2 
     | 
    
         
            +
            # vim: ts=2 sw=2
         
     | 
| 
      
 3 
     | 
    
         
            +
             
     | 
| 
      
 4 
     | 
    
         
            +
            require 'optparse'
         
     | 
| 
      
 5 
     | 
    
         
            +
            require 'bel'
         
     | 
| 
      
 6 
     | 
    
         
            +
            include BEL::Language
         
     | 
| 
      
 7 
     | 
    
         
            +
            include BEL::Namespace
         
     | 
| 
      
 8 
     | 
    
         
            +
             
     | 
| 
      
 9 
     | 
    
         
            +
            USAGE = "Usage: #{File.basename(__FILE__)} [options] [file] [file]"
         
     | 
| 
      
 10 
     | 
    
         
            +
             
     | 
| 
      
 11 
     | 
    
         
            +
            options = {}
         
     | 
| 
      
 12 
     | 
    
         
            +
            OptionParser.new do |opts|
         
     | 
| 
      
 13 
     | 
    
         
            +
              opts.banner = USAGE
         
     | 
| 
      
 14 
     | 
    
         
            +
             
     | 
| 
      
 15 
     | 
    
         
            +
              opts.on("-v", "--[no-]verbose", "Run verbosely") do |v|
         
     | 
| 
      
 16 
     | 
    
         
            +
                options[:verbose] = v
         
     | 
| 
      
 17 
     | 
    
         
            +
              end
         
     | 
| 
      
 18 
     | 
    
         
            +
              opts.on_tail("-h", "--help", "Show usage and options") do
         
     | 
| 
      
 19 
     | 
    
         
            +
                puts opts
         
     | 
| 
      
 20 
     | 
    
         
            +
                exit
         
     | 
| 
      
 21 
     | 
    
         
            +
              end
         
     | 
| 
      
 22 
     | 
    
         
            +
            end.parse!
         
     | 
| 
      
 23 
     | 
    
         
            +
             
     | 
| 
      
 24 
     | 
    
         
            +
            if ARGV.length != 2
         
     | 
| 
      
 25 
     | 
    
         
            +
              $stderr.puts "Need to specify two BEL files."
         
     | 
| 
      
 26 
     | 
    
         
            +
              $stderr.puts USAGE
         
     | 
| 
      
 27 
     | 
    
         
            +
              exit 1
         
     | 
| 
      
 28 
     | 
    
         
            +
            end
         
     | 
| 
      
 29 
     | 
    
         
            +
             
     | 
| 
      
 30 
     | 
    
         
            +
            def fetch_groups(bel)
         
     | 
| 
      
 31 
     | 
    
         
            +
              groups = {}
         
     | 
| 
      
 32 
     | 
    
         
            +
              active_group = nil
         
     | 
| 
      
 33 
     | 
    
         
            +
              BEL::Script.parse(bel) do |obj|
         
     | 
| 
      
 34 
     | 
    
         
            +
                if obj.is_a? BEL::Language::StatementGroup
         
     | 
| 
      
 35 
     | 
    
         
            +
                  active_group = obj
         
     | 
| 
      
 36 
     | 
    
         
            +
                end
         
     | 
| 
      
 37 
     | 
    
         
            +
                if obj.is_a? BEL::Language::UnsetStatementGroup
         
     | 
| 
      
 38 
     | 
    
         
            +
                  groups[obj.name] = active_group
         
     | 
| 
      
 39 
     | 
    
         
            +
                end
         
     | 
| 
      
 40 
     | 
    
         
            +
              end
         
     | 
| 
      
 41 
     | 
    
         
            +
              groups
         
     | 
| 
      
 42 
     | 
    
         
            +
            end
         
     | 
| 
      
 43 
     | 
    
         
            +
             
     | 
| 
      
 44 
     | 
    
         
            +
            threads = []
         
     | 
| 
      
 45 
     | 
    
         
            +
            first_groups = {}
         
     | 
| 
      
 46 
     | 
    
         
            +
            second_groups = {}
         
     | 
| 
      
 47 
     | 
    
         
            +
            threads << Thread.new {
         
     | 
| 
      
 48 
     | 
    
         
            +
              first_groups.update(fetch_groups(File.read(ARGV[0])))
         
     | 
| 
      
 49 
     | 
    
         
            +
            }
         
     | 
| 
      
 50 
     | 
    
         
            +
             
     | 
| 
      
 51 
     | 
    
         
            +
            threads << Thread.new {
         
     | 
| 
      
 52 
     | 
    
         
            +
              second_groups.update(fetch_groups(File.read(ARGV[1])))
         
     | 
| 
      
 53 
     | 
    
         
            +
            }
         
     | 
| 
      
 54 
     | 
    
         
            +
             
     | 
| 
      
 55 
     | 
    
         
            +
            threads.each { |t| t.join }
         
     | 
| 
      
 56 
     | 
    
         
            +
             
     | 
| 
      
 57 
     | 
    
         
            +
            group_diff = second_groups.length - first_groups.length
         
     | 
| 
      
 58 
     | 
    
         
            +
            if group_diff == 0
         
     | 
| 
      
 59 
     | 
    
         
            +
              puts "Equal number of statement groups."
         
     | 
| 
      
 60 
     | 
    
         
            +
            elsif group_diff > 0
         
     | 
| 
      
 61 
     | 
    
         
            +
              puts "Second file has #{group_diff} more statement groups."
         
     | 
| 
      
 62 
     | 
    
         
            +
            else
         
     | 
| 
      
 63 
     | 
    
         
            +
              puts "Second file has #{group_diff.abs} less statement groups."
         
     | 
| 
      
 64 
     | 
    
         
            +
            end
         
     | 
| 
      
 65 
     | 
    
         
            +
             
     | 
| 
      
 66 
     | 
    
         
            +
            first_statements = first_groups.values.
         
     | 
| 
      
 67 
     | 
    
         
            +
              map {|group| group.statements.map {|s| s.to_bel} }.flatten
         
     | 
| 
      
 68 
     | 
    
         
            +
            puts "First file has #{first_statements.length} statements."
         
     | 
| 
      
 69 
     | 
    
         
            +
            second_statements = second_groups.values.
         
     | 
| 
      
 70 
     | 
    
         
            +
              map {|group| group.statements.map {|s| s.to_bel}}.flatten
         
     | 
| 
      
 71 
     | 
    
         
            +
            puts "Second file has #{second_statements.length} statements."
         
     | 
| 
      
 72 
     | 
    
         
            +
             
     | 
| 
      
 73 
     | 
    
         
            +
            # statement groups in 1st, but not 2nd
         
     | 
| 
      
 74 
     | 
    
         
            +
            first_groups.each do |name,first|
         
     | 
| 
      
 75 
     | 
    
         
            +
              second = second_groups[name]
         
     | 
| 
      
 76 
     | 
    
         
            +
              if not second
         
     | 
| 
      
 77 
     | 
    
         
            +
                puts "#{name}, in 1st but not 2nd."
         
     | 
| 
      
 78 
     | 
    
         
            +
              end
         
     | 
| 
      
 79 
     | 
    
         
            +
            end
         
     | 
| 
      
 80 
     | 
    
         
            +
             
     | 
| 
      
 81 
     | 
    
         
            +
            # statement groups in 2nd, but not 1st
         
     | 
| 
      
 82 
     | 
    
         
            +
            second_groups.each do |name,second|
         
     | 
| 
      
 83 
     | 
    
         
            +
              first = first_groups[name]
         
     | 
| 
      
 84 
     | 
    
         
            +
              if not first
         
     | 
| 
      
 85 
     | 
    
         
            +
                puts "#{name}, in 2nd but not 1st."
         
     | 
| 
      
 86 
     | 
    
         
            +
              end
         
     | 
| 
      
 87 
     | 
    
         
            +
            end
         
     | 
| 
      
 88 
     | 
    
         
            +
             
     | 
| 
      
 89 
     | 
    
         
            +
            # differences between statement group intersection
         
     | 
| 
      
 90 
     | 
    
         
            +
            first_groups.each do |name,first|
         
     | 
| 
      
 91 
     | 
    
         
            +
              second = second_groups[name]
         
     | 
| 
      
 92 
     | 
    
         
            +
              if second
         
     | 
| 
      
 93 
     | 
    
         
            +
                first_stmt = first.statements ? first.statements.map {|s| s.to_bel } : []
         
     | 
| 
      
 94 
     | 
    
         
            +
                second_stmt = second.statements ? second.statements.map {|s| s.to_bel } : []
         
     | 
| 
      
 95 
     | 
    
         
            +
                if first_stmt == second_stmt
         
     | 
| 
      
 96 
     | 
    
         
            +
                  if options[:verbose]
         
     | 
| 
      
 97 
     | 
    
         
            +
                    puts "#{name}, both contain zero statements" if first_stmt.empty?
         
     | 
| 
      
 98 
     | 
    
         
            +
                    puts "#{name}, both contain #{first_stmt.length} statements"
         
     | 
| 
      
 99 
     | 
    
         
            +
                  end
         
     | 
| 
      
 100 
     | 
    
         
            +
                else
         
     | 
| 
      
 101 
     | 
    
         
            +
                  puts "#{name}:"
         
     | 
| 
      
 102 
     | 
    
         
            +
                  if options[:verbose]
         
     | 
| 
      
 103 
     | 
    
         
            +
                    puts "  1st contains #{first_stmt.length} statements"
         
     | 
| 
      
 104 
     | 
    
         
            +
                    puts "  2nd contains #{second_stmt.length} statements"
         
     | 
| 
      
 105 
     | 
    
         
            +
                    puts "  common to both, #{(first_stmt & second_stmt).length}"
         
     | 
| 
      
 106 
     | 
    
         
            +
                    puts (first_stmt & second_stmt).map {|stmt| stmt.to_s}.join("\n    ").prepend("    ")
         
     | 
| 
      
 107 
     | 
    
         
            +
                  end
         
     | 
| 
      
 108 
     | 
    
         
            +
             
     | 
| 
      
 109 
     | 
    
         
            +
                  ab = first_stmt - second_stmt
         
     | 
| 
      
 110 
     | 
    
         
            +
                  puts "  statements only in 1st, #{ab.length} (1st - 2nd)"
         
     | 
| 
      
 111 
     | 
    
         
            +
                  if ab.length > 0
         
     | 
| 
      
 112 
     | 
    
         
            +
                    puts ab.map {|stmt| stmt.to_s}.join("\n    ").prepend("    ")
         
     | 
| 
      
 113 
     | 
    
         
            +
                  end
         
     | 
| 
      
 114 
     | 
    
         
            +
             
     | 
| 
      
 115 
     | 
    
         
            +
                  ba = second_stmt - first_stmt
         
     | 
| 
      
 116 
     | 
    
         
            +
                  puts "  statements only in 2nd, #{ba.length} (2nd - 1st)"
         
     | 
| 
      
 117 
     | 
    
         
            +
                  if ba.length > 0
         
     | 
| 
      
 118 
     | 
    
         
            +
                    puts ba.map {|stmt| stmt.to_s}.join("\n    ").prepend("    ")
         
     | 
| 
      
 119 
     | 
    
         
            +
                  end
         
     | 
| 
      
 120 
     | 
    
         
            +
                end
         
     | 
| 
      
 121 
     | 
    
         
            +
              end
         
     | 
| 
      
 122 
     | 
    
         
            +
            end
         
     | 
| 
      
 123 
     | 
    
         
            +
             
     | 
| 
      
 124 
     | 
    
         
            +
            first_terms = first_groups.values.
         
     | 
| 
      
 125 
     | 
    
         
            +
              map { |group| group.statements }.flatten.
         
     | 
| 
      
 126 
     | 
    
         
            +
              map { |stmt|
         
     | 
| 
      
 127 
     | 
    
         
            +
                l = [stmt.subject.to_bel]
         
     | 
| 
      
 128 
     | 
    
         
            +
                if stmt.simple?
         
     | 
| 
      
 129 
     | 
    
         
            +
                  l << stmt.object.to_bel
         
     | 
| 
      
 130 
     | 
    
         
            +
                elsif stmt.nested?
         
     | 
| 
      
 131 
     | 
    
         
            +
                  l << stmt.object.subject.to_bel
         
     | 
| 
      
 132 
     | 
    
         
            +
                  l << stmt.object.object.to_bel
         
     | 
| 
      
 133 
     | 
    
         
            +
                end
         
     | 
| 
      
 134 
     | 
    
         
            +
                l
         
     | 
| 
      
 135 
     | 
    
         
            +
              }.flatten.uniq.
         
     | 
| 
      
 136 
     | 
    
         
            +
              sort {|term1,term2| term1.to_s <=> term2.to_s}
         
     | 
| 
      
 137 
     | 
    
         
            +
            second_terms = second_groups.values.
         
     | 
| 
      
 138 
     | 
    
         
            +
              map { |group| group.statements }.flatten.
         
     | 
| 
      
 139 
     | 
    
         
            +
              map { |stmt|
         
     | 
| 
      
 140 
     | 
    
         
            +
                l = [stmt.subject.to_bel]
         
     | 
| 
      
 141 
     | 
    
         
            +
                if stmt.simple?
         
     | 
| 
      
 142 
     | 
    
         
            +
                  l << stmt.object.to_bel
         
     | 
| 
      
 143 
     | 
    
         
            +
                elsif stmt.nested?
         
     | 
| 
      
 144 
     | 
    
         
            +
                  l << stmt.object.subject.to_bel
         
     | 
| 
      
 145 
     | 
    
         
            +
                  l << stmt.object.object.to_bel
         
     | 
| 
      
 146 
     | 
    
         
            +
                end
         
     | 
| 
      
 147 
     | 
    
         
            +
                l
         
     | 
| 
      
 148 
     | 
    
         
            +
              }.flatten.uniq.
         
     | 
| 
      
 149 
     | 
    
         
            +
              sort {|term1,term2| term1.to_s <=> term2.to_s}
         
     | 
| 
      
 150 
     | 
    
         
            +
             
     | 
| 
      
 151 
     | 
    
         
            +
            # statements
         
     | 
| 
      
 152 
     | 
    
         
            +
            puts "Statements:"
         
     | 
| 
      
 153 
     | 
    
         
            +
            ab = first_statements - second_statements
         
     | 
| 
      
 154 
     | 
    
         
            +
            puts "  only in 1st, #{ab.length} (1st - 2nd)"
         
     | 
| 
      
 155 
     | 
    
         
            +
            if ab.length > 0
         
     | 
| 
      
 156 
     | 
    
         
            +
              puts ab.map {|t| t.to_s}.join("\n    ").prepend("    ")
         
     | 
| 
      
 157 
     | 
    
         
            +
            end
         
     | 
| 
      
 158 
     | 
    
         
            +
             
     | 
| 
      
 159 
     | 
    
         
            +
            ba = second_statements - first_statements
         
     | 
| 
      
 160 
     | 
    
         
            +
            puts "  only in 2nd, #{ba.length} (2nd - 1st)"
         
     | 
| 
      
 161 
     | 
    
         
            +
            if ba.length > 0
         
     | 
| 
      
 162 
     | 
    
         
            +
              puts ba.map {|t| t.to_s}.join("\n    ").prepend("    ")
         
     | 
| 
      
 163 
     | 
    
         
            +
            end
         
     | 
| 
      
 164 
     | 
    
         
            +
             
     | 
| 
      
 165 
     | 
    
         
            +
            # terms
         
     | 
| 
      
 166 
     | 
    
         
            +
            puts "Terms:"
         
     | 
| 
      
 167 
     | 
    
         
            +
            ab = first_terms - second_terms
         
     | 
| 
      
 168 
     | 
    
         
            +
            puts "  only in 1st, #{ab.length} (1st - 2nd)"
         
     | 
| 
      
 169 
     | 
    
         
            +
            if ab.length > 0
         
     | 
| 
      
 170 
     | 
    
         
            +
              puts ab.map {|t| t.to_s}.join("\n    ").prepend("    ")
         
     | 
| 
      
 171 
     | 
    
         
            +
            end
         
     | 
| 
      
 172 
     | 
    
         
            +
             
     | 
| 
      
 173 
     | 
    
         
            +
            ba = second_terms - first_terms
         
     | 
| 
      
 174 
     | 
    
         
            +
            puts "  only in 2nd, #{ba.length} (2nd - 1st)"
         
     | 
| 
      
 175 
     | 
    
         
            +
            if ba.length > 0
         
     | 
| 
      
 176 
     | 
    
         
            +
              puts ba.map {|t| t.to_s}.join("\n    ").prepend("    ")
         
     | 
| 
      
 177 
     | 
    
         
            +
            end
         
     | 
    
        data/bin/bel_parse
    ADDED
    
    | 
         @@ -0,0 +1,60 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            #!/usr/bin/env ruby
         
     | 
| 
      
 2 
     | 
    
         
            +
            # bel_parse: Show parsed objects from BEL content for debugging purposes.
         
     | 
| 
      
 3 
     | 
    
         
            +
            #
         
     | 
| 
      
 4 
     | 
    
         
            +
            # From BEL file
         
     | 
| 
      
 5 
     | 
    
         
            +
            # usage: bel_parse -b file.bel
         
     | 
| 
      
 6 
     | 
    
         
            +
            #
         
     | 
| 
      
 7 
     | 
    
         
            +
            # From standard in
         
     | 
| 
      
 8 
     | 
    
         
            +
            # usage: echo "<BEL DOCUMENT STRING>" | bel_parse
         
     | 
| 
      
 9 
     | 
    
         
            +
             
     | 
| 
      
 10 
     | 
    
         
            +
            require 'bel'
         
     | 
| 
      
 11 
     | 
    
         
            +
            require 'optparse'
         
     | 
| 
      
 12 
     | 
    
         
            +
             
     | 
| 
      
 13 
     | 
    
         
            +
            # additive String helpers
         
     | 
| 
      
 14 
     | 
    
         
            +
            class String
         
     | 
| 
      
 15 
     | 
    
         
            +
              def rjust_relative(distance, string)
         
     | 
| 
      
 16 
     | 
    
         
            +
                rjust(distance - string.size + size)
         
     | 
| 
      
 17 
     | 
    
         
            +
              end
         
     | 
| 
      
 18 
     | 
    
         
            +
            end
         
     | 
| 
      
 19 
     | 
    
         
            +
             
     | 
| 
      
 20 
     | 
    
         
            +
            # setup and parse options
         
     | 
| 
      
 21 
     | 
    
         
            +
            options = {}
         
     | 
| 
      
 22 
     | 
    
         
            +
            OptionParser.new do |opts|
         
     | 
| 
      
 23 
     | 
    
         
            +
              opts.banner = "Usage: bel_parse [options] [.bel file]"
         
     | 
| 
      
 24 
     | 
    
         
            +
              opts.on('-b', '--bel FILE', 'BEL file to parse.  STDIN (standard in) can also be used for BEL content.') do |bel|
         
     | 
| 
      
 25 
     | 
    
         
            +
                options[:bel] = bel
         
     | 
| 
      
 26 
     | 
    
         
            +
              end
         
     | 
| 
      
 27 
     | 
    
         
            +
            end.parse!
         
     | 
| 
      
 28 
     | 
    
         
            +
             
     | 
| 
      
 29 
     | 
    
         
            +
            # option guards
         
     | 
| 
      
 30 
     | 
    
         
            +
            unless options[:bel] or not STDIN.tty?
         
     | 
| 
      
 31 
     | 
    
         
            +
              $stderr.puts "No bel content provided.  Either use --bel option or STDIN (standard in).  Use -h / --help for details." 
         
     | 
| 
      
 32 
     | 
    
         
            +
              exit 1
         
     | 
| 
      
 33 
     | 
    
         
            +
            end
         
     | 
| 
      
 34 
     | 
    
         
            +
             
     | 
| 
      
 35 
     | 
    
         
            +
            if options[:bel] and not File.exists? options[:bel]
         
     | 
| 
      
 36 
     | 
    
         
            +
              $stderr.puts "No file for bel, #{options[:bel]}"
         
     | 
| 
      
 37 
     | 
    
         
            +
              exit 1
         
     | 
| 
      
 38 
     | 
    
         
            +
            end
         
     | 
| 
      
 39 
     | 
    
         
            +
             
     | 
| 
      
 40 
     | 
    
         
            +
            # read bel content
         
     | 
| 
      
 41 
     | 
    
         
            +
            content =
         
     | 
| 
      
 42 
     | 
    
         
            +
            if options[:bel]
         
     | 
| 
      
 43 
     | 
    
         
            +
              File.open(options[:bel]).read
         
     | 
| 
      
 44 
     | 
    
         
            +
            else
         
     | 
| 
      
 45 
     | 
    
         
            +
              $stdin.read
         
     | 
| 
      
 46 
     | 
    
         
            +
            end
         
     | 
| 
      
 47 
     | 
    
         
            +
             
     | 
| 
      
 48 
     | 
    
         
            +
            class Main
         
     | 
| 
      
 49 
     | 
    
         
            +
             
     | 
| 
      
 50 
     | 
    
         
            +
              def initialize(content)
         
     | 
| 
      
 51 
     | 
    
         
            +
                BEL::Script.parse(content) do |obj|
         
     | 
| 
      
 52 
     | 
    
         
            +
                  object_desc = obj.class.name.split('::').last
         
     | 
| 
      
 53 
     | 
    
         
            +
                  object_desc << obj.to_bel.rjust_relative(25, object_desc)
         
     | 
| 
      
 54 
     | 
    
         
            +
                  puts object_desc
         
     | 
| 
      
 55 
     | 
    
         
            +
                end
         
     | 
| 
      
 56 
     | 
    
         
            +
              end
         
     | 
| 
      
 57 
     | 
    
         
            +
            end
         
     | 
| 
      
 58 
     | 
    
         
            +
            Main.new(content)
         
     | 
| 
      
 59 
     | 
    
         
            +
            # vim: ts=2 sw=2:
         
     | 
| 
      
 60 
     | 
    
         
            +
            # encoding: utf-8
         
     | 
    
        data/bin/bel_rdfschema
    ADDED
    
    | 
         @@ -0,0 +1,72 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            #!/usr/bin/env ruby
         
     | 
| 
      
 2 
     | 
    
         
            +
            # bel_rdfschema: Dump RDF schema for BEL.
         
     | 
| 
      
 3 
     | 
    
         
            +
            # usage: bel_rdfschema --format [ntriples | nquads | turtle]
         
     | 
| 
      
 4 
     | 
    
         
            +
             
     | 
| 
      
 5 
     | 
    
         
            +
            require 'bel'
         
     | 
| 
      
 6 
     | 
    
         
            +
            require 'optparse'
         
     | 
| 
      
 7 
     | 
    
         
            +
            require 'set'
         
     | 
| 
      
 8 
     | 
    
         
            +
            require 'open-uri'
         
     | 
| 
      
 9 
     | 
    
         
            +
             
     | 
| 
      
 10 
     | 
    
         
            +
            options = {
         
     | 
| 
      
 11 
     | 
    
         
            +
              format: 'ntriples'
         
     | 
| 
      
 12 
     | 
    
         
            +
            }
         
     | 
| 
      
 13 
     | 
    
         
            +
            OptionParser.new do |opts|
         
     | 
| 
      
 14 
     | 
    
         
            +
              opts.banner = '''Dumps RDF schema for BEL.
         
     | 
| 
      
 15 
     | 
    
         
            +
            Usage: bel_rdfschema'''
         
     | 
| 
      
 16 
     | 
    
         
            +
             
     | 
| 
      
 17 
     | 
    
         
            +
              opts.on('-f', '--format FORMAT', 'RDF file format.') do |format|
         
     | 
| 
      
 18 
     | 
    
         
            +
                options[:format] = format.downcase
         
     | 
| 
      
 19 
     | 
    
         
            +
              end
         
     | 
| 
      
 20 
     | 
    
         
            +
            end.parse!
         
     | 
| 
      
 21 
     | 
    
         
            +
             
     | 
| 
      
 22 
     | 
    
         
            +
            unless ['ntriples', 'nquads', 'turtle'].include? options[:format]
         
     | 
| 
      
 23 
     | 
    
         
            +
              $stderr.puts "Format was not one of: ntriples, nquads, or turtle"
         
     | 
| 
      
 24 
     | 
    
         
            +
              exit 1
         
     | 
| 
      
 25 
     | 
    
         
            +
            end
         
     | 
| 
      
 26 
     | 
    
         
            +
             
     | 
| 
      
 27 
     | 
    
         
            +
            class Serializer
         
     | 
| 
      
 28 
     | 
    
         
            +
              attr_reader :writer
         
     | 
| 
      
 29 
     | 
    
         
            +
             
     | 
| 
      
 30 
     | 
    
         
            +
              def initialize(stream, format)
         
     | 
| 
      
 31 
     | 
    
         
            +
                rdf_writer = find_writer(format)
         
     | 
| 
      
 32 
     | 
    
         
            +
                @writer = rdf_writer.new($stdout, {
         
     | 
| 
      
 33 
     | 
    
         
            +
                    :stream => stream
         
     | 
| 
      
 34 
     | 
    
         
            +
                  }
         
     | 
| 
      
 35 
     | 
    
         
            +
                )
         
     | 
| 
      
 36 
     | 
    
         
            +
              end
         
     | 
| 
      
 37 
     | 
    
         
            +
             
     | 
| 
      
 38 
     | 
    
         
            +
              def <<(trpl)
         
     | 
| 
      
 39 
     | 
    
         
            +
                @writer.write_statement(RDF::Statement(*trpl))
         
     | 
| 
      
 40 
     | 
    
         
            +
              end
         
     | 
| 
      
 41 
     | 
    
         
            +
             
     | 
| 
      
 42 
     | 
    
         
            +
              def done
         
     | 
| 
      
 43 
     | 
    
         
            +
                @writer.write_epilogue
         
     | 
| 
      
 44 
     | 
    
         
            +
              end
         
     | 
| 
      
 45 
     | 
    
         
            +
             
     | 
| 
      
 46 
     | 
    
         
            +
              private
         
     | 
| 
      
 47 
     | 
    
         
            +
             
     | 
| 
      
 48 
     | 
    
         
            +
              def find_writer(format)
         
     | 
| 
      
 49 
     | 
    
         
            +
                case format
         
     | 
| 
      
 50 
     | 
    
         
            +
                  when 'nquads'
         
     | 
| 
      
 51 
     | 
    
         
            +
                    BEL::RDF::RDF::NQuads::Writer
         
     | 
| 
      
 52 
     | 
    
         
            +
                  when 'turtle'
         
     | 
| 
      
 53 
     | 
    
         
            +
                    begin
         
     | 
| 
      
 54 
     | 
    
         
            +
                      require 'rdf/turtle'
         
     | 
| 
      
 55 
     | 
    
         
            +
                      BEL::RDF::RDF::Turtle::Writer
         
     | 
| 
      
 56 
     | 
    
         
            +
                    rescue LoadError
         
     | 
| 
      
 57 
     | 
    
         
            +
                      $stderr.puts """Turtle format not supported.
         
     | 
| 
      
 58 
     | 
    
         
            +
            Install the 'rdf-turtle' gem."""
         
     | 
| 
      
 59 
     | 
    
         
            +
                      raise
         
     | 
| 
      
 60 
     | 
    
         
            +
                    end
         
     | 
| 
      
 61 
     | 
    
         
            +
                  when 'ntriples'
         
     | 
| 
      
 62 
     | 
    
         
            +
                    BEL::RDF::RDF::NTriples::Writer
         
     | 
| 
      
 63 
     | 
    
         
            +
                end
         
     | 
| 
      
 64 
     | 
    
         
            +
              end
         
     | 
| 
      
 65 
     | 
    
         
            +
            end
         
     | 
| 
      
 66 
     | 
    
         
            +
             
     | 
| 
      
 67 
     | 
    
         
            +
            @rdf_writer = ::Serializer.new(true, options[:format])
         
     | 
| 
      
 68 
     | 
    
         
            +
            BEL::RDF::vocabulary_rdf.each do |trpl|
         
     | 
| 
      
 69 
     | 
    
         
            +
              @rdf_writer << trpl
         
     | 
| 
      
 70 
     | 
    
         
            +
            end
         
     | 
| 
      
 71 
     | 
    
         
            +
            # vim: ts=2 sw=2:
         
     | 
| 
      
 72 
     | 
    
         
            +
            # encoding: utf-8
         
     |