lifen_fhir 0.1.1 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.ruby-version +1 -1
- data/CHANGELOG.md +5 -0
- data/Gemfile.lock +1 -1
- data/README.md +11 -0
- data/lib/lifen_fhir/address.rb +29 -0
- data/lib/lifen_fhir/patient.rb +74 -4
- data/lib/lifen_fhir/version.rb +1 -1
- data/lib/lifen_fhir.rb +1 -0
- data/spec/cassettes/patient/create/with_all_information.yml +69 -0
- data/spec/cassettes/patient/find/with_valid_id.yml +81 -0
- data/spec/cassettes/patient/find/with_wrong_id.yml +64 -0
- data/spec/communication_request_spec.rb +1 -1
- data/spec/patient_spec.rb +59 -0
- metadata +12 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 9f98c168e0842426a55c637ba522c9dab7676c55
|
4
|
+
data.tar.gz: ce0fdeb504d1a29c9772be8e9b7475fbf40731b2
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 519aebce8e4b8f2241a2adf538334866ad5d5fd01a87a3aa1d76259de25c754ac46a7cdb6545ffbdbf2c5e711bdb474cffde012a404a75b5bacc401be9c1c80e
|
7
|
+
data.tar.gz: 63935aa6a344360bc8ea69eb3114e11731011fb6ed14f9d5ebf8020ce4e466af2b8b05876665fe90bd34713534341c450c0217844a180131dc9f01c3898ccdab
|
data/.ruby-version
CHANGED
@@ -1 +1 @@
|
|
1
|
-
2.
|
1
|
+
2.3.2
|
data/CHANGELOG.md
CHANGED
data/Gemfile.lock
CHANGED
data/README.md
CHANGED
@@ -94,6 +94,17 @@ channel = recipient.create_address(type: "address", lines: ["39 rue Aboukir"], c
|
|
94
94
|
channel = recipient.create_telecom(type: "telecom", system: "fax", value: "+33102030405")
|
95
95
|
```
|
96
96
|
|
97
|
+
#### Managing Patients
|
98
|
+
|
99
|
+
```ruby
|
100
|
+
# To create a new patient
|
101
|
+
address = LifenFhir::Address.new(lines: ["39 rue d'Aboukir"], city: "Paris", postal_code: "75002")
|
102
|
+
patient = LifenFhir::Patient.create(first_name: ["Jean", "Charles"], last_name: "Dupond", birth_date: Date.new(1974, 12, 25), address: address)
|
103
|
+
|
104
|
+
# To find a patient by id
|
105
|
+
patient = LifenFhir::Patient.find_by_uuid("c3f96278-3bfe-4933-96e7-171ebca7489f")
|
106
|
+
```
|
107
|
+
|
97
108
|
## Deploying to Rubygems
|
98
109
|
|
99
110
|
Once the new version is validated, the deployment follows those steps :
|
@@ -0,0 +1,29 @@
|
|
1
|
+
module LifenFhir
|
2
|
+
class Address < Base
|
3
|
+
|
4
|
+
attribute :uuid, String
|
5
|
+
|
6
|
+
attribute :lines, [String]
|
7
|
+
attribute :postal_code, String
|
8
|
+
attribute :city, String
|
9
|
+
|
10
|
+
def attributes_from_json(json)
|
11
|
+
self.lines = Array(json.fetch("line"))
|
12
|
+
|
13
|
+
self.postal_code = json.fetch("postalCode")
|
14
|
+
|
15
|
+
self.city = json.fetch("city")
|
16
|
+
|
17
|
+
self
|
18
|
+
end
|
19
|
+
|
20
|
+
def create_payload
|
21
|
+
{
|
22
|
+
"line": lines,
|
23
|
+
"city": city,
|
24
|
+
"postalCode": postal_code
|
25
|
+
}
|
26
|
+
end
|
27
|
+
|
28
|
+
end
|
29
|
+
end
|
data/lib/lifen_fhir/patient.rb
CHANGED
@@ -1,9 +1,34 @@
|
|
1
1
|
module LifenFhir
|
2
2
|
class Patient < Base
|
3
3
|
|
4
|
-
attribute :
|
4
|
+
attribute :uuid, String
|
5
|
+
|
6
|
+
attribute :first_name, [String]
|
5
7
|
attribute :last_name, String
|
6
|
-
attribute :
|
8
|
+
attribute :birth_date, Date
|
9
|
+
|
10
|
+
attribute :address, Address
|
11
|
+
|
12
|
+
def self.create(params)
|
13
|
+
new(params).save
|
14
|
+
end
|
15
|
+
|
16
|
+
def save
|
17
|
+
json = application_client.post("fhir/Patient", create_payload)
|
18
|
+
|
19
|
+
self.uuid = json["id"]
|
20
|
+
|
21
|
+
self
|
22
|
+
end
|
23
|
+
|
24
|
+
def self.find_by_uuid(uuid)
|
25
|
+
json = application_client.get("fhir/Patient/#{uuid}")
|
26
|
+
|
27
|
+
patient = new
|
28
|
+
patient.attributes_from_json(json)
|
29
|
+
|
30
|
+
patient
|
31
|
+
end
|
7
32
|
|
8
33
|
def fhir_payload
|
9
34
|
{
|
@@ -19,9 +44,54 @@ module LifenFhir
|
|
19
44
|
]
|
20
45
|
}
|
21
46
|
],
|
22
|
-
birthDate:
|
47
|
+
birthDate: birth_date.to_s
|
23
48
|
}
|
24
49
|
end
|
25
50
|
|
51
|
+
def attributes_from_json(json)
|
52
|
+
self.uuid = json["id"]
|
53
|
+
|
54
|
+
full_name = Array(json["name"]).first
|
55
|
+
|
56
|
+
self.first_name = Array(full_name["given"])
|
57
|
+
self.last_name = full_name["family"]
|
58
|
+
|
59
|
+
self.birth_date = json["birthDate"]
|
60
|
+
|
61
|
+
address_json = json["address"].first
|
62
|
+
self.address = Address.new.attributes_from_json(address_json)
|
63
|
+
end
|
64
|
+
|
65
|
+
private
|
66
|
+
|
67
|
+
|
68
|
+
def create_payload
|
69
|
+
filtered_params = {"resourceType" => "Patient"}
|
70
|
+
|
71
|
+
filtered_params["name"] = [{
|
72
|
+
"family": last_name,
|
73
|
+
"given": first_name
|
74
|
+
}]
|
75
|
+
|
76
|
+
if address
|
77
|
+
filtered_params["address"] = [
|
78
|
+
address.create_payload
|
79
|
+
]
|
80
|
+
end
|
81
|
+
|
82
|
+
filtered_params["birthDate"] = birth_date.to_s
|
83
|
+
|
84
|
+
filtered_params
|
85
|
+
end
|
86
|
+
|
87
|
+
def application_client
|
88
|
+
@application_client ||= AppAuthenticatedClient.new
|
89
|
+
end
|
90
|
+
|
91
|
+
|
92
|
+
def self.application_client
|
93
|
+
@application_client ||= AppAuthenticatedClient.new
|
94
|
+
end
|
95
|
+
|
26
96
|
end
|
27
|
-
end
|
97
|
+
end
|
data/lib/lifen_fhir/version.rb
CHANGED
data/lib/lifen_fhir.rb
CHANGED
@@ -0,0 +1,69 @@
|
|
1
|
+
---
|
2
|
+
http_interactions:
|
3
|
+
- request:
|
4
|
+
method: post
|
5
|
+
uri: https://develop.lifen.fr/fhir/Patient
|
6
|
+
body:
|
7
|
+
encoding: UTF-8
|
8
|
+
string: '{"resourceType":"Patient","name":[{"family":"Potter","given":["Pierre","Henri"]}],"address":[{"line":["M
|
9
|
+
et Mme Potter","39 rue d''Aboukir"],"city":"paris","postalCode":"75002"}],"birthDate":"1974-12-25"}'
|
10
|
+
headers:
|
11
|
+
User-Agent:
|
12
|
+
- Faraday v0.12.1
|
13
|
+
Authorization:
|
14
|
+
- Bearer valid_application_access_token
|
15
|
+
Accept:
|
16
|
+
- application/json
|
17
|
+
Content-Type:
|
18
|
+
- application/json
|
19
|
+
Accept-Encoding:
|
20
|
+
- gzip;q=1.0,deflate;q=0.6,identity;q=0.3
|
21
|
+
response:
|
22
|
+
status:
|
23
|
+
code: 201
|
24
|
+
message: Created
|
25
|
+
headers:
|
26
|
+
Server:
|
27
|
+
- Apache-Coyote/1.1
|
28
|
+
X-B3-Sampled:
|
29
|
+
- '1'
|
30
|
+
X-B3-Spanid:
|
31
|
+
- db5383adf72065bc
|
32
|
+
X-B3-Traceid:
|
33
|
+
- db5383adf72065bc
|
34
|
+
X-Content-Type-Options:
|
35
|
+
- nosniff
|
36
|
+
X-Xss-Protection:
|
37
|
+
- 1; mode=block
|
38
|
+
Cache-Control:
|
39
|
+
- no-cache, no-store, max-age=0, must-revalidate
|
40
|
+
Pragma:
|
41
|
+
- no-cache
|
42
|
+
Expires:
|
43
|
+
- '0'
|
44
|
+
X-Powered-By:
|
45
|
+
- HAPI FHIR 2.4 REST Server (FHIR Server; FHIR 3.0.1/DSTU3)
|
46
|
+
Location:
|
47
|
+
- http://rc2.lifen.fr:10134/fhir/OperationOutcome/ab7002e2-f017-48a5-ae09-1e232dc7c726
|
48
|
+
Content-Type:
|
49
|
+
- application/json+fhir;charset=UTF-8
|
50
|
+
Transfer-Encoding:
|
51
|
+
- chunked
|
52
|
+
Date:
|
53
|
+
- Wed, 24 May 2017 13:52:59 GMT
|
54
|
+
body:
|
55
|
+
encoding: UTF-8
|
56
|
+
string: |-
|
57
|
+
{
|
58
|
+
"resourceType": "OperationOutcome",
|
59
|
+
"id": "ab7002e2-f017-48a5-ae09-1e232dc7c726",
|
60
|
+
"issue": [
|
61
|
+
{
|
62
|
+
"severity": "information",
|
63
|
+
"diagnostics": "Patient created."
|
64
|
+
}
|
65
|
+
]
|
66
|
+
}
|
67
|
+
http_version:
|
68
|
+
recorded_at: Wed, 24 May 2017 13:53:00 GMT
|
69
|
+
recorded_with: VCR 3.0.3
|
@@ -0,0 +1,81 @@
|
|
1
|
+
---
|
2
|
+
http_interactions:
|
3
|
+
- request:
|
4
|
+
method: get
|
5
|
+
uri: https://develop.lifen.fr/fhir/Patient/ab7002e2-f017-48a5-ae09-1e232dc7c726
|
6
|
+
body:
|
7
|
+
encoding: UTF-8
|
8
|
+
string: "{}"
|
9
|
+
headers:
|
10
|
+
User-Agent:
|
11
|
+
- Faraday v0.12.1
|
12
|
+
Authorization:
|
13
|
+
- Bearer valid_application_access_token
|
14
|
+
Accept:
|
15
|
+
- application/json
|
16
|
+
Accept-Encoding:
|
17
|
+
- gzip;q=1.0,deflate;q=0.6,identity;q=0.3
|
18
|
+
response:
|
19
|
+
status:
|
20
|
+
code: 200
|
21
|
+
message: OK
|
22
|
+
headers:
|
23
|
+
Server:
|
24
|
+
- Apache-Coyote/1.1
|
25
|
+
X-B3-Sampled:
|
26
|
+
- '1'
|
27
|
+
X-B3-Spanid:
|
28
|
+
- 218872f87cb44505
|
29
|
+
X-B3-Traceid:
|
30
|
+
- 218872f87cb44505
|
31
|
+
X-Content-Type-Options:
|
32
|
+
- nosniff
|
33
|
+
X-Xss-Protection:
|
34
|
+
- 1; mode=block
|
35
|
+
Cache-Control:
|
36
|
+
- no-cache, no-store, max-age=0, must-revalidate
|
37
|
+
Pragma:
|
38
|
+
- no-cache
|
39
|
+
Expires:
|
40
|
+
- '0'
|
41
|
+
X-Powered-By:
|
42
|
+
- HAPI FHIR 2.4 REST Server (FHIR Server; FHIR 3.0.1/DSTU3)
|
43
|
+
Location:
|
44
|
+
- http://rc2.lifen.fr:10134/fhir/Patient/ab7002e2-f017-48a5-ae09-1e232dc7c726
|
45
|
+
Content-Type:
|
46
|
+
- application/json+fhir;charset=UTF-8
|
47
|
+
Transfer-Encoding:
|
48
|
+
- chunked
|
49
|
+
Date:
|
50
|
+
- Wed, 24 May 2017 13:53:45 GMT
|
51
|
+
body:
|
52
|
+
encoding: UTF-8
|
53
|
+
string: |-
|
54
|
+
{
|
55
|
+
"resourceType": "Patient",
|
56
|
+
"id": "ab7002e2-f017-48a5-ae09-1e232dc7c726",
|
57
|
+
"name": [
|
58
|
+
{
|
59
|
+
"family": "Potter",
|
60
|
+
"given": [
|
61
|
+
"Pierre",
|
62
|
+
"Henri"
|
63
|
+
]
|
64
|
+
}
|
65
|
+
],
|
66
|
+
"birthDate": "1974-12-25",
|
67
|
+
"address": [
|
68
|
+
{
|
69
|
+
"line": [
|
70
|
+
"M et Mme Potter",
|
71
|
+
"39 rue d'Aboukir"
|
72
|
+
],
|
73
|
+
"city": "paris",
|
74
|
+
"postalCode": "75002",
|
75
|
+
"country": "France"
|
76
|
+
}
|
77
|
+
]
|
78
|
+
}
|
79
|
+
http_version:
|
80
|
+
recorded_at: Wed, 24 May 2017 13:53:46 GMT
|
81
|
+
recorded_with: VCR 3.0.3
|
@@ -0,0 +1,64 @@
|
|
1
|
+
---
|
2
|
+
http_interactions:
|
3
|
+
- request:
|
4
|
+
method: get
|
5
|
+
uri: https://develop.lifen.fr/fhir/Patient/wrong-uuid
|
6
|
+
body:
|
7
|
+
encoding: UTF-8
|
8
|
+
string: "{}"
|
9
|
+
headers:
|
10
|
+
User-Agent:
|
11
|
+
- Faraday v0.12.1
|
12
|
+
Authorization:
|
13
|
+
- Bearer valid_application_access_token
|
14
|
+
Accept:
|
15
|
+
- application/json
|
16
|
+
Accept-Encoding:
|
17
|
+
- gzip;q=1.0,deflate;q=0.6,identity;q=0.3
|
18
|
+
response:
|
19
|
+
status:
|
20
|
+
code: 404
|
21
|
+
message: Not Found
|
22
|
+
headers:
|
23
|
+
Server:
|
24
|
+
- Apache-Coyote/1.1
|
25
|
+
X-B3-Sampled:
|
26
|
+
- '1'
|
27
|
+
X-B3-Spanid:
|
28
|
+
- feefdc6792efdd5e
|
29
|
+
X-B3-Traceid:
|
30
|
+
- feefdc6792efdd5e
|
31
|
+
X-Content-Type-Options:
|
32
|
+
- nosniff
|
33
|
+
X-Xss-Protection:
|
34
|
+
- 1; mode=block
|
35
|
+
Cache-Control:
|
36
|
+
- no-cache, no-store, max-age=0, must-revalidate
|
37
|
+
Pragma:
|
38
|
+
- no-cache
|
39
|
+
Expires:
|
40
|
+
- '0'
|
41
|
+
X-Powered-By:
|
42
|
+
- HAPI FHIR 2.4 REST Server (FHIR Server; FHIR 3.0.1/DSTU3)
|
43
|
+
Content-Type:
|
44
|
+
- application/json+fhir;charset=UTF-8
|
45
|
+
Transfer-Encoding:
|
46
|
+
- chunked
|
47
|
+
Date:
|
48
|
+
- Wed, 24 May 2017 13:53:00 GMT
|
49
|
+
body:
|
50
|
+
encoding: UTF-8
|
51
|
+
string: |-
|
52
|
+
{
|
53
|
+
"resourceType": "OperationOutcome",
|
54
|
+
"issue": [
|
55
|
+
{
|
56
|
+
"severity": "error",
|
57
|
+
"code": "processing",
|
58
|
+
"diagnostics": "Resource Patient/wrong-uuid is not known"
|
59
|
+
}
|
60
|
+
]
|
61
|
+
}
|
62
|
+
http_version:
|
63
|
+
recorded_at: Wed, 24 May 2017 13:53:00 GMT
|
64
|
+
recorded_with: VCR 3.0.3
|
@@ -15,7 +15,7 @@ describe LifenFhir::CommunicationRequest do
|
|
15
15
|
|
16
16
|
let(:attachment) { LifenFhir::Attachment.new(title: "Master Plan", path: File.dirname(__FILE__) + "/support/master_plan.pdf", content_type: "application/pdf") }
|
17
17
|
|
18
|
-
let(:patient) { LifenFhir::Patient.new(first_name: "Jean", last_name: "Dupond",
|
18
|
+
let(:patient) { LifenFhir::Patient.new(first_name: "Jean", last_name: "Dupond", birth_date: Date.new(2000,1,1)) }
|
19
19
|
|
20
20
|
|
21
21
|
|
@@ -0,0 +1,59 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe LifenFhir::Patient do
|
4
|
+
|
5
|
+
describe ':create' do
|
6
|
+
|
7
|
+
it 'works' do
|
8
|
+
|
9
|
+
address = LifenFhir::Address.new(
|
10
|
+
lines: ["M et Mme Potter", "39 rue d'Aboukir"],
|
11
|
+
city:"paris",
|
12
|
+
postal_code: "75002"
|
13
|
+
)
|
14
|
+
|
15
|
+
patient = LifenFhir::Patient.new(
|
16
|
+
first_name: ["Pierre", "Henri"],
|
17
|
+
last_name: "Potter",
|
18
|
+
birth_date: Date.new(1974, 12, 25),
|
19
|
+
address: address
|
20
|
+
)
|
21
|
+
|
22
|
+
VCR.use_cassette "patient/create/with_all_information" do
|
23
|
+
patient.save
|
24
|
+
end
|
25
|
+
|
26
|
+
expect(patient.uuid).to eq("ab7002e2-f017-48a5-ae09-1e232dc7c726")
|
27
|
+
end
|
28
|
+
|
29
|
+
end
|
30
|
+
|
31
|
+
describe ':find_by_uuid' do
|
32
|
+
|
33
|
+
it 'works' do
|
34
|
+
VCR.use_cassette "patient/find/with_valid_id" do
|
35
|
+
@patient = LifenFhir::Patient.find_by_uuid("ab7002e2-f017-48a5-ae09-1e232dc7c726")
|
36
|
+
end
|
37
|
+
|
38
|
+
expect(@patient.last_name).to eq("Potter")
|
39
|
+
expect(@patient.first_name).to eq(["Pierre", "Henri"])
|
40
|
+
expect(@patient.birth_date).to eq(Date.new(1974, 12, 25))
|
41
|
+
|
42
|
+
address = @patient.address
|
43
|
+
|
44
|
+
expect(address.postal_code).to eq("75002")
|
45
|
+
expect(address.city).to eq("paris")
|
46
|
+
expect(address.lines.size).to eq(2)
|
47
|
+
end
|
48
|
+
|
49
|
+
it 'wrong uuid' do
|
50
|
+
|
51
|
+
VCR.use_cassette "patient/find/with_wrong_id" do
|
52
|
+
expect {
|
53
|
+
@patient = LifenFhir::Patient.find_by_uuid("wrong-uuid")
|
54
|
+
}.to raise_error LifenFhir::Error
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
end
|
59
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: lifen_fhir
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Leonard Sellam
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2017-05-
|
12
|
+
date: 2017-05-26 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: bundler
|
@@ -154,6 +154,7 @@ files:
|
|
154
154
|
- License.txt
|
155
155
|
- README.md
|
156
156
|
- lib/lifen_fhir.rb
|
157
|
+
- lib/lifen_fhir/address.rb
|
157
158
|
- lib/lifen_fhir/app_authenticated_client.rb
|
158
159
|
- lib/lifen_fhir/attachment.rb
|
159
160
|
- lib/lifen_fhir/base.rb
|
@@ -177,6 +178,9 @@ files:
|
|
177
178
|
- spec/cassettes/communication_request/send/invalid_medium.yml
|
178
179
|
- spec/cassettes/communication_request/send/valid_attributes.yml
|
179
180
|
- spec/cassettes/communication_request/send/valid_attributes_binary.yml
|
181
|
+
- spec/cassettes/patient/create/with_all_information.yml
|
182
|
+
- spec/cassettes/patient/find/with_valid_id.yml
|
183
|
+
- spec/cassettes/patient/find/with_wrong_id.yml
|
180
184
|
- spec/cassettes/practitionner/create_channel/address/old_valid_attributes.yml
|
181
185
|
- spec/cassettes/practitionner/create_channel/address/valid_attributes.yml
|
182
186
|
- spec/cassettes/practitionner/create_channel/telecom/valid_attributes.yml
|
@@ -185,6 +189,7 @@ files:
|
|
185
189
|
- spec/cassettes/practitionner/find_by_rpps/wrong_rpps.yml
|
186
190
|
- spec/category_spec.rb
|
187
191
|
- spec/communication_request_spec.rb
|
192
|
+
- spec/patient_spec.rb
|
188
193
|
- spec/practitionner_spec.rb
|
189
194
|
- spec/spec_helper.rb
|
190
195
|
- spec/support/master_plan.pdf
|
@@ -208,7 +213,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
208
213
|
version: '0'
|
209
214
|
requirements: []
|
210
215
|
rubyforge_project:
|
211
|
-
rubygems_version: 2.
|
216
|
+
rubygems_version: 2.5.2
|
212
217
|
signing_key:
|
213
218
|
specification_version: 4
|
214
219
|
summary: Lifen FHIR API Ruby client
|
@@ -219,6 +224,9 @@ test_files:
|
|
219
224
|
- spec/cassettes/communication_request/send/invalid_medium.yml
|
220
225
|
- spec/cassettes/communication_request/send/valid_attributes.yml
|
221
226
|
- spec/cassettes/communication_request/send/valid_attributes_binary.yml
|
227
|
+
- spec/cassettes/patient/create/with_all_information.yml
|
228
|
+
- spec/cassettes/patient/find/with_valid_id.yml
|
229
|
+
- spec/cassettes/patient/find/with_wrong_id.yml
|
222
230
|
- spec/cassettes/practitionner/create_channel/address/old_valid_attributes.yml
|
223
231
|
- spec/cassettes/practitionner/create_channel/address/valid_attributes.yml
|
224
232
|
- spec/cassettes/practitionner/create_channel/telecom/valid_attributes.yml
|
@@ -227,6 +235,7 @@ test_files:
|
|
227
235
|
- spec/cassettes/practitionner/find_by_rpps/wrong_rpps.yml
|
228
236
|
- spec/category_spec.rb
|
229
237
|
- spec/communication_request_spec.rb
|
238
|
+
- spec/patient_spec.rb
|
230
239
|
- spec/practitionner_spec.rb
|
231
240
|
- spec/spec_helper.rb
|
232
241
|
- spec/support/master_plan.pdf
|