bel 0.2.1 → 0.3.0.beta1

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/lib/features.rb ADDED
@@ -0,0 +1,21 @@
1
+ # vim: ts=2 sw=2:
2
+ module BEL
3
+ module Features
4
+
5
+ # check for rdf support
6
+ begin
7
+ require 'rdf'
8
+ require 'addressable/uri'
9
+ require 'uuid'
10
+ @@rdf_support = true
11
+ rescue LoadError => e
12
+ # exceptional condition; missing non-optional or downstream deps
13
+ @@rdf_support = false
14
+ raise unless e.message =~ /rdf/ or e.message =~ /addressable/
15
+ end
16
+
17
+ def self.rdf_support?
18
+ @@rdf_support
19
+ end
20
+ end
21
+ end
data/lib/libbel.rb ADDED
@@ -0,0 +1,201 @@
1
+ module LibBEL
2
+
3
+ class << self
4
+
5
+ def rubinius?
6
+ defined?(RUBY_ENGINE) && ("rbx" == RUBY_ENGINE)
7
+ end
8
+
9
+ # @api_private
10
+ # Determine FFI constant for this ruby engine.
11
+ def find_ffi
12
+ if rubinius?
13
+ # Use ffi gem instead of rubinius-bundled FFI
14
+ # Rubinius 2.5.2 does not seem to support FFI::ManagedStruct
15
+ require "ffi"
16
+ ::FFI
17
+ else # mri, jruby, etc
18
+ require "ffi"
19
+ ::FFI
20
+ end
21
+ end
22
+
23
+ # @api_private
24
+ # Extend with the correct ffi implementation.
25
+ def load_ffi
26
+ ffi_module = LibBEL::find_ffi
27
+ extend ffi_module::Library
28
+ ffi_module
29
+ end
30
+
31
+ # @api_private
32
+ # Loads the libkyotocabinet shared library.
33
+ def load_libBEL
34
+ ffi_module = find_ffi
35
+ extend ffi_module::Library
36
+
37
+ # libbel.so: Linux and MinGW
38
+ # libbel.bundle: Mac OSX
39
+ messages = []
40
+ library_loaded = ['libbel.so', 'libbel.bundle'].map { |library_file|
41
+ File.join(
42
+ File.expand_path(File.dirname(__FILE__)),
43
+ library_file
44
+ )
45
+ }.any? do |library_path|
46
+ begin
47
+ ffi_lib library_path
48
+ true
49
+ rescue LoadError => exception
50
+ messages << exception.to_s
51
+ false
52
+ end
53
+ end
54
+
55
+ if !library_loaded
56
+ msg = messages.map { |msg| " #{msg}" }.join("\n")
57
+ fail LoadError.new("Failed to load libbel library. Details:\n#{msg}")
58
+ end
59
+ end
60
+ end
61
+
62
+ # Constant holding the FFI module for this ruby engine.
63
+ FFI = LibBEL::load_ffi
64
+ LibBEL::load_libBEL
65
+
66
+ # typedef enum bel_token_type
67
+ enum :bel_token_type, [
68
+ :IDENT, 0,
69
+ :STRING,
70
+ :O_PAREN,
71
+ :C_PAREN,
72
+ :COLON,
73
+ :COMMA,
74
+ :SPACES
75
+ ]
76
+
77
+ class BelToken < FFI::Struct
78
+
79
+ layout :type, :bel_token_type,
80
+ :pos_start, :int,
81
+ :pos_end, :int,
82
+ :value, :pointer
83
+
84
+ def type
85
+ self[:type]
86
+ end
87
+
88
+ def pos_start
89
+ self[:pos_start]
90
+ end
91
+
92
+ def pos_end
93
+ self[:pos_end]
94
+ end
95
+
96
+ def value
97
+ self[:value].read_string
98
+ end
99
+
100
+ def hash
101
+ [self.type, self.value, self.pos_start, self.pos_end].hash
102
+ end
103
+
104
+ def ==(other)
105
+ return false if other == nil
106
+ self.type == other.type && self.value == other.value &&
107
+ self.pos_start == other.pos_start && self.pos_end == other.pos_end
108
+ end
109
+
110
+ alias_method :eql?, :'=='
111
+ end
112
+
113
+ class BelTokenList < FFI::ManagedStruct
114
+ include Enumerable
115
+
116
+ layout :length, :int,
117
+ :tokens, BelToken.ptr
118
+
119
+ def each
120
+ if block_given?
121
+ iterator = LibBEL::bel_new_token_iterator(self.pointer)
122
+ while LibBEL::bel_token_iterator_end(iterator).zero?
123
+ current_token = LibBEL::bel_token_iterator_get(iterator)
124
+ yield LibBEL::BelToken.new(current_token)
125
+ LibBEL::bel_token_iterator_next(iterator)
126
+ end
127
+ LibBEL::free_bel_token_iterator(iterator)
128
+ else
129
+ enum_for(:each)
130
+ end
131
+ end
132
+
133
+ def token_at(position)
134
+ self.each_with_index { |tk, index|
135
+ if (tk.pos_start..tk.pos_end).include? position
136
+ return [tk, index]
137
+ end
138
+ }
139
+ nil
140
+ end
141
+
142
+ def self.release(ptr)
143
+ LibBEL::free_bel_token_list(ptr)
144
+ end
145
+ end
146
+
147
+ class BelTokenIterator < FFI::ManagedStruct
148
+ include Enumerable
149
+
150
+ layout :index, :int,
151
+ :list, :pointer,
152
+ :current_token, :pointer
153
+
154
+ def each
155
+ if self.null? or not LibBEL::bel_token_iterator_end(self).zero?
156
+ fail StopIteration, "bel_token_iterator reached end"
157
+ end
158
+
159
+ if block_given?
160
+ while LibBEL::bel_token_iterator_end(self.pointer).zero?
161
+ current_token = LibBEL::bel_token_iterator_get(self.pointer)
162
+ yield LibBEL::BelToken.new(current_token)
163
+ LibBEL::bel_token_iterator_next(self.pointer)
164
+ end
165
+ else
166
+ enum_for(:each)
167
+ end
168
+ end
169
+
170
+ def self.release(ptr)
171
+ LibBEL::free_bel_token_iterator(ptr)
172
+ end
173
+ end
174
+
175
+ attach_function :bel_new_token, [:bel_token_type, :pointer, :pointer, :pointer], :pointer
176
+ attach_function :bel_new_token_list, [:int ], :pointer
177
+ attach_function :bel_new_token_iterator, [:pointer ], :pointer
178
+ attach_function :bel_token_iterator_get, [:pointer ], :pointer
179
+ attach_function :bel_token_iterator_next, [:pointer ], :void
180
+ attach_function :bel_token_iterator_end, [:pointer ], :int
181
+ attach_function :bel_parse_term, [:string ], :pointer
182
+ attach_function :bel_tokenize_term, [:string ], :pointer
183
+ attach_function :bel_print_token, [:pointer ], :void
184
+ attach_function :bel_print_token_list, [:pointer ], :void
185
+ attach_function :free_bel_token, [:pointer ], :void
186
+ attach_function :free_bel_token_list, [:pointer ], :void
187
+ attach_function :free_bel_token_iterator, [:pointer ], :void
188
+
189
+ def self.tokenize_term(string)
190
+ LibBEL::BelTokenList.new(self.bel_tokenize_term(string))
191
+ end
192
+
193
+ def self.print_token(token)
194
+ self.bel_print_token(token.pointer)
195
+ end
196
+
197
+ def self.print_token_list(list)
198
+ self.bel_print_token_list(list.pointer)
199
+ end
200
+ end
201
+
data/lib/util.rb ADDED
@@ -0,0 +1,125 @@
1
+ require 'digest'
2
+ require 'open-uri'
3
+ require 'pathname'
4
+ require 'tempfile'
5
+
6
+ module BEL
7
+
8
+ def self.read_all(reference)
9
+ if self.cached? reference
10
+ self.read_cached reference do |cf|
11
+ return cf.read
12
+ end
13
+ end
14
+
15
+ self.multi_open(reference) do |f|
16
+ content = f.read
17
+ self.write_cached reference, content
18
+ return content
19
+ end
20
+ end
21
+
22
+ def self.read_lines(reference)
23
+ if self.cached? reference
24
+ self.read_cached reference do |cf|
25
+ return cf.readlines
26
+ end
27
+ end
28
+
29
+ self.multi_open(reference) do |f|
30
+ content = f.read
31
+ self.write_cached reference, content
32
+ f.rewind
33
+ return f.readlines
34
+ end
35
+ end
36
+
37
+ private
38
+
39
+ def self.multi_open(reference)
40
+ if self.cached? reference
41
+ self.read_cached reference do |cf|
42
+ if block_given?
43
+ yield cf
44
+ else
45
+ return cf
46
+ end
47
+ end
48
+ return
49
+ end
50
+
51
+ if File.exists? reference
52
+ File.open(reference) do |f|
53
+ if block_given?
54
+ yield f
55
+ else
56
+ return f
57
+ end
58
+ end
59
+ elsif reference.start_with? 'file:'
60
+ File.open(URI(reference).path) do |f|
61
+ if block_given?
62
+ yield f
63
+ else
64
+ return f
65
+ end
66
+ end
67
+ else
68
+ open(reference) do |f|
69
+ if block_given?
70
+ yield f
71
+ else
72
+ return f
73
+ end
74
+ end
75
+ end
76
+ end
77
+
78
+ def self.cached?(identifier, options = {})
79
+ options = {
80
+ temp_dir: Dir::tmpdir
81
+ }.merge(options)
82
+ cached_name = cached_filename_for identifier
83
+ path = Pathname(options[:temp_dir]) + cached_name
84
+ File.exist? path
85
+ end
86
+
87
+ def self.read_cached(identifier, options = {})
88
+ options = {
89
+ temp_dir: Dir::tmpdir
90
+ }.merge(options)
91
+ cached_name = cached_filename_for identifier
92
+ path = Pathname(options[:temp_dir]) + cached_name
93
+ File.open(path, "r") do |f|
94
+ if block_given?
95
+ yield f
96
+ else
97
+ return f.read
98
+ end
99
+ end
100
+ path.to_s
101
+ end
102
+
103
+ def self.write_cached(identifier, data = '', options = {})
104
+ options = {
105
+ temp_dir: Dir::tmpdir
106
+ }.merge(options)
107
+ cached_name = cached_filename_for identifier
108
+ path = Pathname(options[:temp_dir]) + cached_name
109
+ File.open(path, "w") do |f|
110
+ if block_given?
111
+ yield f
112
+ else
113
+ f.write(data)
114
+ end
115
+ end
116
+ path.to_s
117
+ end
118
+
119
+ def self.cached_filename_for(identifier)
120
+ return nil unless identifier
121
+ "#{self.to_s}_#{Digest::SHA256.hexdigest identifier}"
122
+ end
123
+ end
124
+ # vim: ts=2 sw=2
125
+ # encoding: utf-8
metadata CHANGED
@@ -1,123 +1,270 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: bel
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.1
4
+ version: 0.3.0.beta1
5
+ prerelease: 6
5
6
  platform: ruby
6
7
  authors:
7
8
  - Anthony Bargnesi
9
+ - Natalie Catlett
10
+ - Nick Bargnesi
11
+ - William Hayes
8
12
  autorequire:
9
13
  bindir: bin
10
14
  cert_chain: []
11
- date: 2014-01-13 00:00:00.000000000 Z
15
+ date: 2015-03-14 00:00:00.000000000 Z
12
16
  dependencies:
17
+ - !ruby/object:Gem::Dependency
18
+ name: ffi
19
+ requirement: !ruby/object:Gem::Requirement
20
+ none: false
21
+ requirements:
22
+ - - ~>
23
+ - !ruby/object:Gem::Version
24
+ version: '1.9'
25
+ type: :runtime
26
+ prerelease: false
27
+ version_requirements: !ruby/object:Gem::Requirement
28
+ none: false
29
+ requirements:
30
+ - - ~>
31
+ - !ruby/object:Gem::Version
32
+ version: '1.9'
33
+ - !ruby/object:Gem::Dependency
34
+ name: uuid
35
+ requirement: !ruby/object:Gem::Requirement
36
+ none: false
37
+ requirements:
38
+ - - ~>
39
+ - !ruby/object:Gem::Version
40
+ version: '2.3'
41
+ type: :development
42
+ prerelease: false
43
+ version_requirements: !ruby/object:Gem::Requirement
44
+ none: false
45
+ requirements:
46
+ - - ~>
47
+ - !ruby/object:Gem::Version
48
+ version: '2.3'
49
+ - !ruby/object:Gem::Dependency
50
+ name: addressable
51
+ requirement: !ruby/object:Gem::Requirement
52
+ none: false
53
+ requirements:
54
+ - - ~>
55
+ - !ruby/object:Gem::Version
56
+ version: '2.3'
57
+ type: :development
58
+ prerelease: false
59
+ version_requirements: !ruby/object:Gem::Requirement
60
+ none: false
61
+ requirements:
62
+ - - ~>
63
+ - !ruby/object:Gem::Version
64
+ version: '2.3'
65
+ - !ruby/object:Gem::Dependency
66
+ name: rdf
67
+ requirement: !ruby/object:Gem::Requirement
68
+ none: false
69
+ requirements:
70
+ - - ~>
71
+ - !ruby/object:Gem::Version
72
+ version: '1.1'
73
+ type: :development
74
+ prerelease: false
75
+ version_requirements: !ruby/object:Gem::Requirement
76
+ none: false
77
+ requirements:
78
+ - - ~>
79
+ - !ruby/object:Gem::Version
80
+ version: '1.1'
81
+ - !ruby/object:Gem::Dependency
82
+ name: bundler
83
+ requirement: !ruby/object:Gem::Requirement
84
+ none: false
85
+ requirements:
86
+ - - ~>
87
+ - !ruby/object:Gem::Version
88
+ version: '1.7'
89
+ type: :development
90
+ prerelease: false
91
+ version_requirements: !ruby/object:Gem::Requirement
92
+ none: false
93
+ requirements:
94
+ - - ~>
95
+ - !ruby/object:Gem::Version
96
+ version: '1.7'
13
97
  - !ruby/object:Gem::Dependency
14
98
  name: rake
15
99
  requirement: !ruby/object:Gem::Requirement
100
+ none: false
16
101
  requirements:
17
- - - "~>"
102
+ - - ~>
18
103
  - !ruby/object:Gem::Version
19
- version: '10.1'
104
+ version: '10.4'
20
105
  type: :development
21
106
  prerelease: false
22
107
  version_requirements: !ruby/object:Gem::Requirement
108
+ none: false
23
109
  requirements:
24
- - - "~>"
110
+ - - ~>
25
111
  - !ruby/object:Gem::Version
26
- version: '10.1'
112
+ version: '10.4'
27
113
  - !ruby/object:Gem::Dependency
28
- name: rspec
114
+ name: rake-compiler
29
115
  requirement: !ruby/object:Gem::Requirement
116
+ none: false
30
117
  requirements:
31
- - - "~>"
118
+ - - ~>
32
119
  - !ruby/object:Gem::Version
33
- version: '2.14'
120
+ version: '0.9'
34
121
  type: :development
35
122
  prerelease: false
36
123
  version_requirements: !ruby/object:Gem::Requirement
124
+ none: false
37
125
  requirements:
38
- - - "~>"
126
+ - - ~>
39
127
  - !ruby/object:Gem::Version
40
- version: '2.14'
128
+ version: '0.9'
41
129
  - !ruby/object:Gem::Dependency
42
- name: yard
130
+ name: rspec
43
131
  requirement: !ruby/object:Gem::Requirement
132
+ none: false
44
133
  requirements:
45
- - - "~>"
134
+ - - ~>
46
135
  - !ruby/object:Gem::Version
47
- version: '0.8'
136
+ version: '3.2'
48
137
  type: :development
49
138
  prerelease: false
50
139
  version_requirements: !ruby/object:Gem::Requirement
140
+ none: false
51
141
  requirements:
52
- - - "~>"
142
+ - - ~>
53
143
  - !ruby/object:Gem::Version
54
- version: '0.8'
144
+ version: '3.2'
55
145
  - !ruby/object:Gem::Dependency
56
- name: rdoc
146
+ name: yard
57
147
  requirement: !ruby/object:Gem::Requirement
148
+ none: false
58
149
  requirements:
59
- - - "~>"
150
+ - - ~>
60
151
  - !ruby/object:Gem::Version
61
- version: '4.0'
152
+ version: '0.8'
62
153
  type: :development
63
154
  prerelease: false
64
155
  version_requirements: !ruby/object:Gem::Requirement
156
+ none: false
65
157
  requirements:
66
- - - "~>"
158
+ - - ~>
67
159
  - !ruby/object:Gem::Version
68
- version: '4.0'
160
+ version: '0.8'
69
161
  - !ruby/object:Gem::Dependency
70
- name: bundler
162
+ name: rdoc
71
163
  requirement: !ruby/object:Gem::Requirement
164
+ none: false
72
165
  requirements:
73
- - - "~>"
166
+ - - ~>
74
167
  - !ruby/object:Gem::Version
75
- version: '1.3'
168
+ version: '4.2'
76
169
  type: :development
77
170
  prerelease: false
78
171
  version_requirements: !ruby/object:Gem::Requirement
172
+ none: false
79
173
  requirements:
80
- - - "~>"
174
+ - - ~>
81
175
  - !ruby/object:Gem::Version
82
- version: '1.3'
83
- description: The BEL gem allows the reading, writing, and processing of BEL (Biological
84
- Expression Language) with a natural DSL.
85
- email: abargnesi@selventa.com
176
+ version: '4.2'
177
+ description: ! ' The BEL gem allows the reading, writing, and processing of BEL (Biological
178
+ Expression Language) with a natural DSL. '
179
+ email:
180
+ - abargnesi@selventa.com
181
+ - ncatlett@selventa.com
182
+ - nbargnesi@selventa.com
183
+ - whayes@selventa.com
86
184
  executables:
185
+ - bel_summarize
186
+ - bel_rdfschema
187
+ - bel_upgrade_term
188
+ - bel2rdf
189
+ - bel_parse
190
+ - bel_compare
87
191
  - bel_upgrade
88
- extensions: []
192
+ extensions:
193
+ - ext/mri/extconf.rb
89
194
  extra_rdoc_files: []
90
195
  files:
91
- - LICENSE
92
- - bin/bel_upgrade
93
- - lib/bel.rb
196
+ - lib/util.rb
197
+ - lib/libbel.rb
198
+ - lib/bel/quoting.rb
199
+ - lib/bel/rdf.rb
200
+ - lib/bel/completion.rb
201
+ - lib/bel/completion_rule.rb
202
+ - lib/bel/script.rb
94
203
  - lib/bel/language.rb
95
204
  - lib/bel/namespace.rb
96
- - lib/bel/parse_objects.rb
97
- - lib/bel/script.rb
205
+ - lib/features.rb
206
+ - lib/bel.rb
207
+ - ext/mri/bel-token.c
208
+ - ext/mri/bel-ast.c
209
+ - ext/mri/bel-tokenize-term.c
210
+ - ext/mri/libbel.c
211
+ - ext/mri/bel-parser.c
212
+ - ext/mri/bel-parse-statement.c
213
+ - ext/mri/bel-parse-term.c
214
+ - ext/mri/bel-node-stack.c
215
+ - ext/mri/bel-token.h
216
+ - ext/mri/bel-node-stack.h
217
+ - ext/mri/bel-parser.h
218
+ - ext/mri/bel-ast.h
219
+ - ext/mri/libbel.def
220
+ - bel.gemspec
221
+ - LICENSE
222
+ - INSTALL.md
223
+ - INSTALL_RUBY.md
224
+ - README.md
225
+ - bin/bel_summarize
226
+ - bin/bel_rdfschema
227
+ - bin/bel_upgrade_term
228
+ - bin/bel2rdf
229
+ - bin/bel_parse
230
+ - bin/bel_compare
231
+ - bin/bel_upgrade
232
+ - ext/mri/extconf.rb
98
233
  homepage: https://github.com/OpenBEL/bel.rb
99
234
  licenses:
100
235
  - Apache-2.0
101
- metadata: {}
102
236
  post_install_message:
103
- rdoc_options: []
237
+ rdoc_options:
238
+ - --title
239
+ - BEL Ruby Documentation
240
+ - --main
241
+ - README.md
242
+ - --line-numbers
243
+ - --exclude
244
+ - lib/bel/script.rb
245
+ - README.md
246
+ - INSTALL.md
247
+ - INSTALL_RUBY.md
248
+ - LICENSE
104
249
  require_paths:
105
250
  - lib
106
251
  required_ruby_version: !ruby/object:Gem::Requirement
252
+ none: false
107
253
  requirements:
108
- - - ">="
254
+ - - ! '>='
109
255
  - !ruby/object:Gem::Version
110
- version: '0'
256
+ version: 1.9.2
111
257
  required_rubygems_version: !ruby/object:Gem::Requirement
258
+ none: false
112
259
  requirements:
113
- - - ">="
260
+ - - ! '>'
114
261
  - !ruby/object:Gem::Version
115
- version: '0'
262
+ version: 1.3.1
116
263
  requirements: []
117
264
  rubyforge_project:
118
- rubygems_version: 2.2.0
265
+ rubygems_version: 1.8.23.2
119
266
  signing_key:
120
- specification_version: 4
267
+ specification_version: 3
121
268
  summary: Process BEL with ruby.
122
269
  test_files: []
123
270
  has_rdoc: