tnql 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (51) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +9 -0
  3. data/.hound.yml +10 -0
  4. data/.rubocop.yml +7 -0
  5. data/.travis.yml +11 -0
  6. data/CODE_OF_CONDUCT.md +13 -0
  7. data/Gemfile +4 -0
  8. data/Guardfile +15 -0
  9. data/LICENSE.txt +21 -0
  10. data/README.md +74 -0
  11. data/Rakefile +12 -0
  12. data/bin/console +10 -0
  13. data/bin/setup +7 -0
  14. data/code_safety.yml +272 -0
  15. data/lib/tnql.rb +4 -0
  16. data/lib/tnql/constants.rb +8 -0
  17. data/lib/tnql/grammars.rb +16 -0
  18. data/lib/tnql/grammars/age.treetop +63 -0
  19. data/lib/tnql/grammars/batch_types.treetop +65 -0
  20. data/lib/tnql/grammars/dates.treetop +35 -0
  21. data/lib/tnql/grammars/diagnosis.treetop +23 -0
  22. data/lib/tnql/grammars/e_base_records.treetop +86 -0
  23. data/lib/tnql/grammars/main.treetop +54 -0
  24. data/lib/tnql/grammars/patient.treetop +39 -0
  25. data/lib/tnql/grammars/provider.treetop +21 -0
  26. data/lib/tnql/grammars/registration_status.treetop +11 -0
  27. data/lib/tnql/grammars/registry.treetop +15 -0
  28. data/lib/tnql/grammars/staging.treetop +23 -0
  29. data/lib/tnql/grammars/treatment.treetop +35 -0
  30. data/lib/tnql/grammars/tumour_type.treetop +54 -0
  31. data/lib/tnql/grammars/vital_status.treetop +19 -0
  32. data/lib/tnql/nodes.rb +25 -0
  33. data/lib/tnql/nodes/age.rb +82 -0
  34. data/lib/tnql/nodes/batch_types.rb +52 -0
  35. data/lib/tnql/nodes/dates.rb +50 -0
  36. data/lib/tnql/nodes/diagnosis.rb +31 -0
  37. data/lib/tnql/nodes/e_base_records.rb +61 -0
  38. data/lib/tnql/nodes/main.rb +11 -0
  39. data/lib/tnql/nodes/patient.rb +9 -0
  40. data/lib/tnql/nodes/provider.rb +24 -0
  41. data/lib/tnql/nodes/registration_status.rb +27 -0
  42. data/lib/tnql/nodes/registry.rb +33 -0
  43. data/lib/tnql/nodes/staging.rb +17 -0
  44. data/lib/tnql/nodes/treatment.rb +45 -0
  45. data/lib/tnql/nodes/tumour_type.rb +74 -0
  46. data/lib/tnql/nodes/vital_status.rb +15 -0
  47. data/lib/tnql/parser.rb +56 -0
  48. data/lib/tnql/treetop/extensions.rb +20 -0
  49. data/lib/tnql/version.rb +4 -0
  50. data/tnql.gemspec +39 -0
  51. metadata +286 -0
@@ -0,0 +1,9 @@
1
+ module Tnql #:nodoc: all
2
+ module Nodes
3
+ module GenderNode
4
+ def meta_data_item
5
+ { 'patient.sex' => { Tnql::EQUALS => gender.text_value == 'male' ? '1' : '2' } }
6
+ end
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,24 @@
1
+ module Tnql #:nodoc: all
2
+ module Nodes
3
+ module ProviderNameNode
4
+ def meta_data_item
5
+ # default to provider
6
+ key = provider_type.text_value == 'cancer network' ? 'cn_ukacrname' : 'providername'
7
+ {
8
+ "diagnosis.#{key}" => {
9
+ Tnql::BEGINS => name.text_value.upcase,
10
+ :interval => interval
11
+ }
12
+ }
13
+ end
14
+ end
15
+
16
+ module ProviderCodeNode
17
+ def meta_data_item
18
+ # default to provider
19
+ key = provider_type.text_value == 'cancer network' ? 'cn_ukacr' : 'providercode'
20
+ { "diagnosis.#{key}" => { Tnql::EQUALS => code.text_value.upcase } }
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,27 @@
1
+ module Tnql #:nodoc: all
2
+ module Nodes
3
+ module RegistrationStatusNode
4
+ def meta_data_item
5
+ { 'tumour.statusofregistration' => { Tnql::EQUALS => statuses } }
6
+ end
7
+
8
+ def statuses
9
+ [status_keyword.statusofregistration] + remaining_statuses
10
+ end
11
+
12
+ def remaining_statuses
13
+ more_statuses.elements.map do |comma_and_status|
14
+ comma_and_status.status_keyword.statusofregistration
15
+ end
16
+ end
17
+ end
18
+
19
+ module StatusKeywordNode
20
+ def statusofregistration
21
+ # Currently every status is the upper case first letter of the description
22
+ # May need to replace this with a case statement at a later date, if needed
23
+ text_value[0, 1].upcase
24
+ end
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,33 @@
1
+ module Tnql #:nodoc: all
2
+ module Nodes
3
+ module RegistryNode
4
+ def meta_data_item
5
+ { 'tumour.registry' => { Tnql::EQUALS => registry.to_registrycode } }
6
+ end
7
+ end
8
+
9
+ module RegistryCodeNode
10
+ def to_registrycode
11
+ text_value.upcase
12
+ end
13
+ end
14
+
15
+ module RegistryAbbrNode
16
+ REGISTRY_ABBR = {
17
+ 'nycris' => 'Y0201',
18
+ 'trent' => 'Y0301',
19
+ 'ecric' => 'Y0401',
20
+ 'thames' => 'Y0801',
21
+ 'oxford' => 'Y0901',
22
+ 'ociu' => 'Y0901',
23
+ 'swcis' => 'Y1001',
24
+ 'wmciu' => 'Y1201',
25
+ 'nwcis' => 'Y1701'
26
+ }.freeze unless defined?(REGISTRY_ABBR)
27
+
28
+ def to_registrycode
29
+ REGISTRY_ABBR[text_value]
30
+ end
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,17 @@
1
+ module Tnql #:nodoc: all
2
+ module Nodes
3
+ module StageDetailNode
4
+ def meta_data_item
5
+ case text_value
6
+ when 'unstaged'
7
+ { 'staging.stage' => { Tnql::EQUALS => nil } }
8
+ when 'valid stage'
9
+ { 'staging.stage' => { Tnql::BEGINS => %w(1 2 3 4) } }
10
+ else
11
+ stage_values = stages.elements.map(&:text_value).map(&:upcase)
12
+ { 'staging.stage' => { Tnql::BEGINS => stage_values } }
13
+ end
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,45 @@
1
+ module Tnql #:nodoc: all
2
+ module Nodes
3
+ module TreatmentDateRangeNode
4
+ def meta_data_item
5
+ {
6
+ 'treatment.startoradmissiondate' => {
7
+ Tnql::LIMITS => [
8
+ start.to_daterange.date1.try(:to_date).try(:iso8601),
9
+ finish.to_daterange.date2.try(:to_date).try(:iso8601)
10
+ ]
11
+ }
12
+ }
13
+ end
14
+ end
15
+
16
+ module TreatmentPreciseDateNode
17
+ def meta_data_item
18
+ date_range = date_fragment.to_daterange
19
+
20
+ {
21
+ 'treatment.startoradmissiondate' => {
22
+ Tnql::LIMITS => [
23
+ date_range.date1.try(:to_date).try(:iso8601),
24
+ date_range.date2.try(:to_date).try(:iso8601)
25
+ ]
26
+ }
27
+ }
28
+ end
29
+ end
30
+
31
+ module TreatmentProviderNameNode
32
+ def meta_data_item
33
+ { 'treatment.providername' => { Tnql::MESSAGE => 'TODO: "' + text_value + '" ignored' } }
34
+ end
35
+ end
36
+
37
+ module TreatmentProviderCodeNode
38
+ def meta_data_item
39
+ # default to provider
40
+ key = provider_type.text_value == 'cancer network' ? 'cn_ukacr' : 'providercode'
41
+ { "treatment.#{key}" => { Tnql::EQUALS => code.text_value.upcase } }
42
+ end
43
+ end
44
+ end
45
+ end
@@ -0,0 +1,74 @@
1
+ module Tnql #:nodoc: all
2
+ module Nodes
3
+ module BehaviourDetailNode
4
+ def meta_data_item
5
+ case text_value
6
+ when 'noninvasive', 'non-invasive'
7
+ { 'tumour.behaviour' => { Tnql::EQUALS => %w(0 1 2) } }
8
+ when 'invasive'
9
+ { 'tumour.behaviour' => { Tnql::EQUALS => %w(3 5) } }
10
+ when 'metastatic'
11
+ { 'tumour.behaviour' => { Tnql::EQUALS => '6' } }
12
+ else
13
+ { 'tumour.behaviour' => { Tnql::EQUALS => number.text_value } }
14
+ end
15
+ end
16
+ end
17
+
18
+ module SiteGroupNode
19
+ SITE_GROUPS = {
20
+ 'brain' => 1,
21
+ 'breast' => 2,
22
+ 'endocrine' => 3,
23
+ 'gynaecological' => 6,
24
+ 'haematological' => 7,
25
+ 'head and neck' => 8,
26
+ 'lower gi' => 4,
27
+ 'lung' => 9,
28
+ 'other' => 14,
29
+ 'sarcoma' => 10,
30
+ 'skin' => 11,
31
+ 'upper gi' => 5,
32
+ 'urological' => 12
33
+ }.freeze unless defined?(SITE_GROUPS)
34
+
35
+ def meta_data_item
36
+ { 'tumour.site_group' => { Tnql::EQUALS => SITE_GROUPS[text_value] } }
37
+ end
38
+ end
39
+
40
+ module MelanomaNode
41
+ def meta_data_item
42
+ { 'tumour.icd10o2_primarycode' => { Tnql::BEGINS => 'C43' } }
43
+ end
44
+ end
45
+
46
+ module NonMelanomaNode
47
+ def meta_data_item
48
+ { 'tumour.icd10o2_primarycode' => { Tnql::BEGINS => 'C44' } }
49
+ end
50
+ end
51
+
52
+ module SitesNode
53
+ def meta_data_item
54
+ sites_array = [first.to_site]
55
+ rest.elements.map { |e| sites_array << e.to_site if !e.nil? && e.respond_to?(:to_site) }
56
+ sites_array.flatten.delete_if { |a| a.nil? || a.empty? }
57
+
58
+ { 'tumour.primarycode' => { Tnql::BEGINS => sites_array } }
59
+ end
60
+ end
61
+
62
+ module AdditionalSiteNode
63
+ def to_site
64
+ site.to_site
65
+ end
66
+ end
67
+
68
+ module SingleSiteNode
69
+ def to_site
70
+ text_value.upcase
71
+ end
72
+ end
73
+ end
74
+ end
@@ -0,0 +1,15 @@
1
+ module Tnql #:nodoc: all
2
+ module Nodes
3
+ module DeadOrAliveNode
4
+ def meta_data_item
5
+ { 'patient.dead' => { Tnql::EQUALS => vital_status.text_value == 'dead' } }
6
+ end
7
+ end
8
+
9
+ module DeathCertificateNode
10
+ def meta_data_item
11
+ { 'patient.death_certificate' => { Tnql::EQUALS => modifier.text_value != 'no' } }
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,56 @@
1
+ require 'tnql/nodes'
2
+ require 'tnql/grammars'
3
+
4
+ module Tnql
5
+ # This class simplifies TNQL queries by wrapping them in a little syntactic sugar.
6
+ class Parser
7
+ attr_reader :parser
8
+
9
+ def initialize(query)
10
+ raise ArgumentError unless query.is_a?(String)
11
+
12
+ @parser = TnqlParser.new
13
+ @result = @parser.parse(query.downcase)
14
+
15
+ return if valid?
16
+ # FIXME: should log "Parser failed parsing \"#{query}\": #{@parser.failure_reason} " \
17
+ # "(line: #{@parser.failure_line}, column: #{@parser.failure_column})"
18
+ end
19
+
20
+ def valid?
21
+ !@result.nil?
22
+ end
23
+
24
+ def failure_reason
25
+ valid? ? nil : @parser.failure_reason
26
+ end
27
+
28
+ def failure_line
29
+ valid? ? nil : @parser.failure_line
30
+ end
31
+
32
+ def failure_column
33
+ valid? ? nil : @parser.failure_column
34
+ end
35
+
36
+ def diagnosis_range
37
+ tumour_diagnosisdate = meta_data['tumour.diagnosisdate']
38
+ return nil unless tumour_diagnosisdate
39
+
40
+ starts, ends = tumour_diagnosisdate[Tnql::LIMITS]
41
+ Daterange.new(Date.parse(starts), Date.parse(ends))
42
+ end
43
+
44
+ def messages # check if any query conditions been ignored or modified
45
+ msg = ''.html_safe
46
+ meta_data.each do |_canonical_name, filter|
47
+ msg += filter[Tnql::MESSAGE] if filter.key?(Tnql::MESSAGE)
48
+ end
49
+ msg
50
+ end
51
+
52
+ def meta_data
53
+ valid? ? @result.meta_data : {}
54
+ end
55
+ end
56
+ end
@@ -0,0 +1,20 @@
1
+ module Treetop
2
+ module Runtime
3
+ # We extend the SyntaxNode class to include a hash of meta data.
4
+ # Individual rules can define meta_data_item method that must return
5
+ # a hash that is merged with the hash data for the entire query.
6
+ class SyntaxNode
7
+ def meta_data(hash = {})
8
+ hash.merge!(meta_data_item) if respond_to?(:meta_data_item)
9
+
10
+ if nonterminal?
11
+ elements.each do |element|
12
+ element.meta_data(hash)
13
+ end
14
+ end
15
+
16
+ hash
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,4 @@
1
+ # This stores the current version of the Tnql gem
2
+ module Tnql
3
+ VERSION = '1.0.0'.freeze
4
+ end
@@ -0,0 +1,39 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'tnql/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = 'tnql'
8
+ spec.version = Tnql::VERSION
9
+ spec.authors = ['PHE NDR IT Development Team']
10
+ spec.email = []
11
+
12
+ spec.summary = 'Tumour Natural Query Language'
13
+ spec.description = 'Domain Specific Language for querying PHE NCRAS datastores'
14
+ spec.homepage = 'https://github.com/PublicHealthEngland/tnql'
15
+ spec.license = 'MIT'
16
+
17
+ spec.files = `git ls-files -z`.split("\x0").
18
+ reject { |f| f.match(%r{^(test|spec|features)/}) }
19
+ spec.bindir = 'exe'
20
+ spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
21
+ spec.require_paths = ['lib']
22
+
23
+ spec.required_ruby_version = '>= 2.2.0'
24
+
25
+ spec.add_dependency 'activesupport', '>= 3.2.18', '< 5.1'
26
+ spec.add_dependency 'ndr_support', '>= 3.0', '< 6'
27
+ spec.add_dependency 'treetop', '>= 1.4.10'
28
+ spec.add_dependency 'chronic', '~> 0.3.0'
29
+
30
+ spec.add_development_dependency 'ndr_dev_support', '~> 2.1'
31
+ spec.add_development_dependency 'bundler'
32
+ spec.add_development_dependency 'rake'
33
+ spec.add_development_dependency 'minitest', '>= 5.0.0'
34
+ spec.add_development_dependency 'pry'
35
+ spec.add_development_dependency 'guard'
36
+ spec.add_development_dependency 'guard-rubocop'
37
+ spec.add_development_dependency 'guard-minitest'
38
+ spec.add_development_dependency 'terminal-notifier-guard' if RUBY_PLATFORM =~ /darwin/
39
+ end
metadata ADDED
@@ -0,0 +1,286 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: tnql
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
5
+ platform: ruby
6
+ authors:
7
+ - PHE NDR IT Development Team
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2017-05-25 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: activesupport
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: 3.2.18
20
+ - - "<"
21
+ - !ruby/object:Gem::Version
22
+ version: '5.1'
23
+ type: :runtime
24
+ prerelease: false
25
+ version_requirements: !ruby/object:Gem::Requirement
26
+ requirements:
27
+ - - ">="
28
+ - !ruby/object:Gem::Version
29
+ version: 3.2.18
30
+ - - "<"
31
+ - !ruby/object:Gem::Version
32
+ version: '5.1'
33
+ - !ruby/object:Gem::Dependency
34
+ name: ndr_support
35
+ requirement: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - ">="
38
+ - !ruby/object:Gem::Version
39
+ version: '3.0'
40
+ - - "<"
41
+ - !ruby/object:Gem::Version
42
+ version: '6'
43
+ type: :runtime
44
+ prerelease: false
45
+ version_requirements: !ruby/object:Gem::Requirement
46
+ requirements:
47
+ - - ">="
48
+ - !ruby/object:Gem::Version
49
+ version: '3.0'
50
+ - - "<"
51
+ - !ruby/object:Gem::Version
52
+ version: '6'
53
+ - !ruby/object:Gem::Dependency
54
+ name: treetop
55
+ requirement: !ruby/object:Gem::Requirement
56
+ requirements:
57
+ - - ">="
58
+ - !ruby/object:Gem::Version
59
+ version: 1.4.10
60
+ type: :runtime
61
+ prerelease: false
62
+ version_requirements: !ruby/object:Gem::Requirement
63
+ requirements:
64
+ - - ">="
65
+ - !ruby/object:Gem::Version
66
+ version: 1.4.10
67
+ - !ruby/object:Gem::Dependency
68
+ name: chronic
69
+ requirement: !ruby/object:Gem::Requirement
70
+ requirements:
71
+ - - "~>"
72
+ - !ruby/object:Gem::Version
73
+ version: 0.3.0
74
+ type: :runtime
75
+ prerelease: false
76
+ version_requirements: !ruby/object:Gem::Requirement
77
+ requirements:
78
+ - - "~>"
79
+ - !ruby/object:Gem::Version
80
+ version: 0.3.0
81
+ - !ruby/object:Gem::Dependency
82
+ name: ndr_dev_support
83
+ requirement: !ruby/object:Gem::Requirement
84
+ requirements:
85
+ - - "~>"
86
+ - !ruby/object:Gem::Version
87
+ version: '2.1'
88
+ type: :development
89
+ prerelease: false
90
+ version_requirements: !ruby/object:Gem::Requirement
91
+ requirements:
92
+ - - "~>"
93
+ - !ruby/object:Gem::Version
94
+ version: '2.1'
95
+ - !ruby/object:Gem::Dependency
96
+ name: bundler
97
+ requirement: !ruby/object:Gem::Requirement
98
+ requirements:
99
+ - - ">="
100
+ - !ruby/object:Gem::Version
101
+ version: '0'
102
+ type: :development
103
+ prerelease: false
104
+ version_requirements: !ruby/object:Gem::Requirement
105
+ requirements:
106
+ - - ">="
107
+ - !ruby/object:Gem::Version
108
+ version: '0'
109
+ - !ruby/object:Gem::Dependency
110
+ name: rake
111
+ requirement: !ruby/object:Gem::Requirement
112
+ requirements:
113
+ - - ">="
114
+ - !ruby/object:Gem::Version
115
+ version: '0'
116
+ type: :development
117
+ prerelease: false
118
+ version_requirements: !ruby/object:Gem::Requirement
119
+ requirements:
120
+ - - ">="
121
+ - !ruby/object:Gem::Version
122
+ version: '0'
123
+ - !ruby/object:Gem::Dependency
124
+ name: minitest
125
+ requirement: !ruby/object:Gem::Requirement
126
+ requirements:
127
+ - - ">="
128
+ - !ruby/object:Gem::Version
129
+ version: 5.0.0
130
+ type: :development
131
+ prerelease: false
132
+ version_requirements: !ruby/object:Gem::Requirement
133
+ requirements:
134
+ - - ">="
135
+ - !ruby/object:Gem::Version
136
+ version: 5.0.0
137
+ - !ruby/object:Gem::Dependency
138
+ name: pry
139
+ requirement: !ruby/object:Gem::Requirement
140
+ requirements:
141
+ - - ">="
142
+ - !ruby/object:Gem::Version
143
+ version: '0'
144
+ type: :development
145
+ prerelease: false
146
+ version_requirements: !ruby/object:Gem::Requirement
147
+ requirements:
148
+ - - ">="
149
+ - !ruby/object:Gem::Version
150
+ version: '0'
151
+ - !ruby/object:Gem::Dependency
152
+ name: guard
153
+ requirement: !ruby/object:Gem::Requirement
154
+ requirements:
155
+ - - ">="
156
+ - !ruby/object:Gem::Version
157
+ version: '0'
158
+ type: :development
159
+ prerelease: false
160
+ version_requirements: !ruby/object:Gem::Requirement
161
+ requirements:
162
+ - - ">="
163
+ - !ruby/object:Gem::Version
164
+ version: '0'
165
+ - !ruby/object:Gem::Dependency
166
+ name: guard-rubocop
167
+ requirement: !ruby/object:Gem::Requirement
168
+ requirements:
169
+ - - ">="
170
+ - !ruby/object:Gem::Version
171
+ version: '0'
172
+ type: :development
173
+ prerelease: false
174
+ version_requirements: !ruby/object:Gem::Requirement
175
+ requirements:
176
+ - - ">="
177
+ - !ruby/object:Gem::Version
178
+ version: '0'
179
+ - !ruby/object:Gem::Dependency
180
+ name: guard-minitest
181
+ requirement: !ruby/object:Gem::Requirement
182
+ requirements:
183
+ - - ">="
184
+ - !ruby/object:Gem::Version
185
+ version: '0'
186
+ type: :development
187
+ prerelease: false
188
+ version_requirements: !ruby/object:Gem::Requirement
189
+ requirements:
190
+ - - ">="
191
+ - !ruby/object:Gem::Version
192
+ version: '0'
193
+ - !ruby/object:Gem::Dependency
194
+ name: terminal-notifier-guard
195
+ requirement: !ruby/object:Gem::Requirement
196
+ requirements:
197
+ - - ">="
198
+ - !ruby/object:Gem::Version
199
+ version: '0'
200
+ type: :development
201
+ prerelease: false
202
+ version_requirements: !ruby/object:Gem::Requirement
203
+ requirements:
204
+ - - ">="
205
+ - !ruby/object:Gem::Version
206
+ version: '0'
207
+ description: Domain Specific Language for querying PHE NCRAS datastores
208
+ email: []
209
+ executables: []
210
+ extensions: []
211
+ extra_rdoc_files: []
212
+ files:
213
+ - ".gitignore"
214
+ - ".hound.yml"
215
+ - ".rubocop.yml"
216
+ - ".travis.yml"
217
+ - CODE_OF_CONDUCT.md
218
+ - Gemfile
219
+ - Guardfile
220
+ - LICENSE.txt
221
+ - README.md
222
+ - Rakefile
223
+ - bin/console
224
+ - bin/setup
225
+ - code_safety.yml
226
+ - lib/tnql.rb
227
+ - lib/tnql/constants.rb
228
+ - lib/tnql/grammars.rb
229
+ - lib/tnql/grammars/age.treetop
230
+ - lib/tnql/grammars/batch_types.treetop
231
+ - lib/tnql/grammars/dates.treetop
232
+ - lib/tnql/grammars/diagnosis.treetop
233
+ - lib/tnql/grammars/e_base_records.treetop
234
+ - lib/tnql/grammars/main.treetop
235
+ - lib/tnql/grammars/patient.treetop
236
+ - lib/tnql/grammars/provider.treetop
237
+ - lib/tnql/grammars/registration_status.treetop
238
+ - lib/tnql/grammars/registry.treetop
239
+ - lib/tnql/grammars/staging.treetop
240
+ - lib/tnql/grammars/treatment.treetop
241
+ - lib/tnql/grammars/tumour_type.treetop
242
+ - lib/tnql/grammars/vital_status.treetop
243
+ - lib/tnql/nodes.rb
244
+ - lib/tnql/nodes/age.rb
245
+ - lib/tnql/nodes/batch_types.rb
246
+ - lib/tnql/nodes/dates.rb
247
+ - lib/tnql/nodes/diagnosis.rb
248
+ - lib/tnql/nodes/e_base_records.rb
249
+ - lib/tnql/nodes/main.rb
250
+ - lib/tnql/nodes/patient.rb
251
+ - lib/tnql/nodes/provider.rb
252
+ - lib/tnql/nodes/registration_status.rb
253
+ - lib/tnql/nodes/registry.rb
254
+ - lib/tnql/nodes/staging.rb
255
+ - lib/tnql/nodes/treatment.rb
256
+ - lib/tnql/nodes/tumour_type.rb
257
+ - lib/tnql/nodes/vital_status.rb
258
+ - lib/tnql/parser.rb
259
+ - lib/tnql/treetop/extensions.rb
260
+ - lib/tnql/version.rb
261
+ - tnql.gemspec
262
+ homepage: https://github.com/PublicHealthEngland/tnql
263
+ licenses:
264
+ - MIT
265
+ metadata: {}
266
+ post_install_message:
267
+ rdoc_options: []
268
+ require_paths:
269
+ - lib
270
+ required_ruby_version: !ruby/object:Gem::Requirement
271
+ requirements:
272
+ - - ">="
273
+ - !ruby/object:Gem::Version
274
+ version: 2.2.0
275
+ required_rubygems_version: !ruby/object:Gem::Requirement
276
+ requirements:
277
+ - - ">="
278
+ - !ruby/object:Gem::Version
279
+ version: '0'
280
+ requirements: []
281
+ rubyforge_project:
282
+ rubygems_version: 2.5.1
283
+ signing_key:
284
+ specification_version: 4
285
+ summary: Tumour Natural Query Language
286
+ test_files: []