rx_nav 0.1.3 → 0.2.0
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.
- checksums.yaml +4 -4
- data/Gemfile +6 -0
- data/Guardfile +16 -0
- data/README.md +38 -2
- data/Rakefile +7 -1
- data/lib/rx_nav.rb +4 -0
- data/lib/rx_nav/concept.rb +6 -5
- data/lib/rx_nav/ndfrt.rb +24 -22
- data/lib/rx_nav/rx_norm.rb +29 -15
- data/lib/rx_nav/version.rb +1 -1
- data/rx_nav.gemspec +1 -0
- data/spec/concept_spec.rb +64 -0
- data/spec/ndfrt_spec.rb +116 -0
- data/spec/rx_nav_spec.rb +14 -0
- data/spec/rx_norm_spec.rb +92 -0
- data/spec/spec_helper.rb +4 -0
- data/spec/support/api.rb +5 -0
- data/spec/support/array_type.rb +5 -0
- metadata +33 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 8367470122958506ce71097193a6cf0412337350
|
4
|
+
data.tar.gz: 09ab00eadee63525cffff3503bd2b6cf727c6692
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: bd3d4a99fbddfe32604451cbe3a59f94de135ba097d4cf15637220bf403e08260f619bea1ab0d7b6109a48630ac982ef6c49f56400356966c917e6cd55982030
|
7
|
+
data.tar.gz: 90540aea81270a5926f35808add76a13add19e980a9a2c43d5634e0883973c2b52148344ed6e5c58297d029abd69c8a059ed3685ba45b9d87d2a7d9a18742892
|
data/Gemfile
CHANGED
data/Guardfile
ADDED
@@ -0,0 +1,16 @@
|
|
1
|
+
clearing :on
|
2
|
+
|
3
|
+
guard :rspec, cmd: "bundle exec rspec" do
|
4
|
+
require "guard/rspec/dsl"
|
5
|
+
dsl = Guard::RSpec::Dsl.new(self)
|
6
|
+
|
7
|
+
# RSpec files
|
8
|
+
rspec = dsl.rspec
|
9
|
+
watch(rspec.spec_helper) { rspec.spec_dir }
|
10
|
+
watch(rspec.spec_support) { rspec.spec_dir }
|
11
|
+
watch(rspec.spec_files)
|
12
|
+
|
13
|
+
# Ruby files
|
14
|
+
ruby = dsl.ruby
|
15
|
+
dsl.watch_spec_files_for(ruby.lib_files)
|
16
|
+
end
|
data/README.md
CHANGED
@@ -1,6 +1,8 @@
|
|
1
1
|
# RxNav
|
2
2
|
|
3
|
-
[](https://rubygems.org/gems/rx_nav) [](https://gemnasium.com/jbender/rx_nav_ruby)
|
4
|
+
[](https://codeclimate.com/github/jbender/rx_nav_ruby) [](https://codeclimate.com/github/jbender/rx_nav_ruby)
|
5
|
+
[ ](https://codeship.com/projects/60640)
|
4
6
|
|
5
7
|
This gem makes it easier to work with the RxNav REST APIs, as enumerated on [this page](http://rxnav.nlm.nih.gov/APIsOverview.html).
|
6
8
|
|
@@ -22,7 +24,41 @@ Or install it yourself as:
|
|
22
24
|
|
23
25
|
## Usage
|
24
26
|
|
25
|
-
|
27
|
+
Each service has it's own class, which have the class methods enumerated below. When appropriate, these methods will return `Concept`s, which are further queryable to retrieve more information about a specific drug. **Question marks indicate optional parameters.**
|
28
|
+
|
29
|
+
Please note that according to the [NLM Terms of Service](http://rxnav.nlm.nih.gov/TermOfService.html), you can will only be able to make **20 requests/second/IP**, so keep that in mind when implementing this project.
|
30
|
+
|
31
|
+
### [NDF-RT (Class named NDFRT)](https://github.com/jbender/rx_nav_ruby/blob/master/lib/rx_nav/ndfrt.rb)
|
32
|
+
|
33
|
+
* all_records_by_kind
|
34
|
+
* get_info
|
35
|
+
* find_by_name(name, kind?)
|
36
|
+
* find_by_id(type, id)
|
37
|
+
* find_by({type: x, id: y} OR {name: x, kind: y})
|
38
|
+
* possible_roles
|
39
|
+
* possible_properties
|
40
|
+
* possible_kinds
|
41
|
+
* possible_types
|
42
|
+
* possible_associations
|
43
|
+
* possible_options_for(type)
|
44
|
+
* api_version
|
45
|
+
|
46
|
+
### [RxNorm](https://github.com/jbender/rx_nav_ruby/blob/master/lib/rx_nav/rx_norm.rb)
|
47
|
+
|
48
|
+
* search_by_name(name, options?)
|
49
|
+
* find_rxcui_by_id(type, id)
|
50
|
+
* find_rxcui_by_name(name)
|
51
|
+
* find_drugs_by_name(name)
|
52
|
+
* spelling_suggestions(name)
|
53
|
+
* status(id)
|
54
|
+
* properties(id)
|
55
|
+
* quantity(id)
|
56
|
+
* strength(id)
|
57
|
+
|
58
|
+
### [RxTerms](https://github.com/jbender/rx_nav_ruby/blob/master/lib/rx_nav/rx_terms.rb)
|
59
|
+
|
60
|
+
* all_concepts
|
61
|
+
* all_info(id)
|
26
62
|
|
27
63
|
## Contributing
|
28
64
|
|
data/Rakefile
CHANGED
data/lib/rx_nav.rb
CHANGED
data/lib/rx_nav/concept.rb
CHANGED
@@ -28,10 +28,10 @@ module RxNav
|
|
28
28
|
|
29
29
|
# Supplementary calls to fetch info from other DBs
|
30
30
|
# Note: these methods return false if no information was found
|
31
|
-
|
31
|
+
|
32
32
|
def get_terms_info
|
33
33
|
rxcui = get_rxcui
|
34
|
-
info = RxNav::RxTerms.
|
34
|
+
info = RxNav::RxTerms.all_info(rxcui)
|
35
35
|
merge_concept info
|
36
36
|
end
|
37
37
|
|
@@ -58,7 +58,8 @@ module RxNav
|
|
58
58
|
if self.nui.nil?
|
59
59
|
raise "This concept doesn't have a nui or rxcui"
|
60
60
|
else
|
61
|
-
|
61
|
+
rxcui = RxNav::RxNorm.find_rxcui_by_id('nui', self.nui)
|
62
|
+
self.rxcui = rxcui.is_a?(Array) ? rxcui.first : rxcui
|
62
63
|
end
|
63
64
|
end
|
64
65
|
# If we had to look it up, use that, otherwise use the model's
|
@@ -85,7 +86,7 @@ module RxNav
|
|
85
86
|
str.gsub(/\w+/) { |w| w.capitalize } if str.is_a? String
|
86
87
|
end
|
87
88
|
|
88
|
-
def merge_concept
|
89
|
+
def merge_concept concept_hash
|
89
90
|
if concept_hash.nil? || concept_hash.empty?
|
90
91
|
return false
|
91
92
|
else
|
@@ -99,4 +100,4 @@ module RxNav
|
|
99
100
|
end
|
100
101
|
|
101
102
|
end
|
102
|
-
end
|
103
|
+
end
|
data/lib/rx_nav/ndfrt.rb
CHANGED
@@ -38,7 +38,7 @@ module RxNav
|
|
38
38
|
type = type.upcase
|
39
39
|
id = id.to_s
|
40
40
|
query = "/idType=#{type}&idString=#{id}"
|
41
|
-
|
41
|
+
get_concepts query
|
42
42
|
end
|
43
43
|
|
44
44
|
def find_by_name name, kind = nil
|
@@ -47,24 +47,27 @@ module RxNav
|
|
47
47
|
kind = kind.upcase + '_KIND'
|
48
48
|
query += "&kindName=#{kind}"
|
49
49
|
end
|
50
|
-
|
51
|
-
end
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
50
|
+
get_concepts query
|
51
|
+
end
|
52
|
+
|
53
|
+
# PLEASE NOTE:
|
54
|
+
# These methods were deprecated in the Sept 2014 release of ND-FRT
|
55
|
+
#
|
56
|
+
# def find_interacting_drugs nui, scope = 3
|
57
|
+
# query = "/interaction/nui=#{nui}&scope=#{scope}"
|
58
|
+
# response = get_response_hash query
|
59
|
+
# data = response[:group_interactions][:interactions][:group_interacting_drugs][:interacting_drug]
|
60
|
+
# data = [data] unless data.is_a? Array
|
61
|
+
# return data.map { |i| RxNav::Concept.new i[:concept] }
|
62
|
+
# end
|
63
|
+
#
|
64
|
+
# def find_interactions_between nuis, scope = 3
|
65
|
+
# query = "/interaction?nuis=#{nuis.join('+')}&scope=#{scope}"
|
66
|
+
# data = get_response_hash query
|
67
|
+
# return data[:full_interaction_group][:full_interaction].map do |fi|
|
68
|
+
# RxNav::Interaction.new fi[:interaction_triple_group][:interaction_triple]
|
69
|
+
# end
|
70
|
+
# end
|
68
71
|
|
69
72
|
def get_info nui, concept = nil
|
70
73
|
raise "Nui cannot be nil" if nui.nil?
|
@@ -79,7 +82,7 @@ module RxNav
|
|
79
82
|
data = get_response_hash(query)[:group_concepts][:concept]
|
80
83
|
return data.map { |c| RxNav::Concept.new c }
|
81
84
|
end
|
82
|
-
|
85
|
+
|
83
86
|
private
|
84
87
|
|
85
88
|
def get_response_hash query
|
@@ -94,8 +97,7 @@ module RxNav
|
|
94
97
|
def get_concepts query
|
95
98
|
data = get_response_hash(query)[:group_concepts]
|
96
99
|
if data && data[:concept]
|
97
|
-
concepts = data[:concept]
|
98
|
-
concepts = [concepts] unless concepts.is_a?(Array)
|
100
|
+
concepts = RxNav.ensure_array data[:concept]
|
99
101
|
return concepts.map { |c| RxNav::Concept.new(c) }
|
100
102
|
else
|
101
103
|
return nil
|
data/lib/rx_nav/rx_norm.rb
CHANGED
@@ -1,21 +1,23 @@
|
|
1
1
|
module RxNav
|
2
2
|
class RxNorm
|
3
3
|
class << self
|
4
|
-
|
4
|
+
|
5
5
|
def search_by_name name, options = {}
|
6
6
|
options = {max_results: 20, options: 0}.merge(options)
|
7
|
-
|
7
|
+
|
8
8
|
query = "/approximateTerm?term=#{name}"\
|
9
9
|
"&maxEntries=#{options[:max_results]}"\
|
10
10
|
"&options=#{options[:options]}"
|
11
11
|
|
12
12
|
# Get the data we care about in the right form
|
13
13
|
data = get_response_hash(query)[:approximate_group][:candidate]
|
14
|
-
data = [data] if (data && !data.is_a?(Array))
|
15
14
|
|
16
15
|
# If we didn't get anything, say so
|
17
16
|
return nil if data.nil?
|
18
|
-
|
17
|
+
|
18
|
+
# Put it in the right form
|
19
|
+
data = RxNav.ensure_array data
|
20
|
+
|
19
21
|
return data.map { |c| RxNav::Concept.new(c) }
|
20
22
|
end
|
21
23
|
|
@@ -65,13 +67,12 @@ module RxNav
|
|
65
67
|
|
66
68
|
status.send("remapped?=", reported_status == 'remapped')
|
67
69
|
status.send("active?=", reported_status == 'active')
|
68
|
-
|
70
|
+
|
69
71
|
if status.remapped?
|
70
|
-
concepts = data[:min_concept_group][:min_concept]
|
71
|
-
concepts = [concepts] if (concepts && !concepts.is_a?(Array))
|
72
|
+
concepts = RxNav.ensure_array data[:min_concept_group][:min_concept]
|
72
73
|
status.remapped_to = concepts.map { |c| c[:rxcui] }
|
73
74
|
end
|
74
|
-
|
75
|
+
|
75
76
|
return status
|
76
77
|
end
|
77
78
|
|
@@ -80,14 +81,27 @@ module RxNav
|
|
80
81
|
return OpenStruct.new get_response_hash(query)[:properties]
|
81
82
|
end
|
82
83
|
|
84
|
+
def property id, name
|
85
|
+
query = "/rxcui/#{id}/property?propName=#{name.upcase}"
|
86
|
+
response = get_response_hash(query)
|
87
|
+
|
88
|
+
concept_group = response[:property_concept_group]
|
89
|
+
return nil unless concept_group
|
90
|
+
|
91
|
+
concepts = concept_group[:property_concept]
|
92
|
+
return concepts ? concepts[:prop_value] : nil
|
93
|
+
end
|
94
|
+
|
83
95
|
def quantity id
|
84
|
-
|
85
|
-
return get_response_hash(query)[:quantity_group][:quantity]
|
96
|
+
property id, "quantity"
|
86
97
|
end
|
87
98
|
|
88
99
|
def strength id
|
89
|
-
|
90
|
-
|
100
|
+
property id, "strength"
|
101
|
+
end
|
102
|
+
|
103
|
+
def available_strength id
|
104
|
+
property id, "available_strength"
|
91
105
|
end
|
92
106
|
|
93
107
|
private
|
@@ -95,12 +109,12 @@ module RxNav
|
|
95
109
|
def get_response_hash query
|
96
110
|
RxNav.make_request(query)[:rxnormdata]
|
97
111
|
end
|
98
|
-
|
112
|
+
|
99
113
|
def extract_rxcui query
|
100
114
|
data = get_response_hash(query)
|
101
115
|
if data[:id_group]
|
102
|
-
data =
|
103
|
-
return data.map { |c| c[:rxnorm_id] }
|
116
|
+
data = RxNav.ensure_array data
|
117
|
+
return data.map { |c| c[:id_group][:rxnorm_id] }
|
104
118
|
else
|
105
119
|
return nil
|
106
120
|
end
|
data/lib/rx_nav/version.rb
CHANGED
data/rx_nav.gemspec
CHANGED
@@ -0,0 +1,64 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe RxNav::Concept do
|
4
|
+
context 'new concept' do
|
5
|
+
subject { RxNav::Concept.new }
|
6
|
+
it { is_expected.to be_kind_of(OpenStruct) }
|
7
|
+
it { is_expected.to respond_to(:name) }
|
8
|
+
it { is_expected.to respond_to(:kind) }
|
9
|
+
it { is_expected.to respond_to(:nui) }
|
10
|
+
it { is_expected.to respond_to(:to_s) }
|
11
|
+
it { is_expected.to respond_to(:get_terms_info) }
|
12
|
+
it { is_expected.to respond_to(:get_ndfrt_info) }
|
13
|
+
it { is_expected.to respond_to(:get_norm_info) }
|
14
|
+
end
|
15
|
+
|
16
|
+
context 'NDF-RT concept "N0000152900"' do
|
17
|
+
let(:nui) { "N0000152900" }
|
18
|
+
let(:concept) { RxNav::NDFRT.get_info nui }
|
19
|
+
subject { concept }
|
20
|
+
|
21
|
+
context "#name" do
|
22
|
+
subject { concept.name }
|
23
|
+
it { is_expected.to be_kind_of(String) }
|
24
|
+
it { is_expected.to eq("Acetic Acid 2%/Hydrocortisone 1% Soln,Otic") }
|
25
|
+
end
|
26
|
+
|
27
|
+
context "#kind" do
|
28
|
+
subject { concept.kind }
|
29
|
+
it { is_expected.to be_kind_of(String) }
|
30
|
+
it { is_expected.to eq("Drug") }
|
31
|
+
end
|
32
|
+
|
33
|
+
context "#nui" do
|
34
|
+
subject { concept.nui }
|
35
|
+
it { is_expected.to be_kind_of(String) }
|
36
|
+
it { is_expected.to eq(nui) }
|
37
|
+
end
|
38
|
+
|
39
|
+
context "#to_s" do
|
40
|
+
subject { concept.to_s }
|
41
|
+
it { is_expected.to be_kind_of(String) }
|
42
|
+
it { is_expected.to eq(concept.name) }
|
43
|
+
end
|
44
|
+
|
45
|
+
context "#get_terms_info" do
|
46
|
+
let(:original) { concept }
|
47
|
+
subject { concept.get_terms_info }
|
48
|
+
it { is_expected.to be_kind_of(RxNav::Concept) }
|
49
|
+
end
|
50
|
+
|
51
|
+
context "#get_ndfrt_info" do
|
52
|
+
let(:original) { concept }
|
53
|
+
subject { concept.get_ndfrt_info }
|
54
|
+
it { is_expected.to be_kind_of(RxNav::Concept) }
|
55
|
+
end
|
56
|
+
|
57
|
+
context "#get_norm_info" do
|
58
|
+
let(:original) { concept }
|
59
|
+
subject { concept.get_norm_info }
|
60
|
+
it { is_expected.to be_kind_of(RxNav::Concept) }
|
61
|
+
end
|
62
|
+
|
63
|
+
end
|
64
|
+
end
|
data/spec/ndfrt_spec.rb
ADDED
@@ -0,0 +1,116 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'support/api'
|
3
|
+
require 'support/array_type'
|
4
|
+
|
5
|
+
describe RxNav::NDFRT do
|
6
|
+
|
7
|
+
describe "remote endpoints" do
|
8
|
+
url = "http://rxnav.nlm.nih.gov/REST/Ndfrt"
|
9
|
+
response = Net::HTTP.get(URI("#{url}/json"))
|
10
|
+
subject { JSON.parse(response)["resourceList"]["resource"] }
|
11
|
+
|
12
|
+
include_examples 'uses valid endpoints', [
|
13
|
+
"#{url}/version",
|
14
|
+
"#{url}/associationList",
|
15
|
+
"#{url}/typeList",
|
16
|
+
"#{url}/kindList",
|
17
|
+
"#{url}/propertyList",
|
18
|
+
"#{url}/roleList",
|
19
|
+
"#{url}/idType={idType}&idString={idString}",
|
20
|
+
"#{url}/search?conceptName={conceptName}&kindName={kindName}",
|
21
|
+
"#{url}/allInfo/{nui}",
|
22
|
+
"#{url}/allconcepts?kind=yourKinds"
|
23
|
+
]
|
24
|
+
end
|
25
|
+
|
26
|
+
describe "#api_version" do
|
27
|
+
subject { RxNav::NDFRT.api_version }
|
28
|
+
|
29
|
+
it { is_expected.to be_kind_of(String) }
|
30
|
+
end
|
31
|
+
|
32
|
+
describe "#possible_associations" do
|
33
|
+
subject { RxNav::NDFRT.possible_associations }
|
34
|
+
|
35
|
+
include_examples 'should be an array of', String
|
36
|
+
end
|
37
|
+
|
38
|
+
describe "#possible_types" do
|
39
|
+
subject { RxNav::NDFRT.possible_types }
|
40
|
+
|
41
|
+
include_examples 'should be an array of', String
|
42
|
+
end
|
43
|
+
|
44
|
+
describe "#possible_kinds" do
|
45
|
+
subject { RxNav::NDFRT.possible_kinds }
|
46
|
+
|
47
|
+
include_examples 'should be an array of', String
|
48
|
+
end
|
49
|
+
|
50
|
+
describe "#possible_properties" do
|
51
|
+
subject { RxNav::NDFRT.possible_properties }
|
52
|
+
|
53
|
+
include_examples 'should be an array of', String
|
54
|
+
end
|
55
|
+
|
56
|
+
describe "#possible_roles" do
|
57
|
+
subject { RxNav::NDFRT.possible_roles }
|
58
|
+
|
59
|
+
include_examples 'should be an array of', String
|
60
|
+
end
|
61
|
+
|
62
|
+
describe "#find_by_id for type RXCUI and id 161" do
|
63
|
+
subject { RxNav::NDFRT.find_by_id 'RXCUI', '161' }
|
64
|
+
|
65
|
+
include_examples 'should be an array of', RxNav::Concept
|
66
|
+
end
|
67
|
+
|
68
|
+
describe "#find_by_name morphine without kind" do
|
69
|
+
subject { RxNav::NDFRT.find_by_name 'morphine' }
|
70
|
+
|
71
|
+
include_examples 'should be an array of', RxNav::Concept
|
72
|
+
end
|
73
|
+
|
74
|
+
describe "#find_by_name morphine with kind ingredient" do
|
75
|
+
subject { RxNav::NDFRT.find_by_name 'morphine', 'ingredient' }
|
76
|
+
|
77
|
+
include_examples 'should be an array of', RxNav::Concept
|
78
|
+
end
|
79
|
+
|
80
|
+
describe "#find_by with hash of name" do
|
81
|
+
it "should return the same as find_by_name" do
|
82
|
+
@generic_find = RxNav::NDFRT.find_by name: 'morphine'
|
83
|
+
@specific_find = RxNav::NDFRT.find_by_name 'morphine'
|
84
|
+
expect(@generic_find).to eq(@specific_find)
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
88
|
+
describe "#find_by with hash of name and kind" do
|
89
|
+
it "should return the same as find_by_name" do
|
90
|
+
@generic_find = RxNav::NDFRT.find_by name: 'morphine', kind: 'ingredient'
|
91
|
+
@specific_find = RxNav::NDFRT.find_by_name 'morphine', 'ingredient'
|
92
|
+
expect(@generic_find).to eq(@specific_find)
|
93
|
+
end
|
94
|
+
end
|
95
|
+
|
96
|
+
describe "#find_by with hash of type and id" do
|
97
|
+
it "should return the same as find_by_name" do
|
98
|
+
@generic_find = RxNav::NDFRT.find_by type: 'RXCUI', id: '161'
|
99
|
+
@specific_find = RxNav::NDFRT.find_by_id 'RXCUI', '161'
|
100
|
+
expect(@generic_find).to eq(@specific_find)
|
101
|
+
end
|
102
|
+
end
|
103
|
+
|
104
|
+
describe "#all_records_by_kind" do
|
105
|
+
subject { RxNav::NDFRT.all_records_by_kind "pharmacokinetics" }
|
106
|
+
|
107
|
+
include_examples 'should be an array of', RxNav::Concept
|
108
|
+
end
|
109
|
+
|
110
|
+
describe "#get_info" do
|
111
|
+
subject { RxNav::NDFRT.get_info "N0000152900" }
|
112
|
+
|
113
|
+
it { is_expected.to be_kind_of(RxNav::Concept) }
|
114
|
+
end
|
115
|
+
|
116
|
+
end
|
data/spec/rx_nav_spec.rb
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe "http://rxnav.nlm.nih.gov/REST" do
|
4
|
+
before :all do
|
5
|
+
@url = URI "http://rxnav.nlm.nih.gov/REST/json"
|
6
|
+
@response = Net::HTTP.get(@url)
|
7
|
+
@json = JSON.parse(@response)
|
8
|
+
end
|
9
|
+
|
10
|
+
it "should be online" do
|
11
|
+
expect(@json).to_not be_empty
|
12
|
+
end
|
13
|
+
|
14
|
+
end
|
@@ -0,0 +1,92 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'support/api'
|
3
|
+
require 'support/array_type'
|
4
|
+
|
5
|
+
describe RxNav::RxNorm do
|
6
|
+
|
7
|
+
describe "remote endpoints" do
|
8
|
+
url = "http://rxnav.nlm.nih.gov/REST"
|
9
|
+
response = Net::HTTP.get(URI("#{url}/json"))
|
10
|
+
subject { JSON.parse(response)["resourceList"]["resource"] }
|
11
|
+
|
12
|
+
include_examples 'uses valid endpoints', [
|
13
|
+
"#{url}/approximateTerm?term=value&maxEntries=value&option=value",
|
14
|
+
"#{url}/rxcui?idtype=yourIdtype&id=yourId&allsrc=0or1",
|
15
|
+
"#{url}/rxcui?name=yourName&srclist=yourSources&allsrc=0or1&search=0or1or2",
|
16
|
+
"#{url}/drugs?name=yourName",
|
17
|
+
"#{url}/spellingsuggestions?name=yourName",
|
18
|
+
"#{url}/rxcui/{rxcui}/status",
|
19
|
+
"#{url}/rxcui/{rxcui}/properties",
|
20
|
+
"#{url}/rxcui/{rxcui}/property?propName=propName"
|
21
|
+
]
|
22
|
+
end
|
23
|
+
|
24
|
+
describe "#search_by_name" do
|
25
|
+
subject { RxNav::RxNorm.search_by_name "zocor" }
|
26
|
+
|
27
|
+
include_examples 'should be an array of', RxNav::Concept
|
28
|
+
end
|
29
|
+
|
30
|
+
describe "#find_rxcui_by_id" do
|
31
|
+
describe "NUI search" do
|
32
|
+
subject { RxNav::RxNorm.find_rxcui_by_id "NUI", "N0000148200" }
|
33
|
+
include_examples 'should be an array of', String
|
34
|
+
end
|
35
|
+
|
36
|
+
describe "NDC search" do
|
37
|
+
subject { RxNav::RxNorm.find_rxcui_by_id "NDC", "0781-1506-10" }
|
38
|
+
include_examples 'should be an array of', String
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
describe "#find_rxcui_by_name" do
|
43
|
+
subject { RxNav::RxNorm.find_rxcui_by_name "lipitor" }
|
44
|
+
include_examples 'should be an array of', String
|
45
|
+
end
|
46
|
+
|
47
|
+
describe "#find_drugs_by_name" do
|
48
|
+
let(:results) { RxNav::RxNorm.find_drugs_by_name "cymbalta" }
|
49
|
+
|
50
|
+
context "at the top level" do
|
51
|
+
subject { results }
|
52
|
+
include_examples 'should be an array of', Hash
|
53
|
+
end
|
54
|
+
|
55
|
+
context "first result" do
|
56
|
+
subject { results.first }
|
57
|
+
it { is_expected.to include(:name) }
|
58
|
+
it { is_expected.to include(:concepts) }
|
59
|
+
|
60
|
+
context 'name' do
|
61
|
+
subject { results.first[:name] }
|
62
|
+
it { is_expected.to be_kind_of(String) }
|
63
|
+
end
|
64
|
+
|
65
|
+
context 'concepts' do
|
66
|
+
subject { results.first[:concepts] }
|
67
|
+
include_examples 'should be an array of', RxNav::Concept
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
describe '#spelling_suggestions' do
|
73
|
+
subject { RxNav::RxNorm.spelling_suggestions "ambienn" }
|
74
|
+
|
75
|
+
include_examples 'should be an array of', String
|
76
|
+
end
|
77
|
+
|
78
|
+
describe "#status" do
|
79
|
+
subject { RxNav::RxNorm.status "105048" }
|
80
|
+
|
81
|
+
it { is_expected.to be_kind_of(OpenStruct) }
|
82
|
+
it { is_expected.to respond_to(:active?) }
|
83
|
+
it { is_expected.to respond_to(:remapped?) }
|
84
|
+
end
|
85
|
+
|
86
|
+
describe "#properties" do
|
87
|
+
subject { RxNav::RxNorm.properties "131725" }
|
88
|
+
|
89
|
+
it { is_expected.to be_kind_of(OpenStruct) }
|
90
|
+
end
|
91
|
+
|
92
|
+
end
|
data/spec/spec_helper.rb
ADDED
data/spec/support/api.rb
ADDED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rx_nav
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jonathan Bender
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2015-02-02 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: nori
|
@@ -66,6 +66,20 @@ dependencies:
|
|
66
66
|
- - ">="
|
67
67
|
- !ruby/object:Gem::Version
|
68
68
|
version: '0'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: rspec
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - ">="
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: 2.0.0
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - ">="
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: 2.0.0
|
69
83
|
description: Ruby wrappers for the RxNav RESTful APIs
|
70
84
|
email:
|
71
85
|
- jlbender@gmail.com
|
@@ -75,6 +89,7 @@ extra_rdoc_files: []
|
|
75
89
|
files:
|
76
90
|
- ".gitignore"
|
77
91
|
- Gemfile
|
92
|
+
- Guardfile
|
78
93
|
- LICENSE.txt
|
79
94
|
- README.md
|
80
95
|
- Rakefile
|
@@ -86,6 +101,13 @@ files:
|
|
86
101
|
- lib/rx_nav/rx_terms.rb
|
87
102
|
- lib/rx_nav/version.rb
|
88
103
|
- rx_nav.gemspec
|
104
|
+
- spec/concept_spec.rb
|
105
|
+
- spec/ndfrt_spec.rb
|
106
|
+
- spec/rx_nav_spec.rb
|
107
|
+
- spec/rx_norm_spec.rb
|
108
|
+
- spec/spec_helper.rb
|
109
|
+
- spec/support/api.rb
|
110
|
+
- spec/support/array_type.rb
|
89
111
|
homepage: https://github.com/jbender/rx_nav_ruby
|
90
112
|
licenses:
|
91
113
|
- MIT
|
@@ -106,8 +128,15 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
106
128
|
version: '0'
|
107
129
|
requirements: []
|
108
130
|
rubyforge_project:
|
109
|
-
rubygems_version: 2.2.
|
131
|
+
rubygems_version: 2.2.2
|
110
132
|
signing_key:
|
111
133
|
specification_version: 4
|
112
134
|
summary: Ruby-based way of interacting with the RxNav APIs (http://rxnav.nlm.nih.gov/APIsOverview.html)
|
113
|
-
test_files:
|
135
|
+
test_files:
|
136
|
+
- spec/concept_spec.rb
|
137
|
+
- spec/ndfrt_spec.rb
|
138
|
+
- spec/rx_nav_spec.rb
|
139
|
+
- spec/rx_norm_spec.rb
|
140
|
+
- spec/spec_helper.rb
|
141
|
+
- spec/support/api.rb
|
142
|
+
- spec/support/array_type.rb
|