From 2e4eb3d4b5dc037334d9ead5233d27c618b2ff6e Mon Sep 17 00:00:00 2001 From: cryptogopher Date: Fri, 6 Dec 2024 01:17:05 +0100 Subject: [PATCH] Rake task to export default settings as seeds --- README.md | 9 +++++++ config/initializers/core_ext.rb | 1 + db/seeds.rb | 17 +----------- db/seeds/templates/units.erb | 9 +++++++ db/seeds/units.rb | 36 ++++++++++++++++++++++++++ lib/core_ext/big_decimal/formatting.rb | 14 ++++++++++ lib/tasks/db.rake | 12 +++++++++ 7 files changed, 82 insertions(+), 16 deletions(-) create mode 100644 config/initializers/core_ext.rb create mode 100644 db/seeds/templates/units.erb create mode 100644 db/seeds/units.rb create mode 100644 lib/core_ext/big_decimal/formatting.rb create mode 100644 lib/tasks/db.rake diff --git a/README.md b/README.md index c5c1087..138e1d5 100644 --- a/README.md +++ b/README.md @@ -118,6 +118,15 @@ Tests need to be run from within toplevel application directory: bundle exec rails test test/system/users_test.rb --seed 1234 + ### Icons Pictogrammers Material Design Icons: https://pictogrammers.com/library/mdi/ + + +### Rake tasks + +Exporting default settings defined in application to seed file (e.g. to send as +PR or share between installations): + + bundle exec rails db:seed:export diff --git a/config/initializers/core_ext.rb b/config/initializers/core_ext.rb new file mode 100644 index 0000000..5feeadb --- /dev/null +++ b/config/initializers/core_ext.rb @@ -0,0 +1 @@ +require 'core_ext/big_decimal/formatting' diff --git a/db/seeds.rb b/db/seeds.rb index ff9e6e0..335a35f 100644 --- a/db/seeds.rb +++ b/db/seeds.rb @@ -20,19 +20,4 @@ end # Formulas will be deleted as dependent on Quantities #[Source, Quantity, Unit].each { |model| model.defaults.delete_all } -Unit.transaction do - Unit.defaults.delete_all - - unit_1 = Unit.create symbol: "1", name: "dimensionless, one" - Unit.create symbol: "%", base: unit_1, multiplier: 1e-2, name: "percent" - Unit.create symbol: "‰", base: unit_1, multiplier: 1e-3, name: "promille" - Unit.create symbol: "‱", base: unit_1, multiplier: 1e-4, name: "basis point" - Unit.create symbol: "ppm", base: unit_1, multiplier: 1e-6, name: "parts per million" - - unit_g = Unit.create symbol: "g", name: "gram" - Unit.create symbol: "ug", base: unit_g, multiplier: 1e-6, name: "microgram" - Unit.create symbol: "mg", base: unit_g, multiplier: 1e-3, name: "milligram" - Unit.create symbol: "kg", base: unit_g, multiplier: 1e3, name: "kilogram" - - Unit.create symbol: "kcal", name: "kilocalorie" -end +require 'seeds/units.rb' diff --git a/db/seeds/templates/units.erb b/db/seeds/templates/units.erb new file mode 100644 index 0000000..c2d4f88 --- /dev/null +++ b/db/seeds/templates/units.erb @@ -0,0 +1,9 @@ +Unit.transaction do + Unit.defaults.delete_all +<% Unit.defaults.ordered.each do |unit| %> +<%= "\n" if unit.base.nil? %> + unit_<%= unit.symbol %> = + Unit.create symbol: "<%= unit.symbol %>",<% unless unit.base.nil? %> base: unit_<%= unit.base.symbol %>, multiplier: <%= unit.multiplier.to_scientific %>,<% end %> + description: "<%= unit.description %>" +<% end %> +end diff --git a/db/seeds/units.rb b/db/seeds/units.rb new file mode 100644 index 0000000..1b79bf9 --- /dev/null +++ b/db/seeds/units.rb @@ -0,0 +1,36 @@ +Unit.transaction do + Unit.defaults.delete_all + + unit_1 = + Unit.create symbol: "1", + description: "dimensionless, one" + unit_ppm = + Unit.create symbol: "ppm", base: unit_1, multiplier: 1e-6, + description: "parts per million" + unit_‱ = + Unit.create symbol: "‱", base: unit_1, multiplier: 1e-4, + description: "basis point" + unit_‰ = + Unit.create symbol: "‰", base: unit_1, multiplier: 1e-3, + description: "promille" + unit_% = + Unit.create symbol: "%", base: unit_1, multiplier: 1e-2, + description: "percent" + + unit_g = + Unit.create symbol: "g", + description: "gram" + unit_ug = + Unit.create symbol: "ug", base: unit_g, multiplier: 1e-6, + description: "microgram" + unit_mg = + Unit.create symbol: "mg", base: unit_g, multiplier: 1e-3, + description: "milligram" + unit_kg = + Unit.create symbol: "kg", base: unit_g, multiplier: 1e3, + description: "kilogram" + + unit_kcal = + Unit.create symbol: "kcal", + description: "kilocalorie" +end diff --git a/lib/core_ext/big_decimal/formatting.rb b/lib/core_ext/big_decimal/formatting.rb new file mode 100644 index 0000000..ed9bbce --- /dev/null +++ b/lib/core_ext/big_decimal/formatting.rb @@ -0,0 +1,14 @@ +module FixinMe + module BigDecimalScientificNotation + def to_scientific + return 'NaN' unless finite? + + sign, coefficient, base, exponent = split + (sign == -1 ? '-' : '') + + (coefficient.length > 1 ? coefficient.insert(1, '.') : coefficient) + + (exponent != 1 ? "e#{exponent-1}" : '') + end + end +end + +BigDecimal.prepend(FixinMe::BigDecimalScientificNotation) diff --git a/lib/tasks/db.rake b/lib/tasks/db.rake new file mode 100644 index 0000000..f2e5233 --- /dev/null +++ b/lib/tasks/db.rake @@ -0,0 +1,12 @@ +namespace :db do + namespace :seed do + desc "Dump default settings as seed data to db/seeds/*.rb" + task export: :environment do + seeds_path = Pathname.new(Rails.application.paths["db"].first) / 'seeds' + (seeds_path / 'templates').glob('*.erb').each do |template_path| + template = ERB.new(template_path.read, trim_mode: '<>') + (seeds_path / "#{template_path.basename('.*').to_s}.rb").write(template.result) + end + end + end +end