record_loader 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (35) hide show
  1. checksums.yaml +7 -0
  2. data/.github/workflows/cops_and_specs.yml +39 -0
  3. data/.gitignore +11 -0
  4. data/.rspec +3 -0
  5. data/.rubocop.yml +51 -0
  6. data/.ruby-version +1 -0
  7. data/.travis.yml +7 -0
  8. data/.yardopts +4 -0
  9. data/CHANGELOG.md +16 -0
  10. data/Gemfile +8 -0
  11. data/Gemfile.lock +70 -0
  12. data/LICENSE +24 -0
  13. data/README.md +182 -0
  14. data/Rakefile +36 -0
  15. data/bin/console +11 -0
  16. data/bin/setup +8 -0
  17. data/lib/generators/record_loader/USAGE +36 -0
  18. data/lib/generators/record_loader/record_loader_generator.rb +55 -0
  19. data/lib/generators/record_loader/static_files/application_record_loader.rb +13 -0
  20. data/lib/generators/record_loader/static_files/record_loader.rake +11 -0
  21. data/lib/generators/record_loader/templates/config/record_loader/%underscores%/default_records.yml +11 -0
  22. data/lib/generators/record_loader/templates/lib/record_loader/%underscore_loader%.rb.tt +16 -0
  23. data/lib/generators/record_loader/templates/lib/tasks/record_loader/%underscore%.rake.tt +13 -0
  24. data/lib/generators/record_loader/templates/spec/data/record_loader/%underscores%/two_entry_example.yml +5 -0
  25. data/lib/generators/record_loader/templates/spec/lib/record_loader/%underscore_loader%_spec.rb.tt +31 -0
  26. data/lib/record_loader/adapter/basic.rb +48 -0
  27. data/lib/record_loader/adapter/rails.rb +33 -0
  28. data/lib/record_loader/adapter.rb +58 -0
  29. data/lib/record_loader/base.rb +160 -0
  30. data/lib/record_loader/railtie.rb +9 -0
  31. data/lib/record_loader/record_file.rb +51 -0
  32. data/lib/record_loader/version.rb +6 -0
  33. data/lib/record_loader.rb +15 -0
  34. data/record_loader.gemspec +55 -0
  35. metadata +192 -0
@@ -0,0 +1,31 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'rails_helper'
4
+ require 'record_loader/<%= underscore_loader %>'
5
+
6
+ # This file was initially generated via `rails g record_loader`
7
+ RSpec.describe RecordLoader::<%= loader_class_name %>, type: :model, loader: true do
8
+ subject(:record_loader) do
9
+ described_class.new(directory: test_directory, files: selected_files)
10
+ end
11
+
12
+ # Tests use a separate directory to avoid coupling your specs to the data
13
+ let(:test_directory) { Rails.root.join('spec/data/record_loader/<%= underscores %>') }
14
+
15
+ context 'with two_entry_example selected' do
16
+ let(:selected_files) { 'two_entry_example' }
17
+
18
+ it 'creates two records' do
19
+ expect { record_loader.create! }.to change { <%= record_class %>.count }.by(2)
20
+ end
21
+
22
+ # It is important that multiple runs of a RecordLoader do not create additional
23
+ # copies of existing records.
24
+ it 'is idempotent' do
25
+ record_loader.create!
26
+ expect { record_loader.create! }.not_to change { <%= record_class %>.count }
27
+ end
28
+
29
+ it 'sets attributes on the created records'
30
+ end
31
+ end
@@ -0,0 +1,48 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'logger'
4
+
5
+ module RecordLoader
6
+ module Adapter
7
+ #
8
+ # A very basic {RecordLoader::Adapter} which provides limited logging
9
+ # functionality, environment is extracted from RACK_ENV
10
+ #
11
+ class Basic
12
+ # @return [Logger] The configured logger instance
13
+ attr_reader :logger
14
+
15
+ #
16
+ # Create a new {RecordLoader::Adapter::Basic}. Can pass in a pre-existing
17
+ # logger is required.
18
+ # @see https://ruby-doc.org/stdlib-2.5.0/libdoc/logger/rdoc/Logger.html
19
+ #
20
+ # @param [#debug&#info&#warn#&error&#fatal] logger Optional logger object. Creates a new ruby Logger by default.
21
+ #
22
+ def initialize(logger: Logger.new(STDOUT))
23
+ @logger = logger
24
+ end
25
+
26
+ #
27
+ # Impliments the RecordLoader::Adapter interface by providing a transaction
28
+ # method. Used by {RecordLoader::Base.create!}. This implimentation
29
+ # yields immediately, but otherwise performs no other functions.
30
+ #
31
+ # @return [Void]
32
+ #
33
+ def transaction
34
+ yield
35
+ end
36
+
37
+ #
38
+ # Returns whether we are running in a development environment
39
+ # Determined by looking at RACK_ENV
40
+ #
41
+ # @return [Boolean] True if in development
42
+ #
43
+ def development?
44
+ ENV.fetch('RACK_ENV', 'unknown').casecmp?('development')
45
+ end
46
+ end
47
+ end
48
+ end
@@ -0,0 +1,33 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RecordLoader
4
+ module Adapter
5
+ # An adapter designed for use with Rails applications. Automatically wraps {RecordLoader::Base.create!} in an
6
+ # active record transaction, and directs logging to the configure rails logger. Environment is extracted
7
+ # from Rails.env
8
+ class Rails
9
+ # Wraps Rails.logger method
10
+ # @return [#debug&#info&#warn#&error&#fatal]
11
+ def logger
12
+ ::Rails.logger
13
+ end
14
+
15
+ #
16
+ # Wraps the ActiveRecord::Base.transaction method.
17
+ # @see https://api.rubyonrails.org/classes/ActiveRecord/Transactions/ClassMethods.html
18
+ # @return [Void]
19
+ def transaction(&block)
20
+ ActiveRecord::Base.transaction(&block)
21
+ end
22
+
23
+ #
24
+ # Returns whether we are running in a development environment
25
+ #
26
+ # @return [Boolean] True is in development
27
+ #
28
+ def development?
29
+ ::Rails.env.development?
30
+ end
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,58 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'adapter/basic'
4
+ require_relative 'adapter/rails'
5
+
6
+ module RecordLoader
7
+ #
8
+ # {RecordLoader::Adapter}s provide a means of wrapping various framework
9
+ # methods in order to use {RecordLoader} outside of Rails and ActiveRecord.
10
+ #
11
+ # = Existing Adapters
12
+ # There are currently two adapters available
13
+ #
14
+ # - {RecordLoader::Adapter::Basic}
15
+ # A simple general purpose adapter which provides no support for transactions and only basic logging.
16
+ #
17
+ # - {RecordLoader::Adapter::Rails}
18
+ # An adapter designed for use with Rails applications. Automatically wraps {RecordLoader::Base.create!} in an
19
+ # active record transaction, and directs logging to the configure rails logger.
20
+ #
21
+ # = Custom Adapters
22
+ # It is possible to create custom adapters to use with your own frameworks. It is suggested that you inherit from
23
+ # {RecordLoader::Adapter::Basic} to provide forward compatibility with future versions of RecordLoader.
24
+ #
25
+ # Custom adapters should support three instance methods:
26
+ #
27
+ # - transaction(&block)
28
+ # Wraps the {RecordLoader::Base.create!} and allows you to handle transactional rollbacks in the event that
29
+ # something goes wrong. This method recieves a block and should be yielded to to generate the records.
30
+ #
31
+ # - logger
32
+ # Should return a logger object which impliments: debug, info, warn, error, fatal methods
33
+ #
34
+ # - development?
35
+ # Returns true if we are running in development mode.
36
+ #
37
+ # @example my_adapter.rb
38
+ # class MyAdapter < RecordLoader::Adapter::Basic
39
+ # def transaction
40
+ # Database.open_transaction
41
+ # yield
42
+ # Database.commit_transaction
43
+ # rescue StandardError
44
+ # Database.abort_transaction
45
+ # end
46
+ #
47
+ # def logger
48
+ # DistributedLoggingSystem.logger
49
+ # end
50
+ # end
51
+ #
52
+ # @example application_record_loader.rb
53
+ # class ApplicationRecordLoader
54
+ # adapter MyAdapter.new
55
+ # end
56
+ module Adapter
57
+ end
58
+ end
@@ -0,0 +1,160 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'yaml'
4
+
5
+ module RecordLoader
6
+ # Inherit from RecordLoader base to automatically load one or more yaml files
7
+ # into a @config hash. Config folders are found in config/default_records
8
+ # and each loader should specify its own subfolder by setting the config_folder
9
+ # class attribute.
10
+ class Base
11
+ # @return [Array] The default route to the yaml files containing the records
12
+ # path is relative to the root directory of your application
13
+ # and will contain a subfolder for each record loader.
14
+ BASE_CONFIG_PATH = %w[config default_records].freeze
15
+
16
+ class << self
17
+ # @overload config_folder(config_folder)
18
+ # Sets the folder, located under {BASE_CONFIG_PATH}, from which the records
19
+ # will be loaded.
20
+ #
21
+ # @param [String] config_folder Set the config folder for the class
22
+ #
23
+ # @return [String] The configured config folder
24
+ #
25
+ # @overload config_folder
26
+ # Returns the folder, located under {BASE_CONFIG_PATH}, from which the records
27
+ # will be loaded.
28
+ #
29
+ # @return [String] The configured config folder
30
+ #
31
+ def config_folder(config_folder = nil)
32
+ @config_folder = config_folder unless config_folder.nil?
33
+ @config_folder
34
+ end
35
+
36
+ # @overload adapter(adapter)
37
+ # Sets the {RecordLoader::Adapter adapter} to use for the record loader, see the {RecordLoader::Adapter adapter}
38
+ # for further information.
39
+ #
40
+ # @param [Object] adapter Set the adapter to use for the class
41
+ #
42
+ # @return [Object] The configured adapter
43
+ #
44
+ # @overload adapter
45
+ # Returns the configured adapter
46
+ #
47
+ # @return [Object] The configured adapter
48
+ #
49
+ def adapter(adapter = nil)
50
+ @adapter = adapter unless adapter.nil?
51
+ @adapter || superclass.adapter
52
+ end
53
+ end
54
+
55
+ adapter RecordLoader::Adapter::Basic.new
56
+
57
+ #
58
+ # Create a new config loader from yaml files
59
+ #
60
+ # @param files [Array<String>,NilClass] pass in an array of file names to load, or nil to load all files.
61
+ # Dev and wip flags will be ignored for files passed in explicitly
62
+ # @param directory [Pathname, String] The directory from which to load the files.
63
+ # defaults to config/default_records/plate_purposes
64
+ # @param dev [Boolean] Override the rails environment to generate (or not) data from dev.yml files.
65
+ #
66
+ def initialize(files: nil, directory: default_path, dev: adapter.development?)
67
+ @path = directory.is_a?(Pathname) ? directory : Pathname.new(directory)
68
+ @dev = dev
69
+ @files = @path.glob("*#{RecordFile::EXTENSION}")
70
+ .select { |child| load_file?(files, RecordFile.new(child)) }
71
+ load_config
72
+ end
73
+
74
+ #
75
+ # Opens a transaction and creates or updates each of the records in the yml files
76
+ # via the #create_or_update! method
77
+ #
78
+ # @return [Void]
79
+ def create!
80
+ adapter.transaction do
81
+ @config.each do |key, config|
82
+ create_or_update!(key, config)
83
+ end
84
+ end
85
+ end
86
+
87
+ private
88
+
89
+ # Returns the configured adapter
90
+ #
91
+ # @return [Object] The configured adapter
92
+ #
93
+ def adapter
94
+ self.class.adapter
95
+ end
96
+
97
+ #
98
+ # Returns the default route to the yaml files containing the records path
99
+ # is relative to the root directory of your application and will contain a
100
+ # subfolder for each record loader.
101
+ #
102
+ # Redefine this method in ApplicationRecordLoader to overide the default
103
+ # configuration.
104
+ #
105
+ # @example
106
+ # RecordLoader::Base.base_config_path # => ['config', 'default_records']
107
+ #
108
+ # @return [Array] base path for record loader record
109
+ #
110
+ def base_config_path
111
+ BASE_CONFIG_PATH
112
+ end
113
+
114
+ # Returns an array of WIP flags
115
+ def wip_list
116
+ ENV.fetch('WIP', '').split(',')
117
+ end
118
+
119
+ #
120
+ # The default path to load config files from
121
+ #
122
+ # @return [Pathname] The directory containing the yml files
123
+ #
124
+ def default_path
125
+ Pathname.pwd.join(*base_config_path, self.class.config_folder)
126
+ end
127
+
128
+ #
129
+ # Indicates that a file should be loaded
130
+ #
131
+ # @param [Array] list provides an array of files (minus extenstions) to load
132
+ # @param [Pathname] file The file to check
133
+ #
134
+ # @return [Boolean] returns true if the file should be loaded
135
+ #
136
+ def load_file?(list, file)
137
+ if list.nil?
138
+ return @dev if file.dev?
139
+ return wip_list.include?(file.basename) if file.wip?
140
+
141
+ true
142
+ else
143
+ # If we've provided a list, that's all that matters
144
+ list.include?(file.basename)
145
+ end
146
+ end
147
+
148
+ #
149
+ # Load the appropriate configuration files into @config
150
+ #
151
+ def load_config
152
+ @config = @files.each_with_object({}) do |file, store|
153
+ latest_file = YAML.load_file(file)
154
+ duplicate_keys = store.keys & latest_file.keys
155
+ adapter.logger.warn "Duplicate keys in #{@path}: #{duplicate_keys}" unless duplicate_keys.empty?
156
+ store.merge!(latest_file)
157
+ end
158
+ end
159
+ end
160
+ end
@@ -0,0 +1,9 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RecordLoader
4
+ # Adds Railtie hooks for Rails usage
5
+ # This class is only loaded if rails is detected
6
+ # This sets up the generators
7
+ class Railtie < Rails::Railtie
8
+ end
9
+ end
@@ -0,0 +1,51 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RecordLoader
4
+ # A RecordFile is a wrapper to handle categorization of the yaml files
5
+ # used by RecordLoader
6
+ class RecordFile
7
+ # @return [String] Extension of the yaml files to load.
8
+ EXTENSION = '.yml'
9
+ # @return [String] The tag immediately prior to the extension that flags a
10
+ # file as being development specific. For example a file
11
+ # names users.dev.yaml
12
+ DEV_IDENTIFIER = '.dev'
13
+ # @return [String] The tag immediately prior to the extension that flags a
14
+ # file as being work-in-progress. For example a file
15
+ # names new_feature.wip.yaml
16
+ WIP_IDENTIFIER = '.wip'
17
+
18
+ # Create a RecordFile wrapper for a given file
19
+ # @param record_file [Pathname] The path of the file to wrap
20
+ def initialize(record_file)
21
+ @record_file = record_file
22
+ end
23
+
24
+ # Returns the name of the file, minus the extension and dev/wip flags
25
+ # @return [String] The name of the file eg. "000_purpose"
26
+ def basename
27
+ without_extension.delete_suffix(WIP_IDENTIFIER)
28
+ .delete_suffix(DEV_IDENTIFIER)
29
+ end
30
+
31
+ # Returns true if the file is development environment specific
32
+ # ie. ends in .dev.yml
33
+ # @return [Boolean] True if the file is a dev file
34
+ def dev?
35
+ without_extension.end_with?(DEV_IDENTIFIER)
36
+ end
37
+
38
+ # Returns true if the file is flagged as WIP
39
+ # ie. ends in .wip.yml
40
+ # @return [Boolean] True if the file is a wip file
41
+ def wip?
42
+ without_extension.end_with?(WIP_IDENTIFIER)
43
+ end
44
+
45
+ private
46
+
47
+ def without_extension
48
+ @record_file.basename(EXTENSION).to_s
49
+ end
50
+ end
51
+ end
@@ -0,0 +1,6 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RecordLoader
4
+ # @return [String] The current sem-ver version number
5
+ VERSION = '0.1.0'
6
+ end
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'record_loader/version'
4
+ require 'record_loader/adapter'
5
+ require 'record_loader/base'
6
+ require 'record_loader/record_file'
7
+
8
+ # Only load the railtie is we detect rails
9
+ require 'record_loader/railtie' if defined?(Rails)
10
+
11
+ # Root namespace of RecordLoader
12
+ module RecordLoader
13
+ # Raised when it appears RecordLoader is improperly configured
14
+ ConfigurationError = Class.new(StandardError)
15
+ end
@@ -0,0 +1,55 @@
1
+ # frozen_string_literal: true
2
+
3
+ lib = File.expand_path('lib', __dir__)
4
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
5
+ require 'record_loader/version'
6
+
7
+ Gem::Specification.new do |spec|
8
+ spec.name = 'record_loader'
9
+ spec.version = RecordLoader::VERSION
10
+ spec.authors = ['James Glover']
11
+ spec.email = ['james.glover@sanger.ac.uk']
12
+
13
+ spec.summary = 'Easily manage seeding and updating data from simple yml files'
14
+ spec.description = 'Provides a simple interface for generating and maintaining database
15
+ records across multiple environments in a simple and reproducible manner.'
16
+ spec.homepage = 'https://www.github.com/sanger/record_loader'
17
+ spec.license = 'MIT'
18
+
19
+ spec.required_ruby_version = '>= 2.5.0'
20
+
21
+ # Prevent pushing this gem to RubyGems.org. To allow pushes either set the 'allowed_push_host'
22
+ # to allow pushing to a single host or delete this section to allow pushing to any host.
23
+ if spec.respond_to?(:metadata)
24
+ # spec.metadata["allowed_push_host"] = "TODO: Set to 'http://mygemserver.com'"
25
+
26
+ spec.metadata['homepage_uri'] = spec.homepage
27
+ spec.metadata['source_code_uri'] = 'https://www.github.com/sanger/record_loader'
28
+ # spec.metadata["changelog_uri"] = "TODO: Put your gem's CHANGELOG.md URL here."
29
+ else
30
+ raise 'RubyGems 2.0 or newer is required to protect against ' \
31
+ 'public gem pushes.'
32
+ end
33
+
34
+ # Specify which files should be added to the gem when it is released.
35
+ # The `git ls-files -z` loads the files in the RubyGem that have been added into git.
36
+ spec.files = Dir.chdir(File.expand_path(__dir__)) do
37
+ `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
38
+ end
39
+ spec.bindir = 'exe'
40
+ spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
41
+ spec.require_paths = ['lib']
42
+
43
+ # Development dependencies
44
+ spec.add_development_dependency 'bundler', '~> 2.1'
45
+ spec.add_development_dependency 'pry', '~> 0.13'
46
+ spec.add_development_dependency 'rake', '~> 12.3'
47
+ spec.add_development_dependency 'rspec', '~> 3.0'
48
+ spec.add_development_dependency 'rubocop', '~> 0.82'
49
+ spec.add_development_dependency 'rubocop-rspec', '~> 1.39'
50
+ spec.add_development_dependency 'yard', '~> 0.9'
51
+ # Pin simplecov to ~> 0.17 until CodeClimate compatibility
52
+ # issues resolved:
53
+ # https://github.com/codeclimate/test-reporter/issues/413
54
+ spec.add_development_dependency 'simplecov', '~> 0.17.0'
55
+ end
metadata ADDED
@@ -0,0 +1,192 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: record_loader
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - James Glover
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2020-05-14 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: bundler
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '2.1'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '2.1'
27
+ - !ruby/object:Gem::Dependency
28
+ name: pry
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '0.13'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '0.13'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rake
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '12.3'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '12.3'
55
+ - !ruby/object:Gem::Dependency
56
+ name: rspec
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '3.0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '3.0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: rubocop
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: '0.82'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: '0.82'
83
+ - !ruby/object:Gem::Dependency
84
+ name: rubocop-rspec
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: '1.39'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - "~>"
95
+ - !ruby/object:Gem::Version
96
+ version: '1.39'
97
+ - !ruby/object:Gem::Dependency
98
+ name: yard
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - "~>"
102
+ - !ruby/object:Gem::Version
103
+ version: '0.9'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - "~>"
109
+ - !ruby/object:Gem::Version
110
+ version: '0.9'
111
+ - !ruby/object:Gem::Dependency
112
+ name: simplecov
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - "~>"
116
+ - !ruby/object:Gem::Version
117
+ version: 0.17.0
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - "~>"
123
+ - !ruby/object:Gem::Version
124
+ version: 0.17.0
125
+ description: |-
126
+ Provides a simple interface for generating and maintaining database
127
+ records across multiple environments in a simple and reproducible manner.
128
+ email:
129
+ - james.glover@sanger.ac.uk
130
+ executables: []
131
+ extensions: []
132
+ extra_rdoc_files: []
133
+ files:
134
+ - ".github/workflows/cops_and_specs.yml"
135
+ - ".gitignore"
136
+ - ".rspec"
137
+ - ".rubocop.yml"
138
+ - ".ruby-version"
139
+ - ".travis.yml"
140
+ - ".yardopts"
141
+ - CHANGELOG.md
142
+ - Gemfile
143
+ - Gemfile.lock
144
+ - LICENSE
145
+ - README.md
146
+ - Rakefile
147
+ - bin/console
148
+ - bin/setup
149
+ - lib/generators/record_loader/USAGE
150
+ - lib/generators/record_loader/record_loader_generator.rb
151
+ - lib/generators/record_loader/static_files/application_record_loader.rb
152
+ - lib/generators/record_loader/static_files/record_loader.rake
153
+ - lib/generators/record_loader/templates/config/record_loader/%underscores%/default_records.yml
154
+ - lib/generators/record_loader/templates/lib/record_loader/%underscore_loader%.rb.tt
155
+ - lib/generators/record_loader/templates/lib/tasks/record_loader/%underscore%.rake.tt
156
+ - lib/generators/record_loader/templates/spec/data/record_loader/%underscores%/two_entry_example.yml
157
+ - lib/generators/record_loader/templates/spec/lib/record_loader/%underscore_loader%_spec.rb.tt
158
+ - lib/record_loader.rb
159
+ - lib/record_loader/adapter.rb
160
+ - lib/record_loader/adapter/basic.rb
161
+ - lib/record_loader/adapter/rails.rb
162
+ - lib/record_loader/base.rb
163
+ - lib/record_loader/railtie.rb
164
+ - lib/record_loader/record_file.rb
165
+ - lib/record_loader/version.rb
166
+ - record_loader.gemspec
167
+ homepage: https://www.github.com/sanger/record_loader
168
+ licenses:
169
+ - MIT
170
+ metadata:
171
+ homepage_uri: https://www.github.com/sanger/record_loader
172
+ source_code_uri: https://www.github.com/sanger/record_loader
173
+ post_install_message:
174
+ rdoc_options: []
175
+ require_paths:
176
+ - lib
177
+ required_ruby_version: !ruby/object:Gem::Requirement
178
+ requirements:
179
+ - - ">="
180
+ - !ruby/object:Gem::Version
181
+ version: 2.5.0
182
+ required_rubygems_version: !ruby/object:Gem::Requirement
183
+ requirements:
184
+ - - ">="
185
+ - !ruby/object:Gem::Version
186
+ version: '0'
187
+ requirements: []
188
+ rubygems_version: 3.0.3
189
+ signing_key:
190
+ specification_version: 4
191
+ summary: Easily manage seeding and updating data from simple yml files
192
+ test_files: []