renalware-forms 0.1.9 → 0.1.13

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 5df0b0ba9f2bb73e2a220a8b61d42265b1c3059d652fcfbf234df628baae092f
4
- data.tar.gz: 9e2659fd0d9a73acfa28ee84d314d205895b6e81c9ba20b83d554c888d17f972
3
+ metadata.gz: 181086d1ec5a5fc79aeb1f31ee96d41783421214068279e7685c32b0310b08c1
4
+ data.tar.gz: 124fa4c1c4b5f8a7a7c9aa6653b194f2ebd773664dded89be7a9c163681ae677
5
5
  SHA512:
6
- metadata.gz: dfd13861f1506b62a0f793e5b5447fcf9774255d50a80ec45aeaeef54d01e66afe8139fbd24386c4b2fa0e7f09ca56b3baa2177624a8d34ab9f4c8eefafa2b36
7
- data.tar.gz: 2cdef508e130f74ccb0e659ff6b37fe9bd016eb7a7209117983c6d704b992f5a321e9971a8d98dd91ed34b6bd55fbaa618fafb145069d498a8735ef1dcefc278
6
+ metadata.gz: 6f47a359295804dfd868b3af40a2370a5c40c8a3e0483aa2b73030d890791519eab1e750b59ffe72920562ccce5713ecea1284a9508b7dc26934768ef32ab81d
7
+ data.tar.gz: 138c530b7af35432e90d8a1a8cb4483dc69d0c0c6cfa0eab0901c7713e1d8849fd12c49a3bba31a9d41a4f38f16cc5ec278d124fb8b7f029f6a9907f9cfaca77
data/.gitignore ADDED
@@ -0,0 +1,8 @@
1
+ tmp/**/*
2
+ .byebug_history
3
+ .rubocop-https---raw-githubusercontent-com-airslie-styleguide-master-rubocop-yml
4
+ .overcommit.yml
5
+ pkg/renalware-forms-0.1.0.gem
6
+ coverage
7
+ pkg
8
+ .bundle
data/.rspec ADDED
@@ -0,0 +1 @@
1
+ --require spec_helper
data/.rubocop.yml ADDED
@@ -0,0 +1,63 @@
1
+ require:
2
+ - rubocop-rails
3
+ - rubocop-rspec
4
+ - rubocop-performance
5
+
6
+ # Note that the local default.yml is overwritten on CodeClimate with the contents of
7
+ # the remote rubocop.yml pulled from GitHub in a codeclimate prepare step.
8
+ inherit_from:
9
+ - default.yml
10
+
11
+ AllCops:
12
+ UseCache: true
13
+ TargetRubyVersion: 3.0
14
+ # Just defining the Exclude or Include keys here overwrites the settings in default.yml
15
+ # so we have to redefine the entire set
16
+ Exclude:
17
+ - "*.gemspec"
18
+ - "vendor/**/*"
19
+ - "bin/**/*"
20
+ - "lib/tasks/**/*"
21
+ - "db/**/*"
22
+ - "spec/dummy/bin/**/*"
23
+ - "spec/dummy/lib/tasks/**/*"
24
+ - "spec/dummy/db/**/*"
25
+ - "tmp/**/*"
26
+ - "spec/dummy/tmp/**/*"
27
+ - "vendor/bundle/**/*"
28
+ - "config/initializers/devise.rb"
29
+
30
+ Layout/LineLength:
31
+ Exclude:
32
+ - "spec/acceptance/renalware/steps/**/*"
33
+
34
+ Metrics/AbcSize:
35
+ Max: 50
36
+ RSpec/ExampleLength:
37
+ Max: 40
38
+ RSpec/NestedGroups:
39
+ Max: 4
40
+ RSpec/MultipleExpectations:
41
+ Max: 20
42
+ RSpec/DescribeClass:
43
+ Enabled: false
44
+ RSpec/ImplicitSubject:
45
+ Enabled: false
46
+ RSpec/DescribedClass:
47
+ Enabled: false
48
+ Performance/RedundantBlockCall:
49
+ Enabled: false
50
+ Style/NumericPredicate:
51
+ Enabled: false
52
+ RSpec/InstanceVariable:
53
+ Enabled: false
54
+ Metrics/MethodLength:
55
+ Max: 50
56
+ Rails/Date:
57
+ Enabled: false
58
+ Rails/TimeZone:
59
+ Enabled: false
60
+ Style/AsciiComments:
61
+ Enabled: false
62
+ Style/ZeroLengthPredicate:
63
+ Enabled: false
data/.ruby-version ADDED
@@ -0,0 +1 @@
1
+ 3.0.2
@@ -0,0 +1,51 @@
1
+ # Use the latest stable version of Semaphore 2.0 YML syntax:
2
+ version: v1.0
3
+ name: renalware-forms
4
+
5
+ agent:
6
+ machine:
7
+ type: e1-standard-2
8
+ os_image: ubuntu1804
9
+
10
+ blocks:
11
+ - name: Test setup
12
+ task:
13
+ jobs:
14
+ - name: bundle
15
+ commands:
16
+ - checkout
17
+ - cache restore gems-$SEMAPHORE_GIT_BRANCH-$(checksum Gemfile.lock),gems-$SEMAPHORE_GIT_BRANCH-,gems-master-
18
+ - sem-version ruby 3.0.2
19
+ - bundle install --deployment -j 4 --path vendor/bundle
20
+ - cache store gems-$SEMAPHORE_GIT_BRANCH-$(checksum Gemfile.lock) vendor/bundle
21
+
22
+ - name: Tests
23
+ task:
24
+ env_vars:
25
+ - name: RAILS_ENV
26
+ value: test
27
+
28
+ # This secret on semaphore contains the CC_TEST_REPORTER_ID ENV var
29
+ secrets:
30
+ - name: renalware-forms
31
+
32
+ prologue:
33
+ commands:
34
+ - checkout
35
+ - cache restore gems-$SEMAPHORE_GIT_BRANCH-$(checksum Gemfile.lock),gems-$SEMAPHORE_GIT_BRANCH-,gems-master-
36
+ - git submodule sync ; git submodule update --init
37
+ - curl -L https://codeclimate.com/downloads/test-reporter/test-reporter-latest-linux-amd64 > ./cc-test-reporter
38
+ - chmod +x ./cc-test-reporter
39
+ - ./cc-test-reporter before-build
40
+ - sem-version ruby 3.0.2
41
+ - bundle install --deployment --path vendor/bundle
42
+
43
+ jobs:
44
+ - name: RSpec tests
45
+ commands:
46
+ - bundle exec rspec --format progress
47
+
48
+ epilogue:
49
+ on_pass:
50
+ commands:
51
+ - ./cc-test-reporter after-build
data/CHANGELOG.md ADDED
@@ -0,0 +1,37 @@
1
+ # Change Log
2
+
3
+ All notable changes to this project will be documented in
4
+ this [changelog](http://keepachangelog.com/en/0.3.0/).
5
+ This project adheres to Semantic Versioning.
6
+
7
+ ## Unreleased
8
+ ### Added
9
+ ### Changed
10
+ ### Fixed
11
+
12
+ ## 0.1.11
13
+ 3 April 2020
14
+ ### Added
15
+ ### Changed
16
+ - Switched from Virtus to dry-types
17
+ ### Fixed
18
+
19
+ ## 0.1.7
20
+ 31 Mar 2020
21
+ ### Added
22
+ ### Changed
23
+ ### Fixed
24
+ - Remove unused homecare args
25
+
26
+ ## 0.1.6
27
+ 31 Mar 2020
28
+ ### Added
29
+ ### Changed
30
+ ### Fixed
31
+ - Support supplying a selected delivery frequency
32
+
33
+ ## 0.1.3
34
+ ### Added
35
+ ### Changed
36
+ ### Fixed
37
+ - Bring in allergies
data/Gemfile ADDED
@@ -0,0 +1,21 @@
1
+ source "https://rubygems.org"
2
+ git_source(:github) { |repo| "https://github.com/#{repo}.git" }
3
+
4
+ # Declare your gem's dependencies in renalware-forms.gemspec.
5
+ # Bundler will treat runtime dependencies like base dependencies, and
6
+ # development dependencies will be added by default to the :development group.
7
+ gemspec
8
+
9
+ # Declare any dependencies that are still in development here instead of in
10
+ # your gemspec. These might include edge Rails or gems from your path or
11
+ # Git. Remember to move these dependencies to your gemspec before releasing
12
+ # your gem to rubygems.org.
13
+
14
+ group :development, :test do
15
+ gem "byebug"
16
+ gem "rubocop"
17
+ gem "rubocop-performance"
18
+ gem "rubocop-rails"
19
+ gem "rubocop-rspec"
20
+ gem "simplecov", "~> 0.17.1"
21
+ end
data/Gemfile.lock ADDED
@@ -0,0 +1,141 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ renalware-forms (0.1.13)
5
+ activemodel
6
+ attr_extras (~> 6.2)
7
+ dry-struct
8
+ dry-types
9
+ prawn (~> 2.2)
10
+ prawn-table (~> 0.2)
11
+ rake
12
+
13
+ GEM
14
+ remote: https://rubygems.org/
15
+ specs:
16
+ Ascii85 (1.1.0)
17
+ activemodel (6.1.4.1)
18
+ activesupport (= 6.1.4.1)
19
+ activesupport (6.1.4.1)
20
+ concurrent-ruby (~> 1.0, >= 1.0.2)
21
+ i18n (>= 1.6, < 2)
22
+ minitest (>= 5.1)
23
+ tzinfo (~> 2.0)
24
+ zeitwerk (~> 2.3)
25
+ afm (0.2.2)
26
+ ast (2.4.2)
27
+ attr_extras (6.2.4)
28
+ byebug (11.1.3)
29
+ concurrent-ruby (1.1.9)
30
+ diff-lcs (1.4.4)
31
+ docile (1.4.0)
32
+ dry-configurable (0.13.0)
33
+ concurrent-ruby (~> 1.0)
34
+ dry-core (~> 0.6)
35
+ dry-container (0.9.0)
36
+ concurrent-ruby (~> 1.0)
37
+ dry-configurable (~> 0.13, >= 0.13.0)
38
+ dry-core (0.7.1)
39
+ concurrent-ruby (~> 1.0)
40
+ dry-inflector (0.2.1)
41
+ dry-logic (1.2.0)
42
+ concurrent-ruby (~> 1.0)
43
+ dry-core (~> 0.5, >= 0.5)
44
+ dry-struct (1.4.0)
45
+ dry-core (~> 0.5, >= 0.5)
46
+ dry-types (~> 1.5)
47
+ ice_nine (~> 0.11)
48
+ dry-types (1.5.1)
49
+ concurrent-ruby (~> 1.0)
50
+ dry-container (~> 0.3)
51
+ dry-core (~> 0.5, >= 0.5)
52
+ dry-inflector (~> 0.1, >= 0.1.2)
53
+ dry-logic (~> 1.0, >= 1.0.2)
54
+ hashery (2.1.2)
55
+ i18n (1.8.10)
56
+ concurrent-ruby (~> 1.0)
57
+ ice_nine (0.11.2)
58
+ json (2.5.1)
59
+ minitest (5.14.4)
60
+ parallel (1.21.0)
61
+ parser (3.0.2.0)
62
+ ast (~> 2.4.1)
63
+ pdf-core (0.9.0)
64
+ pdf-reader (2.5.0)
65
+ Ascii85 (~> 1.0)
66
+ afm (~> 0.2.1)
67
+ hashery (~> 2.0)
68
+ ruby-rc4
69
+ ttfunk
70
+ prawn (2.4.0)
71
+ pdf-core (~> 0.9.0)
72
+ ttfunk (~> 1.7)
73
+ prawn-table (0.2.2)
74
+ prawn (>= 1.3.0, < 3.0.0)
75
+ rack (2.2.3)
76
+ rainbow (3.0.0)
77
+ rake (13.0.6)
78
+ regexp_parser (2.1.1)
79
+ rexml (3.2.5)
80
+ rspec (3.10.0)
81
+ rspec-core (~> 3.10.0)
82
+ rspec-expectations (~> 3.10.0)
83
+ rspec-mocks (~> 3.10.0)
84
+ rspec-core (3.10.1)
85
+ rspec-support (~> 3.10.0)
86
+ rspec-expectations (3.10.1)
87
+ diff-lcs (>= 1.2.0, < 2.0)
88
+ rspec-support (~> 3.10.0)
89
+ rspec-mocks (3.10.2)
90
+ diff-lcs (>= 1.2.0, < 2.0)
91
+ rspec-support (~> 3.10.0)
92
+ rspec-support (3.10.2)
93
+ rubocop (1.22.1)
94
+ parallel (~> 1.10)
95
+ parser (>= 3.0.0.0)
96
+ rainbow (>= 2.2.2, < 4.0)
97
+ regexp_parser (>= 1.8, < 3.0)
98
+ rexml
99
+ rubocop-ast (>= 1.12.0, < 2.0)
100
+ ruby-progressbar (~> 1.7)
101
+ unicode-display_width (>= 1.4.0, < 3.0)
102
+ rubocop-ast (1.12.0)
103
+ parser (>= 3.0.1.1)
104
+ rubocop-performance (1.11.5)
105
+ rubocop (>= 1.7.0, < 2.0)
106
+ rubocop-ast (>= 0.4.0)
107
+ rubocop-rails (2.12.2)
108
+ activesupport (>= 4.2.0)
109
+ rack (>= 1.1)
110
+ rubocop (>= 1.7.0, < 2.0)
111
+ rubocop-rspec (2.5.0)
112
+ rubocop (~> 1.19)
113
+ ruby-progressbar (1.11.0)
114
+ ruby-rc4 (0.1.5)
115
+ simplecov (0.17.1)
116
+ docile (~> 1.1)
117
+ json (>= 1.8, < 3)
118
+ simplecov-html (~> 0.10.0)
119
+ simplecov-html (0.10.2)
120
+ ttfunk (1.7.0)
121
+ tzinfo (2.0.4)
122
+ concurrent-ruby (~> 1.0)
123
+ unicode-display_width (2.1.0)
124
+ zeitwerk (2.4.2)
125
+
126
+ PLATFORMS
127
+ ruby
128
+
129
+ DEPENDENCIES
130
+ byebug
131
+ pdf-reader
132
+ renalware-forms!
133
+ rspec
134
+ rubocop
135
+ rubocop-performance
136
+ rubocop-rails
137
+ rubocop-rspec
138
+ simplecov (~> 0.17.1)
139
+
140
+ BUNDLED WITH
141
+ 2.2.28
data/bin/rspec ADDED
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env ruby
2
+ require 'bundler/setup'
3
+ load Gem.bin_path('rspec-core', 'rspec')
data/default.yml ADDED
@@ -0,0 +1,6 @@
1
+ inherit_from:
2
+ - https://raw.githubusercontent.com/airslie/styleguide/master/rubocop.yml
3
+
4
+ # Don't add anything to this file other than the inherit_from above
5
+ # as this file is overwritten on CodeClimate with the contents of the above
6
+ # remote url which is downloaded in a CodeClimate prepare step.
@@ -6,3 +6,14 @@ module Renalware::Forms::Generic
6
6
  end
7
7
  end
8
8
  end
9
+
10
+ require_relative "v1/base"
11
+ require_relative "v1/allergies"
12
+ require_relative "v1/delivery_frequencies"
13
+ require_relative "v1/document"
14
+ require_relative "v1/footer"
15
+ require_relative "v1/heading"
16
+ require_relative "v1/medications"
17
+ require_relative "v1/patient_details"
18
+ require_relative "v1/prescription_durations"
19
+ require_relative "v1/signoff"
@@ -6,3 +6,5 @@ module Renalware::Forms
6
6
  end
7
7
  end
8
8
  end
9
+
10
+ require_relative "homecare/v1"
@@ -4,3 +4,5 @@ module Renalware::Forms
4
4
  module Generic
5
5
  end
6
6
  end
7
+
8
+ require_relative "generic/homecare"
@@ -1,58 +1,68 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require "virtus"
3
+ require "dry-types"
4
+ require "dry-struct"
4
5
  require "active_model"
5
6
 
6
7
  # rubocop:disable Metrics/ClassLength
7
8
  module Renalware::Forms
8
- class Homecare::Args
9
- include Virtus.model
9
+ module Types
10
+ include Dry.Types()
11
+ end
12
+
13
+ class Homecare::Args < Dry::Struct
10
14
  include ActiveModel::Validations
11
15
 
12
- class Medication
13
- include Virtus.model(strict: true)
16
+ class Medication < Dry::Struct
14
17
  include ActiveModel::Validations
15
18
 
16
- attribute :date, Date
17
- attribute :drug, String
18
- attribute :dose, String
19
- attribute :route, String
20
- attribute :frequency, String
19
+ attribute :date, Types::Params::Date
20
+ attribute :drug, Types::String
21
+ attribute :dose, Types::String
22
+ attribute :route, Types::String
23
+ attribute :frequency, Types::String
21
24
  end
22
25
 
23
26
  # The first 2 attrbutes are used to drive what PDF to build
24
- attribute :provider, String
25
- attribute :version, Integer
26
- attribute :title, String, default: ""
27
- attribute :given_name, String
28
- attribute :family_name, String
29
- attribute :nhs_number, String, default: ""
30
- attribute :born_on, Date
31
- attribute :modality, String, default: ""
32
- attribute :telephone, String, default: ""
33
- attribute :hospital_number, String, default: ""
34
- attribute :address, Array(String), default: []
35
- attribute :postcode, String, default: ""
36
- attribute :modality, String
37
- attribute :prescriber_name, String, default: ""
38
- attribute :prescription_date, Date
39
- attribute :hospital_name, String
40
- attribute :hospital_department, String
41
- attribute :hospital_address, Array[String]
42
- attribute :hospital_telephone, String
43
- attribute :po_number, String
44
- attribute :generated_at, DateTime
45
- attribute :no_known_allergies, Boolean
46
- attribute :allergies, Array[String]
47
- attribute :drug_type, String
48
- attribute :prescription_duration, String
49
- attribute :administration_device, String
50
- attribute :medications, Array[Medication]
51
- attribute :consultant, String
52
- attribute :delivery_frequencies, Array[String], default: ["3 months", "6 months"]
53
- attribute :prescription_durations, Array[String] # e.g. ["3 months", "6 months"]
54
- attribute :selected_prescription_duration, String # e.g. "3 months"
55
- attribute :selected_delivery_frequency, String # e.g. "6 months"
27
+ attribute :provider, Types::Coercible::String
28
+ attribute :version, Types::Coercible::Integer
29
+ attribute :title, Types::String.default("").optional
30
+ attribute :given_name, Types::String
31
+ attribute :family_name, Types::String
32
+ attribute :nhs_number, Types::String.default("").optional
33
+ attribute :born_on, Types::Params::Date
34
+ attribute :modality , Types::Coercible::String.optional
35
+ attribute :telephone, Types::String.default("").optional
36
+ attribute :hospital_number, Types::String.default("").optional
37
+ attribute :address, Types::Array.of(Types::Coercible::String).default([].dup, shared: true)
38
+ attribute :postcode, Types::String.default("").optional
39
+ attribute :prescriber_name, Types::String.default("").optional
40
+ # attribute :prescription_date, Types::Params::Date
41
+ attribute :hospital_name, Types::String.default("")
42
+ attribute :hospital_department, Types::String.default("").optional
43
+ attribute :hospital_address, Types::Array.of(Types::Coercible::String).default([], shared: true)
44
+ attribute :hospital_telephone, Types::String.default("").optional
45
+ attribute :po_number, Types::String.default("").optional
46
+ attribute :generated_at, (Types::Params::DateTime.default { DateTime.now })
47
+ attribute :no_known_allergies, Types::Bool.optional
48
+ attribute :allergies, Types::Array.of(Types::Coercible::String)
49
+ attribute :drug_type, Types::Coercible::String.optional
50
+ # attribute :prescription_duration, Types::String
51
+ attribute :administration_device, Types::String.default("").optional
52
+ attribute :medications, Types::Array.of(Medication).default([].dup, shared: true)
53
+ attribute :consultant, Types::String.default("").optional
54
+ attribute(
55
+ :delivery_frequencies,
56
+ Types::Array.of(Types::Coercible::String).default(["3 months", "6 months"].freeze)
57
+ )
58
+ attribute(
59
+ :prescription_durations,
60
+ Types::Array
61
+ .of(Types::Coercible::String)
62
+ .default(["3 months", "6 months", "12 months"].freeze)
63
+ )
64
+ attribute :selected_prescription_duration, Types::String.default("") # e.g. "6 months"
65
+ attribute :selected_delivery_frequency, Types::String.default("") # e.g. "6 months"
56
66
 
57
67
  validates :family_name, presence: true
58
68
  validates :given_name, presence: true
@@ -100,27 +110,26 @@ module Renalware::Forms
100
110
  end
101
111
 
102
112
  def self.test_data(provider: :generic, version: 1)
103
- new.tap do |args|
104
- args.provider = provider
105
- args.version = version
106
- args.title = "Mr"
107
- args.given_name = "Jack"
108
- args.family_name = "JONES"
109
- args.nhs_number = "0123456789"
110
- args.born_on = Date.parse("2001-01-01")
111
- args.telephone = "07000 000001"
112
- args.hospital_number = "ABC123"
113
- args.modality = "PD"
114
- args.address = ["line1", "", nil, "line2", "line3 "]
115
- args.postcode = "TW1 1UU"
116
- args.modality = "HD"
117
- args.prescriber_name = "Dr X Yz"
118
- args.prescription_date = Date.today.to_s
119
- args.consultant = "Dr Pepper"
120
- args.hospital_name = "THE ROYAL LONDON HOSPITAL"
121
- args.hospital_telephone = "0000 000001"
122
- args.hospital_department = "Renal"
123
- args.hospital_address = [
113
+ args = new(
114
+ provider: provider,
115
+ version: version,
116
+ title: "Mr",
117
+ given_name: "Jack",
118
+ family_name: "JONES",
119
+ nhs_number: "0123456789",
120
+ born_on: Date.parse("2001-01-01"),
121
+ telephone: "07000 000001",
122
+ hospital_number: "ABC123",
123
+ modality: "HD",
124
+ address: ["line1", "", nil, "line2", "line3 "],
125
+ postcode: "TW1 1UU",
126
+ prescriber_name: "Dr X Yz",
127
+ prescription_date: Date.today.to_s,
128
+ consultant: "Dr Pepper",
129
+ hospital_name: "THE ROYAL LONDON HOSPITAL",
130
+ hospital_telephone: "0000 000001",
131
+ hospital_department: "Renal",
132
+ hospital_address: [
124
133
  "The Royal London Hospital",
125
134
  "Barts Health NHS Trust",
126
135
  "Whitechapel",
@@ -129,30 +138,30 @@ module Renalware::Forms
129
138
  "UK",
130
139
  "Tel: 0800 00000000",
131
140
  "Another line"
132
-
133
- ]
134
- args.no_known_allergies = false
135
- args.allergies = ["Nuts", nil, "Penicillin", "Mown grass"]
136
- args.drug_type = "ESA"
137
- args.prescription_duration = "1 month"
138
- args.administration_device = "device?"
139
- args.po_number = "P123"
140
- args.generated_at = Time.now
141
- args.delivery_frequencies = ["1 week", "3 months", "6 months", "12 month"]
142
- args.prescription_durations = ["3 months", "6 months", "12 months"]
143
- args.selected_prescription_duration = "6 months"
144
- args.selected_delivery_frequency = "6 months"
145
-
146
- args.medications << Medication.new(
147
- date: Date.today,
148
- drug: "Example drug",
149
- dose: "1 unit",
150
- route: "PO",
151
- frequency: "3"
152
- )
153
-
154
- raise ArgumentError, args.errors unless args.valid?
155
- end
141
+ ],
142
+ no_known_allergies: false,
143
+ allergies: ["Nuts", nil, "Penicillin", "Mown grass"],
144
+ drug_type: "ESA",
145
+ prescription_duration: "1 month",
146
+ administration_device: "device?",
147
+ po_number: "P123",
148
+ delivery_frequencies: ["1 week", "3 months", "6 months", "12 month"],
149
+ prescription_durations: ["3 months", "6 months", "12 months"],
150
+ selected_prescription_duration: "6 months",
151
+ selected_delivery_frequency: "6 months"
152
+ )
153
+
154
+ args.medications << Medication.new(
155
+ date: Date.today,
156
+ drug: "Example drug",
157
+ dose: "1 unit",
158
+ route: "PO",
159
+ frequency: "3"
160
+ )
161
+
162
+ raise ArgumentError, args.errors unless args.valid?
163
+
164
+ args
156
165
  end
157
166
 
158
167
  def medications_are_present
@@ -1,10 +1,9 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require "prawn"
4
- require "prawn/table"
5
- require "attr_extras"
6
-
7
3
  module Renalware::Forms
8
4
  module Homecare
9
5
  end
10
6
  end
7
+
8
+ require_relative "homecare/args"
9
+ require_relative "homecare/pdf"
@@ -2,6 +2,6 @@
2
2
 
3
3
  module Renalware
4
4
  module Forms
5
- VERSION = "0.1.9"
5
+ VERSION = "0.1.13"
6
6
  end
7
7
  end
@@ -1,18 +1,15 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require "zeitwerk"
4
3
  require "prawn"
5
4
  require "prawn/table"
6
5
  require "attr_extras"
7
6
 
8
- # Set up autoloading with zeitwerk
9
- # As we are nested in lib/renalware/forms, be sure to push an absolute
10
- # path to the lib folder.
11
- loader = Zeitwerk::Loader.new
12
- loader.push_dir File.expand_path("../", __dir__)
13
- loader.setup
14
-
15
7
  module Renalware
16
8
  module Forms
17
9
  end
18
10
  end
11
+
12
+ require_relative "forms/base"
13
+ require_relative "forms/helpers"
14
+ require_relative "forms/generic"
15
+ require_relative "forms/homecare"
data/lib/tasks/tasks.rake CHANGED
@@ -1,4 +1,6 @@
1
+ # frozen_string_literal: true
2
+
1
3
  desc "Starts irb so we can debug the gem"
2
- task :console do
4
+ task console: :environment do
3
5
  exec "irb -r ./lib/renalware/forms"
4
6
  end
@@ -0,0 +1,33 @@
1
+ $:.push File.expand_path("lib", __dir__)
2
+
3
+ # Maintain your gem's version:
4
+ require "renalware/forms/version"
5
+
6
+ # Describe your gem and declare its dependencies:
7
+ Gem::Specification.new do |spec|
8
+ spec.name = "renalware-forms"
9
+ spec.version = Renalware::Forms::VERSION
10
+ spec.authors = ["Airslie Ltd"]
11
+ spec.email = ["dev@aisrlie.com"]
12
+ spec.homepage = "http://airslie.com"
13
+ spec.summary = "PDF library for Renalware forms"
14
+ spec.description = "The home for various forms for external providers e.g. home care prescriptions"
15
+ spec.license = "MIT"
16
+ spec.required_ruby_version = ">= 3.0.0"
17
+
18
+ spec.files = `git ls-files`.split("\n")
19
+ spec.test_files = `git ls-files -- {spec}/*`.split("\n")
20
+ spec.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
21
+ spec.require_paths = ["lib"]
22
+ spec.extra_rdoc_files = ["README.md"]
23
+
24
+ spec.add_dependency "activemodel"
25
+ spec.add_dependency "attr_extras", "~> 6.2"
26
+ spec.add_dependency "prawn", "~> 2.2"
27
+ spec.add_dependency "prawn-table", "~> 0.2"
28
+ spec.add_dependency "rake"
29
+ spec.add_dependency "dry-types"
30
+ spec.add_dependency "dry-struct"
31
+ spec.add_development_dependency "rspec"
32
+ spec.add_development_dependency "pdf-reader"
33
+ end
@@ -0,0 +1,30 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "spec_helper"
4
+
5
+ module Renalware::Forms::Homecare
6
+ RSpec.describe Args do
7
+ describe "#patient_name" do
8
+ subject {
9
+ hash = default_test_arg_values.update(
10
+ given_name: "John",
11
+ family_name: "SMITH",
12
+ title: title
13
+ )
14
+ described_class.new(hash).patient_name
15
+ }
16
+
17
+ context "when title present" do
18
+ let(:title) { "Mr" }
19
+
20
+ it { is_expected.to eq("SMITH, John (Mr)") }
21
+ end
22
+
23
+ context "when title missing" do
24
+ let(:title) { "" }
25
+
26
+ it { is_expected.to eq("SMITH, John") }
27
+ end
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,38 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "spec_helper"
4
+
5
+ module Renalware::Forms::Generic
6
+ RSpec.describe Homecare::V1::Allergies do
7
+ context "when the patient has iit recoreded that they have no known allergies" do
8
+ it do
9
+ hash = default_test_arg_values.update(no_known_allergies: true)
10
+ args = Renalware::Forms::Homecare::Args.new(hash)
11
+ doc = test_prawn_doc
12
+
13
+ described_class.new(doc, args).build
14
+
15
+ text = extract_text_from_prawn_doc(doc)
16
+ expect(text).to include("No Known Allergies")
17
+ end
18
+ end
19
+
20
+ it do
21
+ hash = default_test_arg_values.update(
22
+ no_known_allergies: false,
23
+ allergies: %w(nuts penicillin)
24
+ )
25
+ args = Renalware::Forms::Homecare::Args.new(hash)
26
+ doc = test_prawn_doc
27
+
28
+ described_class.new(doc, args).build
29
+
30
+ text = extract_text_from_prawn_doc(doc)
31
+
32
+ expect(text).not_to include("No Known Allergies")
33
+ expect(text).to include("Known Allergies")
34
+ expect(text).to include("nuts")
35
+ expect(text).to include("penicillin")
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,53 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "spec_helper"
4
+
5
+ module Renalware::Forms::Generic
6
+ RSpec.describe Homecare::V1::DeliveryFrequencies do
7
+ def extract_pdf_text(args)
8
+ doc = test_prawn_doc
9
+ described_class.new(doc, args).build
10
+ extract_text_from_prawn_doc(doc)
11
+ end
12
+
13
+ it do
14
+ hash = default_test_arg_values.update(delivery_frequencies: ["Once", "3 weeks", "6 weeks"])
15
+ args = Renalware::Forms::Homecare::Args.new(hash)
16
+
17
+ text = extract_pdf_text(args)
18
+
19
+ expect(text).to include("Frequency of deliveries")
20
+ expect(text).to match(/❏ +Once/)
21
+ expect(text).to match(/❏ +3 weeks/)
22
+ expect(text).to match(/❏ +6 weeks/)
23
+ end
24
+
25
+ context "when there are no frequencies supplied" do
26
+ it "displays the defaults" do
27
+ args = Renalware::Forms::Homecare::Args.new(**default_test_arg_values)
28
+
29
+ text = extract_pdf_text(args)
30
+
31
+ expect(text).to match(/Frequency of deliveries/)
32
+ expect(text).to match(/❏ +3 months/)
33
+ expect(text).to match(/❏ +6 months/)
34
+ end
35
+ end
36
+
37
+ context "when there is a selected delivery_frequency" do
38
+ it "indicates that frequency has been selected by checking a box" do
39
+ hash = default_test_arg_values.update(
40
+ delivery_frequencies: ["3 months", "6 months", "12 months"],
41
+ selected_delivery_frequency: "6 months"
42
+ )
43
+ args = Renalware::Forms::Homecare::Args.new(hash)
44
+
45
+ text = extract_pdf_text(args)
46
+
47
+ expect(text).to match(/❏ +3 months/)
48
+ expect(text).to match(/■ +6 months/)
49
+ expect(text).to match(/❏ +12 months/)
50
+ end
51
+ end
52
+ end
53
+ end
@@ -0,0 +1,26 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "spec_helper"
4
+
5
+ module Renalware::Forms::Generic
6
+ RSpec.describe Homecare::V1::Heading do
7
+ it do
8
+ hash = default_test_arg_values.update(
9
+ po_number: "P123",
10
+ hospital_number: "H123",
11
+ drug_type: "ESA"
12
+ )
13
+ args = Renalware::Forms::Homecare::Args.new(hash)
14
+ doc = test_prawn_doc
15
+
16
+ described_class.new(doc, args).build
17
+
18
+ text = extract_text_from_prawn_doc(doc)
19
+
20
+ expect(text).to include(args.po_number)
21
+ expect(text).to include(args.hospital_number)
22
+ expect(text).to include(args.drug_type)
23
+ expect(text).to include("Home Delivery Medication List")
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,37 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "spec_helper"
4
+
5
+ module Renalware::Forms::Generic
6
+ RSpec.describe Homecare::V1::Medications do
7
+ it do
8
+ args = Renalware::Forms::Homecare::Args.new(**default_test_arg_values)
9
+ args.medications << Renalware::Forms::Homecare::Args::Medication.new(
10
+ date: "2020-01-01",
11
+ drug: "Drug1",
12
+ dose: "Dose1",
13
+ route: "Route1",
14
+ frequency: "Freq1"
15
+ )
16
+ args.medications << Renalware::Forms::Homecare::Args::Medication.new(
17
+ date: "2020-02-02",
18
+ drug: "Drug2",
19
+ dose: "Dose2",
20
+ route: "Route2",
21
+ frequency: "Freq2"
22
+ )
23
+ doc = test_prawn_doc
24
+
25
+ described_class.new(doc, args).build
26
+
27
+ text = extract_text_from_prawn_doc(doc)
28
+
29
+ expect(text).to include("2020-01-01")
30
+ expect(text).to include("Drug1")
31
+ expect(text).to include("Dose1")
32
+ expect(text).to include("Route1")
33
+ expect(text).to include("Freq1")
34
+ expect(text).to include("Drug2")
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,37 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "spec_helper"
4
+
5
+ module Renalware::Forms::Generic
6
+ RSpec.describe Homecare::V1::PatientDetails do
7
+ it do
8
+ hash = default_test_arg_values.update(
9
+ given_name: "John",
10
+ family_name: "SMITH",
11
+ title: "Mr",
12
+ modality: "HD",
13
+ born_on: "2001-01-01",
14
+ nhs_number: "0123456789",
15
+ hospital_number: "X123",
16
+ address: %w(aa bb cc),
17
+ postcode: "POSTCODE"
18
+ )
19
+ args = Renalware::Forms::Homecare::Args.new(hash)
20
+ doc = test_prawn_doc
21
+
22
+ described_class.new(doc, args).build
23
+
24
+ text = extract_text_from_prawn_doc(doc)
25
+
26
+ expect(text).to include("SMITH, John (Mr)")
27
+ expect(text).to include("HD")
28
+ expect(text).to include("2001-01-01")
29
+ expect(text).to include("0123456789")
30
+ expect(text).to include("X123")
31
+ expect(text).to include("aa")
32
+ expect(text).to include("bb")
33
+ expect(text).to include("cc")
34
+ expect(text).to include("POSTCODE")
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,52 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "spec_helper"
4
+
5
+ module Renalware::Forms::Generic
6
+ RSpec.describe Homecare::V1::PrescriptionDurations do
7
+ def extract_pdf_text(args)
8
+ doc = test_prawn_doc
9
+ described_class.new(doc, args).build
10
+ extract_text_from_prawn_doc(doc)
11
+ end
12
+
13
+ it do
14
+ hash = default_test_arg_values.update(
15
+ prescription_durations: ["3 months", "6 months", "12 months"]
16
+ )
17
+ args = Renalware::Forms::Homecare::Args.new(hash)
18
+
19
+ text = extract_pdf_text(args)
20
+
21
+ expect(text).to include("Repeat prescription for")
22
+ expect(text).to match(/❏ +3 months/)
23
+ expect(text).to match(/❏ +6 months/)
24
+ expect(text).to match(/❏ +12 months/)
25
+ end
26
+
27
+ it "works where there are no prescription_durations supplied" do
28
+ args = Renalware::Forms::Homecare::Args.new(default_test_arg_values)
29
+
30
+ text = extract_pdf_text(args)
31
+
32
+ expect(text).to include("Repeat prescription for")
33
+ end
34
+
35
+ context "when there is a selected prescription_duration" do
36
+ it "indicates that duration has been selected eg for checking a box" do
37
+ args = Renalware::Forms::Homecare::Args.new(
38
+ default_test_arg_values.update(
39
+ prescription_durations: ["3 months", "6 months", "12 months"],
40
+ selected_prescription_duration: "6 months"
41
+ )
42
+ )
43
+
44
+ text = extract_pdf_text(args)
45
+
46
+ expect(text).to match(/❏ +3 months/)
47
+ expect(text).to match(/■ +6 months/)
48
+ expect(text).to match(/❏ +12 months/)
49
+ end
50
+ end
51
+ end
52
+ end
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "spec_helper"
4
+
5
+ module Renalware::Forms::Generic
6
+ RSpec.describe Homecare::V1::Signoff do
7
+ it do
8
+ args = Renalware::Forms::Homecare::Args.new(
9
+ **default_test_arg_values.update(consultant: "Dr Pepper")
10
+ )
11
+ doc = test_prawn_doc
12
+
13
+ described_class.new(doc, args).build
14
+
15
+ text = extract_text_from_prawn_doc(doc)
16
+ expect(text).to include("Dr Pepper")
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,71 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "spec_helper"
4
+
5
+ RSpec.describe Renalware::Forms::Homecare::Pdf do
6
+ describe "#generate" do
7
+ # describe "argument validation" do
8
+ # it "throws an error if args is nil" do
9
+ # expect { described_class.generate(nil) }.to raise_error(ArgumentError)
10
+ # end
11
+
12
+ # it "throws an error if arg.provider is nil" do
13
+ # args = Renalware::Forms::Homecare::Args.new(provider: nil)
14
+
15
+ # expect {
16
+ # described_class.generate(args)
17
+ # }.to raise_error(ArgumentError, "Missing provider")
18
+ # end
19
+
20
+ # it "throws an error if arg.provider is an empty string" do
21
+ # args = Renalware::Forms::Homecare::Args.new(provider: "")
22
+
23
+ # expect {
24
+ # described_class.generate(args)
25
+ # }.to raise_error(ArgumentError, "Missing provider")
26
+ # end
27
+
28
+ # it "throws an error if arg.version is not a number" do
29
+ # args = Renalware::Forms::Homecare::Args.new(provider: :a, version: nil)
30
+
31
+ # expect {
32
+ # described_class.generate(args)
33
+ # }.to raise_error(ArgumentError, "Version must be >0")
34
+ # end
35
+
36
+ # it "throws an error no matching provider found" do
37
+ # args = Renalware::Forms::Homecare::Args.new(provider: :generico, version: 1)
38
+
39
+ # expect {
40
+ # described_class.generate(args)
41
+ # }.to raise_error(
42
+ # ArgumentError,
43
+ # "No PDF forms found for provider=generico version=1 "\
44
+ # "trying to resolve Renalware::Forms::Generico::Homecare::V1::Document"
45
+ # )
46
+ # end
47
+
48
+ # it "throws an error no matching version found" do
49
+ # args = Renalware::Forms::Homecare::Args.new(provider: :generic, version: 1000)
50
+
51
+ # expect {
52
+ # described_class.generate(args)
53
+ # }.to raise_error(
54
+ # ArgumentError,
55
+ # "No PDF forms found for provider=generic version=1000 "\
56
+ # "trying to resolve Renalware::Forms::Generic::Homecare::V1000::Document"
57
+ # )
58
+ # end
59
+ # end
60
+
61
+ context "when arguments are valid" do
62
+ it "create render a PDF for a Generic::Homecare::V1::Document" do
63
+ args = Renalware::Forms::Homecare::Args.new(**default_test_arg_values)
64
+
65
+ pdf_data = described_class.generate(args).render
66
+
67
+ expect(pdf_data).to start_with("%PDF-")
68
+ end
69
+ end
70
+ end
71
+ end
@@ -0,0 +1,78 @@
1
+ # frozen_string_literal: true
2
+
3
+ # This file was generated by the `rspec --init` command. Conventionally, all
4
+ # specs live under a `spec` directory, which RSpec adds to the `$LOAD_PATH`.
5
+ # The generated `.rspec` file contains `--require spec_helper` which will cause
6
+ # this file to always be loaded, without a need to explicitly require it in any
7
+ # files.
8
+ #
9
+ # Given that it is always loaded, you are encouraged to keep this file as
10
+ # light-weight as possible. Requiring heavyweight dependencies from this file
11
+ # will add to the boot time of your test suite on EVERY test run, even for an
12
+ # individual file that may not need all of that loaded. Instead, consider making
13
+ # a separate helper file that requires the additional dependencies and performs
14
+ # the additional setup, and require it from the spec files that actually need
15
+ # it.
16
+
17
+ require "simplecov"
18
+ SimpleCov.start
19
+
20
+ require "tempfile"
21
+ require "pdf-reader"
22
+ require "./lib/renalware/forms"
23
+
24
+ def pdf_reader_from(prawn_doc)
25
+ file = Tempfile.new("pdf")
26
+ prawn_doc.render_file file
27
+ PDF::Reader.new(file)
28
+ end
29
+
30
+ def test_prawn_doc
31
+ Prawn::Document.new(
32
+ page_size: "A4",
33
+ page_layout: :portrait,
34
+ margin: 15
35
+ )
36
+ end
37
+
38
+ def default_test_arg_values
39
+ {
40
+ provider: :generic,
41
+ version: 1,
42
+ modality: "HD",
43
+ telephone: "",
44
+ hospital_number: nil,
45
+ nhs_number: nil,
46
+ consultant: nil,
47
+ postcode: nil,
48
+ hospital_department: nil,
49
+ hospital_telephone: nil,
50
+ prescriber_name: nil,
51
+ po_number: "134",
52
+ administration_device: nil,
53
+ given_name: "John",
54
+ family_name: "SMITH",
55
+ title: "Mr",
56
+ no_known_allergies: true,
57
+ allergies: [],
58
+ drug_type: :esa,
59
+ born_on: "2019-01-01",
60
+ prescription_date: "2019-01-01"
61
+ }.dup
62
+ end
63
+
64
+ def extract_text_from_prawn_doc(doc)
65
+ pdf_reader_from(doc).pages.map(&:text).join
66
+ end
67
+
68
+ # See http://rubydoc.info/gems/rspec-core/RSpec/Core/Configuration
69
+ RSpec.configure do |config|
70
+ config.expect_with :rspec do |expectations|
71
+ expectations.include_chain_clauses_in_custom_matcher_descriptions = true
72
+ end
73
+
74
+ config.mock_with :rspec do |mocks|
75
+ mocks.verify_partial_doubles = true
76
+ end
77
+ config.shared_context_metadata_behavior = :apply_to_host_groups
78
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: renalware-forms
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.9
4
+ version: 0.1.13
5
5
  platform: ruby
6
6
  authors:
7
7
  - Airslie Ltd
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-04-02 00:00:00.000000000 Z
11
+ date: 2021-10-06 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activemodel
@@ -81,21 +81,21 @@ dependencies:
81
81
  - !ruby/object:Gem::Version
82
82
  version: '0'
83
83
  - !ruby/object:Gem::Dependency
84
- name: virtus
84
+ name: dry-types
85
85
  requirement: !ruby/object:Gem::Requirement
86
86
  requirements:
87
- - - "~>"
87
+ - - ">="
88
88
  - !ruby/object:Gem::Version
89
- version: '1.0'
89
+ version: '0'
90
90
  type: :runtime
91
91
  prerelease: false
92
92
  version_requirements: !ruby/object:Gem::Requirement
93
93
  requirements:
94
- - - "~>"
94
+ - - ">="
95
95
  - !ruby/object:Gem::Version
96
- version: '1.0'
96
+ version: '0'
97
97
  - !ruby/object:Gem::Dependency
98
- name: zeitwerk
98
+ name: dry-struct
99
99
  requirement: !ruby/object:Gem::Requirement
100
100
  requirements:
101
101
  - - ">="
@@ -139,13 +139,25 @@ dependencies:
139
139
  description: The home for various forms for external providers e.g. home care prescriptions
140
140
  email:
141
141
  - dev@aisrlie.com
142
- executables: []
142
+ executables:
143
+ - rspec
143
144
  extensions: []
144
- extra_rdoc_files: []
145
+ extra_rdoc_files:
146
+ - README.md
145
147
  files:
148
+ - ".gitignore"
149
+ - ".rspec"
150
+ - ".rubocop.yml"
151
+ - ".ruby-version"
152
+ - ".semaphore/semaphore.yml"
153
+ - CHANGELOG.md
154
+ - Gemfile
155
+ - Gemfile.lock
146
156
  - MIT-LICENSE
147
157
  - README.md
148
158
  - Rakefile
159
+ - bin/rspec
160
+ - default.yml
149
161
  - lib/renalware/forms.rb
150
162
  - lib/renalware/forms/base.rb
151
163
  - lib/renalware/forms/generic.rb
@@ -169,6 +181,17 @@ files:
169
181
  - lib/renalware/forms/version.rb
170
182
  - lib/tasks/homecare.rake
171
183
  - lib/tasks/tasks.rake
184
+ - renalware-forms.gemspec
185
+ - spec/renalware/forms/args_spec.rb
186
+ - spec/renalware/forms/homecare/generic/v1/allergies_spec.rb
187
+ - spec/renalware/forms/homecare/generic/v1/delivery_frequencies_spec.rb
188
+ - spec/renalware/forms/homecare/generic/v1/heading_spec.rb
189
+ - spec/renalware/forms/homecare/generic/v1/mediations_spec.rb
190
+ - spec/renalware/forms/homecare/generic/v1/patient_details_spec.rb
191
+ - spec/renalware/forms/homecare/generic/v1/prescription_durations_spec.rb
192
+ - spec/renalware/forms/homecare/generic/v1/signoff_spec.rb
193
+ - spec/renalware/forms/homecare/pdf_spec.rb
194
+ - spec/spec_helper.rb
172
195
  homepage: http://airslie.com
173
196
  licenses:
174
197
  - MIT
@@ -181,14 +204,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
181
204
  requirements:
182
205
  - - ">="
183
206
  - !ruby/object:Gem::Version
184
- version: '0'
207
+ version: 3.0.0
185
208
  required_rubygems_version: !ruby/object:Gem::Requirement
186
209
  requirements:
187
210
  - - ">="
188
211
  - !ruby/object:Gem::Version
189
212
  version: '0'
190
213
  requirements: []
191
- rubygems_version: 3.0.3
214
+ rubygems_version: 3.2.22
192
215
  signing_key:
193
216
  specification_version: 4
194
217
  summary: PDF library for Renalware forms