openstudio-workflow 1.0.0.pat1 → 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (46) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +12 -0
  3. data/README.md +16 -68
  4. data/Rakefile +9 -9
  5. data/bin/openstudio_cli +786 -0
  6. data/lib/openstudio/workflow/adapters/input/local.rb +97 -0
  7. data/lib/openstudio/workflow/adapters/output/local.rb +90 -0
  8. data/lib/openstudio/workflow/adapters/output/socket.rb +70 -0
  9. data/lib/openstudio/workflow/{jobs/run_preflight/run_preflight.rb → adapters/output/web.rb} +37 -19
  10. data/lib/openstudio/workflow/{adapter.rb → adapters/output_adapter.rb} +53 -51
  11. data/lib/openstudio/workflow/job.rb +22 -0
  12. data/lib/openstudio/workflow/jobs/{run_energyplus → resources}/monthly_report.idf +0 -0
  13. data/lib/openstudio/workflow/jobs/run_energyplus.rb +49 -0
  14. data/lib/openstudio/workflow/jobs/run_ep_measures.rb +55 -0
  15. data/lib/openstudio/workflow/jobs/run_initialization.rb +136 -0
  16. data/lib/openstudio/workflow/jobs/run_os_measures.rb +59 -0
  17. data/lib/openstudio/workflow/jobs/run_postprocess.rb +53 -0
  18. data/lib/openstudio/workflow/jobs/run_preprocess.rb +81 -0
  19. data/lib/openstudio/workflow/jobs/run_reporting_measures.rb +86 -0
  20. data/lib/openstudio/workflow/jobs/run_translation.rb +49 -0
  21. data/lib/openstudio/workflow/multi_delegator.rb +1 -3
  22. data/lib/openstudio/workflow/registry.rb +137 -0
  23. data/lib/openstudio/workflow/run.rb +182 -221
  24. data/lib/openstudio/workflow/time_logger.rb +1 -1
  25. data/lib/openstudio/workflow/util/energyplus.rb +564 -0
  26. data/lib/openstudio/workflow/util/io.rb +33 -0
  27. data/lib/openstudio/workflow/util/measure.rb +520 -0
  28. data/lib/openstudio/workflow/util/model.rb +100 -0
  29. data/lib/openstudio/workflow/util/post_process.rb +177 -0
  30. data/lib/openstudio/workflow/util/weather_file.rb +108 -0
  31. data/lib/openstudio/workflow/util.rb +14 -0
  32. data/lib/openstudio/workflow/version.rb +1 -1
  33. data/lib/openstudio/workflow_json.rb +399 -0
  34. data/lib/openstudio/workflow_runner.rb +213 -0
  35. data/lib/openstudio-workflow.rb +13 -118
  36. metadata +45 -85
  37. data/lib/openstudio/extended_runner.rb +0 -105
  38. data/lib/openstudio/workflow/adapters/local.rb +0 -101
  39. data/lib/openstudio/workflow/adapters/mongo.rb +0 -227
  40. data/lib/openstudio/workflow/jobs/lib/apply_measures.rb +0 -253
  41. data/lib/openstudio/workflow/jobs/run_energyplus/run_energyplus.rb +0 -314
  42. data/lib/openstudio/workflow/jobs/run_openstudio/run_openstudio.rb +0 -230
  43. data/lib/openstudio/workflow/jobs/run_postprocess/run_postprocess.rb +0 -110
  44. data/lib/openstudio/workflow/jobs/run_reporting_measures/run_reporting_measures.rb +0 -471
  45. data/lib/openstudio/workflow/jobs/run_runmanager/run_runmanager.rb +0 -247
  46. data/lib/openstudio/workflow/jobs/run_xml/run_xml.rb +0 -279
@@ -17,138 +17,33 @@
17
17
  # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
18
18
  ######################################################################
19
19
 
20
- require 'pp'
21
- require 'rubyXL'
22
- require 'multi_json'
23
- require 'colored'
24
20
  require 'fileutils'
25
- require 'securerandom' # uuids
26
- require 'json' # needed for a single pretty generate call
21
+ require 'json'
27
22
  require 'pathname'
28
23
 
29
- begin
30
- require 'facter'
31
- rescue LoadError => e
32
- warn 'Could not load Facter. Will not be able to save the IP address to the log'.red
33
- end
34
-
35
- require 'openstudio/workflow/version'
36
- require 'openstudio/workflow/multi_delegator'
37
- require 'openstudio/workflow/run'
38
- require 'openstudio/workflow/jobs/lib/apply_measures'
39
- require 'openstudio/workflow/time_logger'
40
-
24
+ require_relative 'openstudio/workflow/version'
25
+ require_relative 'openstudio/workflow/multi_delegator'
26
+ require_relative 'openstudio/workflow/run'
27
+ require_relative 'openstudio/workflow/job'
28
+ require_relative 'openstudio/workflow/time_logger'
29
+ require_relative 'openstudio/workflow/registry'
30
+ require_relative 'openstudio/workflow/util'
41
31
  require 'openstudio'
42
- require 'openstudio/extended_runner'
43
-
44
- ENV['OPENSTUDIO_WORKFLOW'] = 'true'
45
-
46
- # some core extensions
47
- class String
48
- def to_underscore
49
- gsub(/::/, '/')
50
- .gsub(/([A-Z]+)([A-Z][a-z])/, '\1_\2')
51
- .gsub(/([a-z\d])([A-Z])/, '\1_\2')
52
- .tr('-', '_')
53
- .downcase
54
- end
55
- end
32
+ require_relative 'openstudio/workflow_runner'
56
33
 
57
34
  module OpenStudio
58
35
  module Workflow
59
36
  extend self
60
37
 
61
- # Create a new workflow instance using the defined adapter and UUID
62
- def load(adapter_name, run_directory, options = {})
63
- defaults = { adapter_options: {} }
64
- options = defaults.merge(options)
65
- # We don't have deep merge so just check for the rails_env
66
- options[:adapter_options][:rails_env] = :development unless options[:adapter_options][:rails_env]
67
-
68
- # Convert various paths to absolute paths
69
- if options[:adapter_options] && options[:adapter_options][:mongoid_path] &&
70
- (Pathname.new options[:adapter_options][:mongoid_path]).absolute? == false
71
- options[:adapter_options][:mongoid_path] = File.expand_path options[:adapter_options][:mongoid_path]
72
- end
73
- if options[:analysis_root_path] &&
74
- (Pathname.new options[:analysis_root_path]).absolute? == false
75
- options[:analysis_root_path] = File.expand_path options[:analysis_root_path]
76
- end
77
- unless (Pathname.new run_directory).absolute?
78
- # relative to wherever you are running the script
79
- run_directory = File.expand_path run_directory
80
- end
81
- adapter = load_adapter adapter_name, options[:adapter_options]
82
- run_klass = OpenStudio::Workflow::Run.new(adapter, run_directory, options)
83
- # return the run class
84
- run_klass
85
- end
86
-
87
- # predefined method that simply runs EnergyPlus in the specified directory. It does not apply any workflow steps
88
- # such as preprocessing / postprocessing. The directory must have the IDF and EPW file in the folder. The
89
- # simulations will run in the directory/run path
90
- #
91
- # @param adapter_name [String] Type of adapter, local or mongo.
92
- # @param run_directory [String] Path to where the simulation is to run
93
- # @param options [Hash] List of options for the adapter
94
- def run_energyplus(adapter_name, run_directory, options = {})
95
- unless (Pathname.new run_directory).absolute?
96
- # relative to wherever you are running the script
97
- run_directory = File.expand_path run_directory
98
- end
99
-
100
- transitions = [
101
- { from: :queued, to: :preflight },
102
- { from: :preflight, to: :energyplus },
103
- { from: :energyplus, to: :finished }
104
- ]
105
-
106
- states = [
107
- { state: :queued, options: { initial: true } },
108
- { state: :preflight, options: { after_enter: :run_preflight } },
109
- { state: :energyplus, options: { after_enter: :run_energyplus } },
110
- { state: :finished },
111
- { state: :errored }
112
- ]
113
- options = {
114
- transitions: transitions,
115
- states: states
116
- }
117
-
118
- adapter = load_adapter adapter_name, options[:adapter_options]
119
- run_klass = OpenStudio::Workflow::Run.new(adapter, run_directory, options)
120
-
121
- run_klass
122
- end
123
-
124
38
  # Extract an archive to a specific location
39
+ #
125
40
  # @param archive_filename [String] Path and name of the file to extract
126
41
  # @param destination [String] Path to extract to
127
42
  # @param overwrite [Boolean] If true, will overwrite any extracted file that may already exist
43
+ #
128
44
  def extract_archive(archive_filename, destination, overwrite = true)
129
- Zip::File.open(archive_filename) do |zf|
130
- zf.each do |f|
131
- f_path = File.join(destination, f.name)
132
- FileUtils.mkdir_p(File.dirname(f_path))
133
-
134
- if File.exist?(f_path) && overwrite
135
- FileUtils.rm_rf(f_path)
136
- zf.extract(f, f_path)
137
- elsif !File.exist? f_path
138
- zf.extract(f, f_path)
139
- end
140
- end
141
- end
142
- end
143
-
144
- private
145
-
146
- def load_adapter(name, adapter_options = {})
147
- require "openstudio/workflow/adapters/#{name.downcase}"
148
- klass_name = name.to_s.split('_').map(&:capitalize) * ''
149
- # pp "#{klass_name} is the adapter class name"
150
- klass = OpenStudio::Workflow::Adapters.const_get(klass_name).new(adapter_options)
151
- klass
45
+ zf = OpenStudio::UnzipFile.new(archive_filename)
46
+ zf.extractAllFiles(destination)
152
47
  end
153
48
  end
154
49
  end
metadata CHANGED
@@ -1,14 +1,15 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: openstudio-workflow
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0.pat1
4
+ version: 1.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Nicholas Long
8
+ - Henry Horsey
8
9
  autorequire:
9
10
  bindir: bin
10
11
  cert_chain: []
11
- date: 2016-07-13 00:00:00.000000000 Z
12
+ date: 2017-01-06 00:00:00.000000000 Z
12
13
  dependencies:
13
14
  - !ruby/object:Gem::Dependency
14
15
  name: bundler
@@ -25,103 +26,62 @@ dependencies:
25
26
  - !ruby/object:Gem::Version
26
27
  version: '1.6'
27
28
  - !ruby/object:Gem::Dependency
28
- name: rake
29
+ name: json-schema
29
30
  requirement: !ruby/object:Gem::Requirement
30
31
  requirements:
31
- - - '>='
32
+ - - ~>
32
33
  - !ruby/object:Gem::Version
33
34
  version: '0'
34
35
  type: :development
35
36
  prerelease: false
36
37
  version_requirements: !ruby/object:Gem::Requirement
37
- requirements:
38
- - - '>='
39
- - !ruby/object:Gem::Version
40
- version: '0'
41
- - !ruby/object:Gem::Dependency
42
- name: multi_json
43
- requirement: !ruby/object:Gem::Requirement
44
- requirements:
45
- - - ~>
46
- - !ruby/object:Gem::Version
47
- version: 1.10.0
48
- type: :runtime
49
- prerelease: false
50
- version_requirements: !ruby/object:Gem::Requirement
51
- requirements:
52
- - - ~>
53
- - !ruby/object:Gem::Version
54
- version: 1.10.0
55
- - !ruby/object:Gem::Dependency
56
- name: colored
57
- requirement: !ruby/object:Gem::Requirement
58
- requirements:
59
- - - ~>
60
- - !ruby/object:Gem::Version
61
- version: '1.2'
62
- type: :runtime
63
- prerelease: false
64
- version_requirements: !ruby/object:Gem::Requirement
65
- requirements:
66
- - - ~>
67
- - !ruby/object:Gem::Version
68
- version: '1.2'
69
- - !ruby/object:Gem::Dependency
70
- name: rubyXL
71
- requirement: !ruby/object:Gem::Requirement
72
38
  requirements:
73
39
  - - ~>
74
40
  - !ruby/object:Gem::Version
75
- version: 3.3.0
76
- type: :runtime
77
- prerelease: false
78
- version_requirements: !ruby/object:Gem::Requirement
79
- requirements:
80
- - - ~>
81
- - !ruby/object:Gem::Version
82
- version: 3.3.0
83
- - !ruby/object:Gem::Dependency
84
- name: rubyzip
85
- requirement: !ruby/object:Gem::Requirement
86
- requirements:
87
- - - ~>
88
- - !ruby/object:Gem::Version
89
- version: 1.2.0
90
- type: :runtime
91
- prerelease: false
92
- version_requirements: !ruby/object:Gem::Requirement
93
- requirements:
94
- - - ~>
95
- - !ruby/object:Gem::Version
96
- version: 1.2.0
97
- description: Run OpenStudio based simulations using EnergyPlus
41
+ version: '0'
42
+ description: Run OpenStudio based measures and simulations using EnergyPlus
98
43
  email:
99
44
  - nicholas.long@nrel.gov
100
- executables: []
45
+ - henry.horsey@nrel.gov
46
+ executables:
47
+ - openstudio_cli
101
48
  extensions: []
102
49
  extra_rdoc_files: []
103
50
  files:
104
- - lib/openstudio/extended_runner.rb
105
- - lib/openstudio/workflow/adapter.rb
106
- - lib/openstudio/workflow/adapters/local.rb
107
- - lib/openstudio/workflow/adapters/mongo.rb
108
- - lib/openstudio/workflow/jobs/lib/apply_measures.rb
109
- - lib/openstudio/workflow/jobs/run_energyplus/monthly_report.idf
110
- - lib/openstudio/workflow/jobs/run_energyplus/run_energyplus.rb
111
- - lib/openstudio/workflow/jobs/run_openstudio/run_openstudio.rb
112
- - lib/openstudio/workflow/jobs/run_postprocess/run_postprocess.rb
113
- - lib/openstudio/workflow/jobs/run_preflight/run_preflight.rb
114
- - lib/openstudio/workflow/jobs/run_reporting_measures/run_reporting_measures.rb
115
- - lib/openstudio/workflow/jobs/run_runmanager/run_runmanager.rb
116
- - lib/openstudio/workflow/jobs/run_xml/run_xml.rb
51
+ - CHANGELOG.md
52
+ - README.md
53
+ - Rakefile
54
+ - bin/openstudio_cli
55
+ - lib/openstudio-workflow.rb
56
+ - lib/openstudio/workflow/adapters/input/local.rb
57
+ - lib/openstudio/workflow/adapters/output/local.rb
58
+ - lib/openstudio/workflow/adapters/output/socket.rb
59
+ - lib/openstudio/workflow/adapters/output/web.rb
60
+ - lib/openstudio/workflow/adapters/output_adapter.rb
61
+ - lib/openstudio/workflow/job.rb
62
+ - lib/openstudio/workflow/jobs/resources/monthly_report.idf
63
+ - lib/openstudio/workflow/jobs/run_energyplus.rb
64
+ - lib/openstudio/workflow/jobs/run_ep_measures.rb
65
+ - lib/openstudio/workflow/jobs/run_initialization.rb
66
+ - lib/openstudio/workflow/jobs/run_os_measures.rb
67
+ - lib/openstudio/workflow/jobs/run_postprocess.rb
68
+ - lib/openstudio/workflow/jobs/run_preprocess.rb
69
+ - lib/openstudio/workflow/jobs/run_reporting_measures.rb
70
+ - lib/openstudio/workflow/jobs/run_translation.rb
117
71
  - lib/openstudio/workflow/multi_delegator.rb
72
+ - lib/openstudio/workflow/registry.rb
118
73
  - lib/openstudio/workflow/run.rb
119
74
  - lib/openstudio/workflow/time_logger.rb
75
+ - lib/openstudio/workflow/util.rb
76
+ - lib/openstudio/workflow/util/energyplus.rb
77
+ - lib/openstudio/workflow/util/io.rb
78
+ - lib/openstudio/workflow/util/measure.rb
79
+ - lib/openstudio/workflow/util/model.rb
80
+ - lib/openstudio/workflow/util/post_process.rb
81
+ - lib/openstudio/workflow/util/weather_file.rb
120
82
  - lib/openstudio/workflow/version.rb
121
- - lib/openstudio-workflow.rb
122
- - README.md
123
- - CHANGELOG.md
124
- - Rakefile
83
+ - lib/openstudio/workflow_json.rb
84
+ - lib/openstudio/workflow_runner.rb
125
85
  homepage: https://github.com/NREL/OpenStudio-workflow-gem
126
86
  licenses:
127
87
  - LGPL
@@ -134,16 +94,16 @@ required_ruby_version: !ruby/object:Gem::Requirement
134
94
  requirements:
135
95
  - - '>='
136
96
  - !ruby/object:Gem::Version
137
- version: 1.9.3
97
+ version: '2.0'
138
98
  required_rubygems_version: !ruby/object:Gem::Requirement
139
99
  requirements:
140
- - - '>'
100
+ - - '>='
141
101
  - !ruby/object:Gem::Version
142
- version: 1.3.1
102
+ version: '0'
143
103
  requirements: []
144
104
  rubyforge_project:
145
- rubygems_version: 2.0.14.1
105
+ rubygems_version: 2.6.7
146
106
  signing_key:
147
107
  specification_version: 4
148
- summary: Workflow Manager
108
+ summary: OpenStudio Workflow Manager
149
109
  test_files: []
@@ -1,105 +0,0 @@
1
- # Extend OS Runner to persist measure information throughout the workflow
2
- class ExtendedRunner < OpenStudio::Ruleset::OSRunner
3
- # Allow former arguments to be set and read
4
- # TODO: Consider having the former arguments passed in in initialization, and define as attr_reader
5
- attr_accessor :former_workflow_arguments
6
- attr_accessor :past_results
7
- attr_reader :workflow_arguments
8
-
9
- # Add in @workflow_arguments
10
- def initialize(multi_logger, analysis_hash, datapoint_hash)
11
- @multi_logger = multi_logger
12
- @analysis = analysis_hash
13
- @datapoint = datapoint_hash
14
- @workflow_arguments = nil
15
- super()
16
- end
17
-
18
- def analysis
19
- return @analysis
20
- end
21
-
22
- def datapoint
23
- return @datapoint
24
- end
25
-
26
- # Take the OS Argument type and map it correctly to the argument value.
27
- # OPENSTUDIO_ENUM( OSArgumentType,
28
- # ((Boolean)(Bool)(0))
29
- # ((Double)(Double)(1))
30
- # ((Quantity)(Quantity)(2))
31
- # ((Integer)(Int)(3))
32
- # ((String)(String)(4))
33
- # ((Choice)(Choice)(5))
34
- # ((Path)(Path)(6))
35
- # );
36
- # @param os_argument_name [String] The string of the argument to check
37
- # @param user_arguments [OSArgumentMap] Map of the arguments to check
38
- def bad_os_typecasting(os_argument_name, user_arguments)
39
- out = nil
40
- user_arguments.each do |arg_name, arg|
41
- # get the type cast value
42
- next unless os_argument_name == arg_name
43
-
44
- case arg.type.valueName
45
- when 'Boolean'
46
- out = arg.valueAsBool if arg.hasValue
47
- when 'Double'
48
- out = arg.valueAsDouble if arg.hasValue
49
- when 'Quantity'
50
- warn 'This OpenStudio Argument Type is deprecated'
51
- when 'Integer'
52
- out = arg.valueAsInteger if arg.hasValue
53
- when 'String'
54
- out = arg.valueAsString if arg.hasValue
55
- when 'Choice'
56
- out = arg.valueAsString if arg.hasValue
57
- when 'Path'
58
- out = arg.valueAsPath.to_s if arg.hasValue
59
- end
60
- end
61
-
62
- out
63
- end
64
-
65
- # Overloaded argument parsing
66
- def validateUserArguments(script_arguments, user_arguments)
67
- @workflow_arguments = {}
68
- user_arguments.each do |hash|
69
- value = bad_os_typecasting(hash, user_arguments)
70
- @workflow_arguments[hash.to_sym] = value if value
71
- end
72
-
73
- super
74
- end
75
-
76
- # Overload registerInfo
77
- def registerInfo(message)
78
- super
79
- @multi_logger.info message
80
- end
81
-
82
- # Overload registerInfo
83
- def registerWarning(message)
84
- super
85
- @multi_logger.warn message
86
- end
87
-
88
- # Overload registerError
89
- def registerError(message)
90
- super
91
- @multi_logger.error message
92
- end
93
-
94
- # Overload registerInitialCondition
95
- def registerInitialCondition(message)
96
- super
97
- @multi_logger.info message
98
- end
99
-
100
- # Overload registerFinalCondition
101
- def registerFinalCondition(message)
102
- super
103
- @multi_logger.info message
104
- end
105
- end
@@ -1,101 +0,0 @@
1
- ######################################################################
2
- # Copyright (c) 2008-2014, Alliance for Sustainable Energy.
3
- # All rights reserved.
4
- #
5
- # This library is free software; you can redistribute it and/or
6
- # modify it under the terms of the GNU Lesser General Public
7
- # License as published by the Free Software Foundation; either
8
- # version 2.1 of the License, or (at your option) any later version.
9
- #
10
- # This library is distributed in the hope that it will be useful,
11
- # but WITHOUT ANY WARRANTY; without even the implied warranty of
12
- # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13
- # Lesser General Public License for more details.
14
- #
15
- # You should have received a copy of the GNU Lesser General Public
16
- # License along with this library; if not, write to the Free Software
17
- # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
18
- ######################################################################
19
-
20
- require_relative '../adapter'
21
-
22
- # Local file based workflow
23
- module OpenStudio
24
- module Workflow
25
- module Adapters
26
- class Local < Adapter
27
- def initialize(options = {})
28
- super
29
- end
30
-
31
- # Tell the system that the process has started
32
- def communicate_started(directory, _options = {})
33
- # Watch out for namespace conflicts (::Time is okay but Time is OpenStudio::Time)
34
- File.open("#{directory}/started.job", 'w') { |f| f << "Started Workflow #{::Time.now}" }
35
- end
36
-
37
- # Get the data point from the path
38
- def get_datapoint(directory, options = {})
39
- defaults = { datapoint_filename: 'datapoint.json', format: 'json' }
40
- options = defaults.merge(options)
41
-
42
- # how do we log within this file?
43
- if File.exist? "#{directory}/#{options[:datapoint_filename]}"
44
- ::JSON.parse(File.read("#{directory}/#{options[:datapoint_filename]}"), symbolize_names: true)
45
- else
46
- fail "Data point file does not exist for #{directory}/#{options[:datapoint_filename]}"
47
- end
48
- end
49
-
50
- # Get the Problem/Analysis definition from the local file
51
- # TODO: rename this to get_analysis_definintion (or something like that)
52
- def get_problem(directory, options = {})
53
- defaults = { problem_filename: 'problem.json', format: 'json' }
54
- options = defaults.merge(options)
55
-
56
- if File.exist? "#{directory}/#{options[:problem_filename]}"
57
- ::JSON.parse(File.read("#{directory}/#{options[:problem_filename]}"), symbolize_names: true)
58
- else
59
- fail "Problem file does not exist for #{directory}/#{options[:problem_filename]}"
60
- end
61
- end
62
-
63
- def communicate_intermediate_result(_directory)
64
- # noop
65
- end
66
-
67
- def communicate_complete(directory)
68
- File.open("#{directory}/finished.job", 'w') { |f| f << "Finished Workflow #{::Time.now}" }
69
- end
70
-
71
- # Final state of the simulation. The os_directory is the run directory and may be needed to
72
- # zip up the results of the simuation.
73
- def communicate_failure(directory)
74
- File.open("#{directory}/failed.job", 'w') { |f| f << "Failed Workflow #{::Time.now}" }
75
- # @communicate_module.communicate_failure(@communicate_object, os_directory)
76
- end
77
-
78
- def communicate_results(directory, results)
79
- zip_results(directory)
80
-
81
- if results.is_a? Hash
82
- File.open("#{directory}/data_point_out.json", 'w') { |f| f << JSON.pretty_generate(results) }
83
- else
84
- pp "Unknown datapoint result type. Please handle #{results.class}"
85
- # data_point_json_path = OpenStudio::Path.new(run_dir) / OpenStudio::Path.new('data_point_out.json')
86
- # os_data_point.saveJSON(data_point_json_path, true)
87
- end
88
- # end
89
- end
90
-
91
- # For the local adapter send back a handle to a file to append the data. For this adapter
92
- # the log messages are likely to be the same as the run.log messages.
93
- # ?: do we really want two local logs from the Local adapter? One is in the run dir and the other is in the root
94
- def get_logger(directory, _options = {})
95
- @log ||= File.open("#{directory}/local_adapter.log", 'w')
96
- @log
97
- end
98
- end
99
- end
100
- end
101
- end