From 51960bccea4f5c5fcbbd06bbaef05ba937b59355 Mon Sep 17 00:00:00 2001 From: Adam Ploshay Date: Mon, 9 Oct 2023 23:46:57 -0400 Subject: [PATCH 1/4] [POD-1803] migration for new DFP fields --- ...20231010034326_digital_file_provenance_new_dat_fields.rb | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 db/migrate/20231010034326_digital_file_provenance_new_dat_fields.rb diff --git a/db/migrate/20231010034326_digital_file_provenance_new_dat_fields.rb b/db/migrate/20231010034326_digital_file_provenance_new_dat_fields.rb new file mode 100644 index 00000000..2869403a --- /dev/null +++ b/db/migrate/20231010034326_digital_file_provenance_new_dat_fields.rb @@ -0,0 +1,6 @@ +class DigitalFileProvenanceNewDatFields < ActiveRecord::Migration + def change + add_column :digital_file_provenances, :sample_rate, :string + add_column :digital_file_provenances, :digital_to_analog, :boolean + end +end From e369d70659f27aa66363b8c1b86be699526641b3 Mon Sep 17 00:00:00 2001 From: Adam Ploshay Date: Mon, 9 Oct 2023 23:42:04 -0400 Subject: [PATCH 2/4] [POD-1803] model, view, controller changes for new DFP fields --- app/controllers/application_controller.rb | 1 + app/models/dat_tm.rb | 5 ++++- app/models/digital_file_provenance.rb | 4 ++++ .../_digital_file_provenance.html.erb | 12 ++++++++++++ app/views/responses/digiprov_metadata.xml.builder | 2 ++ app/views/responses/full_metadata.xml.builder | 2 ++ 6 files changed, 25 insertions(+), 1 deletion(-) diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index 2f5dbce5..bd7fbdfd 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -190,6 +190,7 @@ def dp_params :id, :filename, :comment, :date_digitized, :display_date_digitized, :created_by, :speed_used, :signal_chain_id, :volume_units, :tape_fluxivity, :peak, :analog_output_voltage, :stylus_size, :turnover, :rolloff, :noise_reduction, :reference_tone_frequency, + :sample_rate, :digital_to_analog, :rumble_filter, :_destroy] ) end diff --git a/app/models/dat_tm.rb b/app/models/dat_tm.rb index bac7dd32..baf569ca 100644 --- a/app/models/dat_tm.rb +++ b/app/models/dat_tm.rb @@ -4,7 +4,10 @@ class DatTm < ActiveRecord::Base extend TechnicalMetadatumClassModule # TM module constants DIGITAL_PROVENANCE_FILES = ['Digital Master', 'PresInt'] - # PROVENANCE_REQUIREMENTS unchanged from default + PROVENANCE_REQUIREMENTS = TechnicalMetadatumModule::PROVENANCE_REQUIREMENTS.merge({ + sample_rate: false, + digital_to_analog: false + }) TM_FORMAT = ['DAT'] TM_SUBTYPE = false TM_GENRE = :audio diff --git a/app/models/digital_file_provenance.rb b/app/models/digital_file_provenance.rb index 7e702eb7..12e7f65c 100644 --- a/app/models/digital_file_provenance.rb +++ b/app/models/digital_file_provenance.rb @@ -22,6 +22,10 @@ class DigitalFileProvenance < ActiveRecord::Base validate :filename_validation validate :validate_signal_chain + # validation for these? + # sample_rate + # digital_to_analog + default_scope { order(:filename) } # File Uses: diff --git a/app/views/digital_provenance/_digital_file_provenance.html.erb b/app/views/digital_provenance/_digital_file_provenance.html.erb index c09e95a4..d3990b19 100644 --- a/app/views/digital_provenance/_digital_file_provenance.html.erb +++ b/app/views/digital_provenance/_digital_file_provenance.html.erb @@ -43,6 +43,18 @@ <%= f.text_field :speed_used, readonly: !@edit_mode, disabled: dp_na(:speed_used), value: dp_na(:speed_used) ? nil : f.object.speed_used %> + > + Sample Rate<%= dp_requirement(:sample_rate) %> + + <%= f.text_field :sample_rate, readonly: !@edit_mode, disabled: dp_na(:sample_rate), value: dp_na(:sample_rate) ? nil : f.object.sample_rate %> + + + > + Digital to Analog<%= dp_requirement(:speed_used) %> + + <%= f.check_box :digital_to_analog, readonly: !@edit_mode, disabled: dp_na(:digital_to_analog), value: dp_na(:digital_to_analog) ? nil : f.object.digital_to_analog %> + + > Reference Fluxivity (nWb/m)<%= dp_requirement(:tape_fluxivity) %> diff --git a/app/views/responses/digiprov_metadata.xml.builder b/app/views/responses/digiprov_metadata.xml.builder index 6e825433..7b6dc6d1 100644 --- a/app/views/responses/digiprov_metadata.xml.builder +++ b/app/views/responses/digiprov_metadata.xml.builder @@ -69,6 +69,8 @@ xml.pod("xmlns:xsi" => "http://www.w3.org/2001/XMLSchema-instance") do xml.comment dfp.comment.to_s xml.created_by dfp.created_by.to_s xml.speed_used dfp.speed_used.to_s + xml.sample_rate dfp.sample_rate.to_s + xml.digital_to_analog dfp.digital_to_analog.to_s xml.tape_fluxivity dfp.tape_fluxivity.to_s + (dfp.tape_fluxivity.blank? ? "" : " nWb/m") xml.volume_units dfp.volume_units.to_s + (dfp.volume_units.blank? ? "" : " dB") xml.analog_output_voltage dfp.analog_output_voltage.to_s + (dfp.analog_output_voltage.blank? ? "" : " dBu") diff --git a/app/views/responses/full_metadata.xml.builder b/app/views/responses/full_metadata.xml.builder index 9165e7e0..d28eaa11 100644 --- a/app/views/responses/full_metadata.xml.builder +++ b/app/views/responses/full_metadata.xml.builder @@ -62,6 +62,8 @@ xml.pod("xmlns:xsi" => "http://www.w3.org/2001/XMLSchema-instance") do xml.comment dfp.comment xml.created_by dfp.created_by xml.speed_used dfp.speed_used + xml.sample_rate dfp.sample_rate + xml.digital_to_analog dfp.digital_to_analog xml.tape_fluxivity dfp.tape_fluxivity xml.volume_units dfp.volume_units xml.analog_output_voltage dfp.analog_output_voltage From 082a0d006839a1b489611a67e7308ae34e59f0e5 Mon Sep 17 00:00:00 2001 From: jaalbrec Date: Wed, 11 Oct 2023 10:33:12 -0400 Subject: [PATCH 3/4] removed ssl cert and key from the commit --- .ruby-version | 2 +- .../_digital_file_provenance.html.erb | 14 +- db/schema.rb | 207 +++++++----------- 3 files changed, 94 insertions(+), 129 deletions(-) diff --git a/.ruby-version b/.ruby-version index a4dd9dba..74500cee 100644 --- a/.ruby-version +++ b/.ruby-version @@ -1 +1 @@ -2.7.4 +2.7.4 \ No newline at end of file diff --git a/app/views/digital_provenance/_digital_file_provenance.html.erb b/app/views/digital_provenance/_digital_file_provenance.html.erb index d3990b19..1fe17cae 100644 --- a/app/views/digital_provenance/_digital_file_provenance.html.erb +++ b/app/views/digital_provenance/_digital_file_provenance.html.erb @@ -46,13 +46,21 @@ > Sample Rate<%= dp_requirement(:sample_rate) %> - <%= f.text_field :sample_rate, readonly: !@edit_mode, disabled: dp_na(:sample_rate), value: dp_na(:sample_rate) ? nil : f.object.sample_rate %> + <% if @edit_mode %> + <%= f.select :sample_rate, options_for_select(DatTm::HUMANIZED_COLUMNS.values.collect{|v| [v,v]}, f.object.sample_rate || "48k") %> + <% else %> + <%= f.text_field :sample_rate, readonly: true, disabled: dp_na(:sample_rate), value: dp_na(:sample_rate) ? nil : f.object.sample_rate %> + <% end %> > - Digital to Analog<%= dp_requirement(:speed_used) %> + Transfer Type<%= dp_requirement(:speed_used) %> - <%= f.check_box :digital_to_analog, readonly: !@edit_mode, disabled: dp_na(:digital_to_analog), value: dp_na(:digital_to_analog) ? nil : f.object.digital_to_analog %> + <% if @edit_mode %> + <%= f.select :digital_to_analog, options_for_select([["Digital Transfer", false],["Analog Transfer", true]], f.object.digital_to_analog || false) %> + <% else %> + <%= text_field_tag 'foo', dp_na(:digital_to_analog) ? nil : (f.object.digital_to_analog ? "Analog Transfer" : "Digital Transfer"), { readonly: !@edit_mode, disabled: dp_na(:digital_to_analog) } %> + <% end %> > diff --git a/db/schema.rb b/db/schema.rb index 2c9b02d3..f8fa394f 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -11,7 +11,7 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema.define(version: 20201112135709) do +ActiveRecord::Schema.define(version: 20231010034326) do create_table "analog_sound_disc_imaging_tms", force: :cascade do |t| t.string "subtype", limit: 255 @@ -170,20 +170,8 @@ add_index "bins", ["workflow_index", "identifier"], name: "index_bins_on_workflow_index_and_identifier", using: :btree add_index "bins", ["workflow_status"], name: "index_bins_on_workflow_status", using: :btree - create_table "boxes", force: :cascade do |t| - t.integer "bin_id", limit: 8 - t.integer "mdpi_barcode", limit: 8 - t.datetime "created_at" - t.datetime "updated_at" - t.integer "spreadsheet_id", limit: 4 - t.boolean "full", default: false - t.text "description", limit: 65535 - t.string "format", limit: 255 - t.string "physical_location", limit: 255 - end - - add_index "boxes", ["bin_id"], name: "index_boxes_on_bin_id", using: :btree - add_index "boxes", ["spreadsheet_id"], name: "index_boxes_on_spreadsheet_id", using: :btree +# Could not dump table "boxes" because of following FrozenError +# can't modify frozen String: "false" create_table "cassette_tape_tms", force: :cascade do |t| t.datetime "created_at" @@ -205,16 +193,8 @@ t.datetime "updated_at" end - create_table "condition_status_templates", force: :cascade do |t| - t.string "name", limit: 255 - t.text "description", limit: 65535 - t.string "object_type", limit: 255 - t.datetime "created_at" - t.datetime "updated_at" - t.boolean "blocks_packing", default: false - end - - add_index "condition_status_templates", ["object_type", "name"], name: "index_cst_on_object_and_name", using: :btree +# Could not dump table "condition_status_templates" because of following FrozenError +# can't modify frozen String: "false" create_table "condition_statuses", force: :cascade do |t| t.integer "condition_status_template_id", limit: 4 @@ -232,11 +212,6 @@ add_index "condition_statuses", ["physical_object_id", "condition_status_template_id"], name: "index_cs_on_po_and_cst", using: :btree add_index "condition_statuses", ["physical_object_id"], name: "index_condition_statuses_on_physical_object_id", using: :btree - create_table "containers", force: :cascade do |t| - t.datetime "created_at" - t.datetime "updated_at" - end - create_table "cylinder_tms", force: :cascade do |t| t.string "size", limit: 255 t.string "material", limit: 255 @@ -287,6 +262,8 @@ t.string "noise_reduction", limit: 255 t.integer "rumble_filter", limit: 4 t.integer "reference_tone_frequency", limit: 4 + t.string "sample_rate", limit: 255 + t.boolean "digital_to_analog" end add_index "digital_file_provenances", ["filename"], name: "index_digital_file_provenances_on_filename", unique: true, using: :btree @@ -310,22 +287,35 @@ add_index "digital_provenances", ["physical_object_id"], name: "index_digital_provenances_on_physical_object_id", using: :btree - create_table "digital_statuses", force: :cascade do |t| - t.integer "physical_object_id", limit: 4 - t.integer "physical_object_mdpi_barcode", limit: 8 - t.string "state", limit: 255 - t.text "message", limit: 65535 - t.boolean "accepted" - t.boolean "attention" - t.text "decided", limit: 65535 - t.text "options", limit: 65535 - t.datetime "created_at" - t.datetime "updated_at" - t.boolean "decided_manually", default: false +# Could not dump table "digital_statuses" because of following FrozenError +# can't modify frozen String: "false" + + create_table "doFiles", id: false, force: :cascade do |t| + t.string "mdpiBarcode", limit: 14, null: false + t.integer "partNumber", limit: 1 + t.boolean "isMaster" + t.string "fileUsage", limit: 255 + t.string "md5", limit: 32 + t.integer "size", limit: 8 + t.float "duration", limit: 24 + end + + add_index "doFiles", ["fileUsage"], name: "doFiles_fileUsage", using: :btree + add_index "doFiles", ["mdpiBarcode", "partNumber"], name: "mdpiBarcode", using: :btree + + create_table "doObjects", primary_key: "mdpiBarcode", force: :cascade do |t| + t.string "digitizingEntity", limit: 255 + t.string "objectType", limit: 255 + t.datetime "acceptTime" + t.datetime "bagTime" + t.integer "size", limit: 8 end - add_index "digital_statuses", ["created_at", "state", "physical_object_id"], name: "quality_control_staging", using: :btree - add_index "digital_statuses", ["physical_object_id"], name: "index_digital_statuses_on_physical_object_id", using: :btree + create_table "doParts", id: false, force: :cascade do |t| + t.string "mdpiBarcode", limit: 14, null: false + t.integer "partNumber", limit: 1, null: false + t.boolean "vendorQC" + end create_table "dv_tms", force: :cascade do |t| t.string "recording_standard", limit: 255 @@ -557,15 +547,8 @@ t.datetime "updated_at", null: false end - create_table "memnon_invoice_submissions", force: :cascade do |t| - t.string "filename", limit: 255 - t.datetime "submission_date" - t.boolean "successful_validation" - t.integer "validation_completion_percent", limit: 4 - t.boolean "bad_headers", default: false - t.text "other_error", limit: 4294967295 - t.text "problems_by_row", limit: 4294967295 - end +# Could not dump table "memnon_invoice_submissions" because of following FrozenError +# can't modify frozen String: "false" create_table "messages", force: :cascade do |t| t.text "content", limit: 65535 @@ -637,64 +620,8 @@ t.boolean "dual_mono" end - create_table "physical_objects", force: :cascade do |t| - t.integer "bin_id", limit: 4 - t.integer "box_id", limit: 8 - t.integer "picklist_id", limit: 8 - t.integer "container_id", limit: 8 - t.text "title", limit: 65535 - t.string "title_control_number", limit: 255 - t.string "home_location", limit: 255 - t.string "call_number", limit: 255 - t.string "iucat_barcode", limit: 255 - t.string "format", limit: 255 - t.string "collection_identifier", limit: 255 - t.integer "mdpi_barcode", limit: 8 - t.string "format_duration", limit: 255 - t.boolean "has_ephemera" - t.datetime "created_at" - t.datetime "updated_at" - t.string "author", limit: 255 - t.string "catalog_key", limit: 255 - t.string "collection_name", limit: 255 - t.string "generation", limit: 255 - t.string "oclc_number", limit: 255 - t.boolean "other_copies" - t.string "year", limit: 255 - t.integer "unit_id", limit: 4 - t.integer "group_key_id", limit: 4 - t.integer "group_position", limit: 4 - t.boolean "ephemera_returned" - t.integer "spreadsheet_id", limit: 4 - t.string "workflow_status", limit: 255 - t.integer "workflow_index", limit: 4 - t.boolean "staging_requested", default: false - t.boolean "staged", default: false - t.datetime "digital_start" - t.datetime "staging_request_timestamp" - t.boolean "audio" - t.boolean "video" - t.boolean "memnon_qc_completed" - t.boolean "billed", default: false - t.datetime "date_billed" - t.string "spread_sheet_filename", limit: 255 - t.integer "shipment_id", limit: 4 - t.boolean "film" - t.string "digital_workflow_status", limit: 255 - t.integer "digital_workflow_category", limit: 4, default: 0 - end - - add_index "physical_objects", ["bin_id"], name: "index_physical_objects_on_bin_id", using: :btree - add_index "physical_objects", ["box_id"], name: "index_physical_objects_on_box_id", using: :btree - add_index "physical_objects", ["container_id"], name: "index_physical_objects_on_container_id", using: :btree - add_index "physical_objects", ["group_key_id"], name: "index_physical_objects_on_group_key_id", using: :btree - add_index "physical_objects", ["mdpi_barcode"], name: "index_physical_objects_on_mdpi_barcode", using: :btree - add_index "physical_objects", ["picklist_id", "group_key_id", "group_position", "id"], name: "index_physical_objects_on_packing_sort", using: :btree - add_index "physical_objects", ["shipment_id"], name: "index_physical_objects_on_shipment_id", using: :btree - add_index "physical_objects", ["spread_sheet_filename"], name: "index_physical_objects_on_spread_sheet_filename", using: :btree - add_index "physical_objects", ["spreadsheet_id"], name: "index_physical_objects_on_spreadsheet_id", using: :btree - add_index "physical_objects", ["unit_id"], name: "index_physical_objects_on_unit_id", using: :btree - add_index "physical_objects", ["workflow_status"], name: "index_physical_objects_on_workflow_status", using: :btree +# Could not dump table "physical_objects" because of following FrozenError +# can't modify frozen String: "false" create_table "picklist_specifications", force: :cascade do |t| t.string "name", limit: 255 @@ -704,20 +631,8 @@ t.datetime "updated_at" end - create_table "picklists", force: :cascade do |t| - t.string "name", limit: 255 - t.string "description", limit: 255 - t.datetime "created_at" - t.datetime "updated_at" - t.string "destination", limit: 255 - t.boolean "complete", default: false - t.string "format", limit: 255 - t.integer "shipment_id", limit: 4 - end - - add_index "picklists", ["destination"], name: "index_picklists_on_destination", using: :btree - add_index "picklists", ["name"], name: "index_picklists_on_name", unique: true, using: :btree - add_index "picklists", ["shipment_id"], name: "index_picklists_on_shipment_id", using: :btree +# Could not dump table "picklists" because of following FrozenError +# can't modify frozen String: "false" create_table "pod_reports", force: :cascade do |t| t.string "status", limit: 255 @@ -916,17 +831,59 @@ add_index "workflow_statuses", ["bin_id", "workflow_status_template_id"], name: "index_ws_on_bin_and_wst", using: :btree add_index "workflow_statuses", ["physical_object_id", "workflow_status_template_id"], name: "index_ws_on_po_and_wst", using: :btree + create_table "xDigitizingEntity", force: :cascade do |t| + t.string "name", limit: 255 + end + create_table "xFormatClass", id: false, force: :cascade do |t| t.integer "id", limit: 4 t.string "type", limit: 1 end + create_table "xObjectClass", force: :cascade do |t| + t.string "class", limit: 255 + end + + create_table "xObjectType", force: :cascade do |t| + t.string "type", limit: 255 + end + + create_table "xObjects", force: :cascade do |t| + t.string "mdpiBarcode", limit: 14, null: false + t.boolean "active" + t.boolean "visible" + t.integer "transferTime", limit: 4 + t.integer "digitizingEntityId", limit: 4, null: false + t.integer "objectTypeId", limit: 4, null: false + t.integer "stateId", limit: 4, null: false + t.integer "stateTime", limit: 4 + t.integer "objectClassId", limit: 4, null: false + t.string "path", limit: 255 + t.integer "diskUsage", limit: 8 + t.float "duration", limit: 24 + end + + add_index "xObjects", ["digitizingEntityId"], name: "digitizingEntity", using: :btree + add_index "xObjects", ["digitizingEntityId"], name: "digitizingEntityId", using: :btree + add_index "xObjects", ["mdpiBarcode"], name: "mdpiBarcode", using: :btree + add_index "xObjects", ["objectClassId"], name: "objectClassId", using: :btree + add_index "xObjects", ["objectTypeId"], name: "objectTypeId", using: :btree + add_index "xObjects", ["path"], name: "path", using: :btree + add_index "xObjects", ["stateId"], name: "stateId", using: :btree + create_table "xState", force: :cascade do |t| t.string "state", limit: 255 end add_foreign_key "batches", "spreadsheets" + add_foreign_key "doFiles", "doParts", column: "mdpiBarcode", primary_key: "mdpiBarcode", name: "doFiles_ibfk_1" + add_foreign_key "doFiles", "doParts", column: "partNumber", primary_key: "partNumber", name: "doFiles_ibfk_1" + add_foreign_key "doParts", "doObjects", column: "mdpiBarcode", primary_key: "mdpiBarcode", name: "doParts_ibfk_1" add_foreign_key "physical_objects", "shipments" add_foreign_key "picklists", "shipments" add_foreign_key "shipments", "units" + add_foreign_key "xObjects", "xDigitizingEntity", column: "digitizingEntityId", name: "xObjects_ibfk_2" + add_foreign_key "xObjects", "xObjectClass", column: "objectClassId", name: "xObjects_ibfk_4" + add_foreign_key "xObjects", "xObjectType", column: "objectTypeId", name: "xObjects_ibfk_3" + add_foreign_key "xObjects", "xState", column: "stateId", name: "xObjects_ibfk_1" end From 255d9db48b2d04dc3f9d2cc9109a4070c3ab8e73 Mon Sep 17 00:00:00 2001 From: Andrew Albrecht Date: Mon, 6 Nov 2023 13:23:46 -0500 Subject: [PATCH 4/4] Update gitignore to exclude local self signing certs in rails server --- .gitignore | 4 ++++ bin/rails | 5 +++-- bin/rake | 5 +++-- bin/rspec | 5 +++-- bin/spring | 16 +++++++++------- 5 files changed, 22 insertions(+), 13 deletions(-) diff --git a/.gitignore b/.gitignore index d66cc4ac..e1c39ba2 100644 --- a/.gitignore +++ b/.gitignore @@ -30,6 +30,10 @@ config/settings/*.local.yml config/environments/*.local.yml config/secrets.yml +# ignore local crt and key file for self signed ssl +config/localhost.crt +config/localhost.key + # Ignore RubyMine files .idea/* .DS_Store diff --git a/bin/rails b/bin/rails index 9d86a132..bfa551b6 100644 --- a/bin/rails +++ b/bin/rails @@ -1,7 +1,8 @@ #!/usr/bin/env ruby.exe begin - load File.expand_path("../spring", __FILE__) -rescue LoadError + load File.expand_path('../spring', __FILE__) +rescue LoadError => e + raise unless e.message.include?('spring') end APP_PATH = File.expand_path('../../config/application', __FILE__) require_relative '../config/boot' diff --git a/bin/rake b/bin/rake index 19a971d5..92a626e8 100644 --- a/bin/rake +++ b/bin/rake @@ -1,7 +1,8 @@ #!/usr/bin/env ruby.exe begin - load File.expand_path("../spring", __FILE__) -rescue LoadError + load File.expand_path('../spring', __FILE__) +rescue LoadError => e + raise unless e.message.include?('spring') end require_relative '../config/boot' require 'rake' diff --git a/bin/rspec b/bin/rspec index 20060ebd..6e670921 100755 --- a/bin/rspec +++ b/bin/rspec @@ -1,7 +1,8 @@ #!/usr/bin/env ruby begin - load File.expand_path("../spring", __FILE__) -rescue LoadError + load File.expand_path('../spring', __FILE__) +rescue LoadError => e + raise unless e.message.include?('spring') end require 'bundler/setup' load Gem.bin_path('rspec-core', 'rspec') diff --git a/bin/spring b/bin/spring index 5e7ecc47..d89ee495 100755 --- a/bin/spring +++ b/bin/spring @@ -1,15 +1,17 @@ #!/usr/bin/env ruby -# This file loads spring without using Bundler, in order to be fast. +# This file loads Spring without using Bundler, in order to be fast. # It gets overwritten when you run the `spring binstub` command. unless defined?(Spring) - require "rubygems" - require "bundler" + require 'rubygems' + require 'bundler' - if (match = Bundler.default_lockfile.read.match(/^GEM$.*?^ (?: )*spring \((.*?)\)$.*?^$/m)) - Gem.paths = { "GEM_PATH" => [Bundler.bundle_path.to_s, *Gem.path].uniq } - gem "spring", match[1] - require "spring/binstub" + lockfile = Bundler::LockfileParser.new(Bundler.default_lockfile.read) + spring = lockfile.specs.detect { |spec| spec.name == 'spring' } + if spring + Gem.use_paths Gem.dir, Bundler.bundle_path.to_s, *Gem.path + gem 'spring', spring.version + require 'spring/binstub' end end