chrono_model 1.2.2 → 2.0.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 (95) hide show
  1. checksums.yaml +4 -4
  2. data/LICENSE +19 -20
  3. data/README.md +62 -40
  4. data/lib/active_record/connection_adapters/chronomodel_adapter.rb +17 -11
  5. data/lib/active_record/tasks/chronomodel_database_tasks.rb +64 -23
  6. data/lib/chrono_model/adapter/ddl.rb +168 -153
  7. data/lib/chrono_model/adapter/indexes.rb +99 -94
  8. data/lib/chrono_model/adapter/migrations.rb +81 -104
  9. data/lib/chrono_model/adapter/migrations_modules/legacy.rb +41 -0
  10. data/lib/chrono_model/adapter/migrations_modules/stable.rb +41 -0
  11. data/lib/chrono_model/adapter/tsrange.rb +20 -5
  12. data/lib/chrono_model/adapter/upgrade.rb +89 -91
  13. data/lib/chrono_model/adapter.rb +64 -31
  14. data/lib/chrono_model/chrono.rb +17 -0
  15. data/lib/chrono_model/conversions.rb +15 -9
  16. data/lib/chrono_model/db_console.rb +9 -0
  17. data/lib/chrono_model/json.rb +9 -6
  18. data/lib/chrono_model/patches/as_of_time_holder.rb +2 -2
  19. data/lib/chrono_model/patches/as_of_time_relation.rb +2 -2
  20. data/lib/chrono_model/patches/association.rb +15 -12
  21. data/lib/chrono_model/patches/batches.rb +17 -0
  22. data/lib/chrono_model/patches/db_console.rb +20 -4
  23. data/lib/chrono_model/patches/join_node.rb +4 -4
  24. data/lib/chrono_model/patches/preloader.rb +41 -11
  25. data/lib/chrono_model/patches/relation.rb +53 -8
  26. data/lib/chrono_model/patches.rb +3 -1
  27. data/lib/chrono_model/railtie.rb +29 -24
  28. data/lib/chrono_model/time_gate.rb +3 -3
  29. data/lib/chrono_model/time_machine/history_model.rb +65 -31
  30. data/lib/chrono_model/time_machine/time_query.rb +65 -49
  31. data/lib/chrono_model/time_machine/timeline.rb +52 -28
  32. data/lib/chrono_model/time_machine.rb +66 -25
  33. data/lib/chrono_model/utilities.rb +3 -3
  34. data/lib/chrono_model/version.rb +3 -1
  35. data/lib/chrono_model.rb +31 -36
  36. metadata +39 -136
  37. data/.gitignore +0 -21
  38. data/.rspec +0 -2
  39. data/.travis.yml +0 -41
  40. data/Gemfile +0 -4
  41. data/README.sql +0 -161
  42. data/Rakefile +0 -25
  43. data/chrono_model.gemspec +0 -33
  44. data/gemfiles/rails_5.0.gemfile +0 -6
  45. data/gemfiles/rails_5.1.gemfile +0 -6
  46. data/gemfiles/rails_5.2.gemfile +0 -6
  47. data/spec/aruba/dbconsole_spec.rb +0 -25
  48. data/spec/aruba/fixtures/database_with_default_username_and_password.yml +0 -14
  49. data/spec/aruba/fixtures/database_without_username_and_password.yml +0 -11
  50. data/spec/aruba/fixtures/empty_structure.sql +0 -27
  51. data/spec/aruba/fixtures/migrations/56/20160812190335_create_impressions.rb +0 -10
  52. data/spec/aruba/fixtures/migrations/56/20171115195229_add_temporal_extension_to_impressions.rb +0 -10
  53. data/spec/aruba/fixtures/railsapp/config/application.rb +0 -17
  54. data/spec/aruba/fixtures/railsapp/config/boot.rb +0 -5
  55. data/spec/aruba/fixtures/railsapp/config/environments/development.rb +0 -38
  56. data/spec/aruba/migrations_spec.rb +0 -48
  57. data/spec/aruba/rake_task_spec.rb +0 -71
  58. data/spec/chrono_model/adapter/base_spec.rb +0 -157
  59. data/spec/chrono_model/adapter/ddl_spec.rb +0 -243
  60. data/spec/chrono_model/adapter/indexes_spec.rb +0 -72
  61. data/spec/chrono_model/adapter/migrations_spec.rb +0 -312
  62. data/spec/chrono_model/conversions_spec.rb +0 -43
  63. data/spec/chrono_model/history_models_spec.rb +0 -32
  64. data/spec/chrono_model/json_ops_spec.rb +0 -59
  65. data/spec/chrono_model/time_machine/as_of_spec.rb +0 -188
  66. data/spec/chrono_model/time_machine/changes_spec.rb +0 -50
  67. data/spec/chrono_model/time_machine/counter_cache_race_spec.rb +0 -46
  68. data/spec/chrono_model/time_machine/default_scope_spec.rb +0 -37
  69. data/spec/chrono_model/time_machine/history_spec.rb +0 -104
  70. data/spec/chrono_model/time_machine/keep_cool_spec.rb +0 -27
  71. data/spec/chrono_model/time_machine/manipulations_spec.rb +0 -84
  72. data/spec/chrono_model/time_machine/model_identification_spec.rb +0 -46
  73. data/spec/chrono_model/time_machine/sequence_spec.rb +0 -74
  74. data/spec/chrono_model/time_machine/sti_spec.rb +0 -100
  75. data/spec/chrono_model/time_machine/time_query_spec.rb +0 -261
  76. data/spec/chrono_model/time_machine/timeline_spec.rb +0 -63
  77. data/spec/chrono_model/time_machine/timestamps_spec.rb +0 -43
  78. data/spec/chrono_model/time_machine/transactions_spec.rb +0 -69
  79. data/spec/config.travis.yml +0 -5
  80. data/spec/config.yml.example +0 -9
  81. data/spec/spec_helper.rb +0 -33
  82. data/spec/support/adapter/helpers.rb +0 -53
  83. data/spec/support/adapter/structure.rb +0 -44
  84. data/spec/support/aruba.rb +0 -44
  85. data/spec/support/connection.rb +0 -70
  86. data/spec/support/matchers/base.rb +0 -56
  87. data/spec/support/matchers/column.rb +0 -99
  88. data/spec/support/matchers/function.rb +0 -79
  89. data/spec/support/matchers/index.rb +0 -69
  90. data/spec/support/matchers/schema.rb +0 -39
  91. data/spec/support/matchers/table.rb +0 -275
  92. data/spec/support/time_machine/helpers.rb +0 -47
  93. data/spec/support/time_machine/structure.rb +0 -111
  94. data/sql/json_ops.sql +0 -56
  95. data/sql/uninstall-json_ops.sql +0 -24
data/.travis.yml DELETED
@@ -1,41 +0,0 @@
1
- sudo: false
2
-
3
- language: ruby
4
- cache: bundler
5
-
6
- rvm:
7
- - 2.3
8
- - 2.4
9
- - 2.5
10
-
11
- gemfile:
12
- - gemfiles/rails_5.0.gemfile
13
- - gemfiles/rails_5.1.gemfile
14
- - gemfiles/rails_5.2.gemfile
15
-
16
- addons:
17
- code_climate:
18
- repo_token: dedfb7472ee410eec459bff3681d9a8fd8dd237e9bd7e8675a7c8eb7e253bba9
19
-
20
- postgresql: "10"
21
- apt:
22
- packages:
23
- - postgresql-10
24
- - postgresql-client-10
25
-
26
- before_install:
27
- - sudo sed -i -e '/local.*peer/s/postgres/all/' -e 's/peer\|md5/trust/g' /etc/postgresql/*/main/pg_hba.conf
28
- - sudo /etc/init.d/postgresql restart
29
- - sleep 2
30
- - psql -c "CREATE DATABASE chronomodel;" -U postgres
31
- - psql -c "CREATE DATABASE chronomodel_railsapp;" -U postgres
32
-
33
- env:
34
- global:
35
- - PGPORT=5433
36
-
37
- script:
38
- - bundle exec rake TEST_CONFIG=./spec/config.travis.yml
39
-
40
- after_success:
41
- - bundle exec codeclimate-test-reporter
data/Gemfile DELETED
@@ -1,4 +0,0 @@
1
- source 'https://rubygems.org'
2
-
3
- # Specify your gem's dependencies in chrono_model.gemspec
4
- gemspec
data/README.sql DELETED
@@ -1,161 +0,0 @@
1
- ------------------------------------------------------
2
- -- Temporal schema for an example "countries" relation
3
- --
4
- -- http://github.com/ifad/chronomodel
5
- --
6
- create schema temporal; -- schema containing all temporal tables
7
- create schema history; -- schema containing all history tables
8
-
9
- -- Current countries data - nothing special
10
- --
11
- create table temporal.countries (
12
- id serial primary key,
13
- name varchar,
14
- updated_at timestamptz
15
- );
16
-
17
- -- Countries historical data.
18
- --
19
- -- Inheritance is used to avoid duplicating the schema from the main table.
20
- -- Please note that columns on the main table cannot be dropped, and other caveats
21
- -- http://www.postgresql.org/docs/9.0/static/ddl-inherit.html#DDL-INHERIT-CAVEATS
22
- --
23
- create table history.countries (
24
- hid serial primary key,
25
- validity tsrange,
26
- recorded_at timestamp not null default timezone('UTC', now()),
27
-
28
- constraint overlapping_times exclude using gist ( id with =, validity with && )
29
-
30
- ) inherits ( temporal.countries );
31
-
32
- -- Inherited primary key
33
- create index country_inherit_pkey on history.countries ( id );
34
-
35
- -- Snapshot of data at a specific point in time
36
- create index country_snapshot on history.countries USING gist ( validity );
37
-
38
- -- Used by the trigger functions when UPDATE'ing and DELETE'ing
39
- create index country_lower_validity on history.countries ( lower(validity) )
40
- create index country_upper_validity on history.countries ( upper(validity) )
41
- create index country_recorded_at on history.countries ( id, valid_to )
42
-
43
- -- Single instance whole history
44
- create index country_instance_history on history.countries ( id, recorded_at )
45
-
46
-
47
- -- The countries view, what the Rails' application ORM will actually CRUD on,
48
- -- and the entry point of the temporal triggers.
49
- --
50
- -- SELECT - return only current data
51
- --
52
- create view public.countries as select * from only temporal.countries;
53
-
54
- -- INSERT - insert data both in the current data table and in the history one.
55
- --
56
- create or replace function public.chronomodel_countries_insert() returns trigger as $$
57
- begin
58
- if new.id is null then
59
- new.id = nextval('temporal.countries_id_seq');
60
- end if;
61
-
62
- insert into temporal.countries ( id, name, updated_at )
63
- values ( new.id, new.name, new.updated_at );
64
-
65
- insert into history.countries (id, name, updated_at, validity )
66
- values ( new.id, new.name, new.updated_at, tsrange(timezone('utc', now()), null) );
67
-
68
- return new;
69
- end;
70
- $$ language plpgsql;
71
-
72
- create trigger chronomodel_insert
73
- instead of insert on public.countries
74
- for each row execute procedure public.chronomodel_countries_insert();
75
-
76
- -- UPDATE - set the last history entry validity to now, save the current data
77
- -- in a new history entry and update the temporal table with the new data.
78
- --
79
- -- If a row in the history with the current ID and current timestamp already
80
- -- exists, update it with new data. This logic makes possible to "squash"
81
- -- together changes made in a transaction in a single history row.
82
- --
83
- -- If the update doesn't change the data, it is skipped and the trigger
84
- -- returns NULL.
85
- --
86
- -- By default, history is not recorded if only the updated_at field
87
- -- is changed.
88
- --
89
- create function chronomodel_countries_update() returns trigger as $$
90
- declare _now timestamp;
91
- declare _hid integer;
92
- declare _old record;
93
- declare _new record;
94
- begin
95
-
96
- if old is not distinct from new then
97
- return null;
98
- end if;
99
-
100
- _old := row(old.name);
101
- _new := row(new.name);
102
-
103
- if _old is not distinct from new then
104
- update only temporal.countries set ( name, updated_at ) = ( new.name, new.updated_at ) where id = old.id
105
- return new;
106
- end if;
107
-
108
- _now := timezone('utc', now());
109
- _hid := null;
110
-
111
- select hid into _hid from history.countries where id = old.id and lower(validity) = _now;
112
-
113
- if _hid is not null then
114
- update history.countries set ( name, updated_at ) = ( new.name ) where hid = _hid;
115
- else
116
- update history.countries set validity = tsrange(lower(validity), _now)
117
- where id = old.id and upper_inf(validity);
118
-
119
- insert into history.countries ( id, name, updated_at, validity )
120
- values ( old.id, new.name, new.updated_at, tsrange(_now, null) );
121
- end if;
122
-
123
- update only temporal.countries set ( name ) = ( new.name ) where id = old.id;
124
-
125
- return new;
126
- end;
127
- $$ language plpgsql;
128
-
129
- create trigger chronomodel_update
130
- instead of update on temporal.countries
131
- for each row execute procedure chronomodel_countries_update();
132
-
133
- -- DELETE - save the current data in the history and eventually delete the
134
- -- data from the temporal table.
135
- --
136
- -- The first DELETE is required to remove history for records INSERTed and
137
- -- DELETEd in the same transaction.
138
- --
139
- create or replace function chronomodel_countries_delete() returns trigger as $$
140
- declare _now timestamp;
141
- begin
142
- _now := timezone('utc', now());
143
-
144
- delete from history.countries
145
- where id = old.id and validity = tsrange(_now, null);
146
-
147
- update history.countries set valid_to = _now
148
- where id = old.id and upper_inf(validity);
149
-
150
- delete from only temporal.countries
151
- where temporal.id = old.id;
152
-
153
- return old;
154
- end;
155
- $$ language plpgsql;
156
-
157
- create trigger chronomodel_delete
158
- instead of delete on temporal.countries
159
- for each row execute procedure chronomodel_countries_delete();
160
-
161
- -- EOF
data/Rakefile DELETED
@@ -1,25 +0,0 @@
1
- #!/usr/bin/env rake
2
- require "bundler/gem_tasks"
3
-
4
- # RSpec
5
- require 'rspec/core/rake_task'
6
- RSpec::Core::RakeTask.new do |spec|
7
- spec.rspec_opts = '-f doc'
8
- end
9
- task :default => ['testapp:create', :spec]
10
-
11
- # Create a test Rails app in tmp/railsapp for testing the rake
12
- # tasks and overall Rails integration with Aruba.
13
- #
14
- namespace :testapp do
15
- desc 'Create a dummy rails application for testing in /tmp'
16
- task :create do
17
- FileUtils.mkdir_p('tmp/aruba')
18
- Dir.chdir('tmp') do
19
- FileUtils.rm_rf('railsapp')
20
- sh 'rails new railsapp --skip-bundle'
21
- end
22
- FileUtils.cp_r('spec/aruba/fixtures/railsapp/.', 'tmp/railsapp/')
23
- FileUtils.rm('tmp/railsapp/Gemfile')
24
- end
25
- end
data/chrono_model.gemspec DELETED
@@ -1,33 +0,0 @@
1
- # -*- encoding: utf-8 -*-
2
- require File.expand_path('../lib/chrono_model/version', __FILE__)
3
-
4
- Gem::Specification.new do |gem|
5
- gem.authors = ['Marcello Barnaba', 'Peter Joseph Brindisi']
6
- gem.email = ['vjt@openssl.it', 'p.brindisi@ifad.org']
7
- gem.description = %q{Give your models as-of date temporal extensions. Built entirely for PostgreSQL >= 9.3}
8
- gem.summary = %q{Temporal extensions (SCD Type II) for Active Record}
9
- gem.homepage = 'https://github.com/ifad/chronomodel'
10
-
11
- gem.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
12
- gem.files = `git ls-files`.split("\n")
13
- gem.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
14
- gem.name = "chrono_model"
15
- gem.require_paths = ["lib"]
16
- gem.version = ChronoModel::VERSION
17
-
18
- gem.add_dependency 'activerecord', '>= 5.0.0'
19
- gem.add_dependency "pg"
20
- gem.add_dependency "multi_json"
21
-
22
- gem.add_development_dependency 'rails'
23
- gem.add_development_dependency 'aruba'
24
- gem.add_development_dependency 'pry'
25
- gem.add_development_dependency 'hirb'
26
- gem.add_development_dependency 'byebug'
27
- gem.add_development_dependency 'rspec'
28
- gem.add_development_dependency 'rake'
29
- gem.add_development_dependency 'fuubar'
30
- gem.add_development_dependency 'simplecov'
31
- gem.add_development_dependency 'codeclimate-test-reporter'
32
- end
33
-
@@ -1,6 +0,0 @@
1
- source "https://rubygems.org"
2
-
3
- gem "activerecord", "~> 5.0.0"
4
- gem "rails", "~> 5.0.0"
5
-
6
- gemspec :path => "../"
@@ -1,6 +0,0 @@
1
- source "https://rubygems.org"
2
-
3
- gem "activerecord", "~> 5.1.0"
4
- gem "rails", "~> 5.1.0"
5
-
6
- gemspec :path => "../"
@@ -1,6 +0,0 @@
1
- source "https://rubygems.org"
2
-
3
- gem "activerecord", "~> 5.2.0"
4
- gem "rails", "~> 5.2.0"
5
-
6
- gemspec :path => "../"
@@ -1,25 +0,0 @@
1
- # The db consle does not work on Rails 5.0
2
- #
3
- unless Bundler.default_gemfile.to_s =~ /rails_5.0/
4
-
5
-
6
- require 'spec_helper'
7
-
8
- describe 'rails dbconsole' do
9
- before do
10
- write_file(
11
- 'config/database.yml',
12
- File.read(File.expand_path('fixtures/database_without_username_and_password.yml', __dir__)))
13
- end
14
-
15
- describe 'rails dbconsole', type: :aruba do
16
- let(:action) { run_command("bash -c \"echo 'select 1 as foo_column; \\q' | bundle exec rails db\"") }
17
- let(:last_command) { action && last_command_started }
18
-
19
- specify { expect(last_command).to be_successfully_executed }
20
- specify { expect(last_command).to have_output(/\bfoo_column\b/) }
21
- end
22
- end
23
-
24
-
25
- end
@@ -1,14 +0,0 @@
1
- default: &default
2
- username: postgres
3
- password: ""
4
- adapter: chronomodel
5
- encoding: unicode
6
- pool: 20
7
- database: chronomodel_railsapp
8
-
9
- development:
10
- <<: *default
11
-
12
- test:
13
- <<: *default
14
-
@@ -1,11 +0,0 @@
1
- default: &default
2
- adapter: chronomodel
3
- encoding: unicode
4
- pool: 20
5
- database: chronomodel_railsapp
6
-
7
- development:
8
- <<: *default
9
-
10
- test:
11
- <<: *default
@@ -1,27 +0,0 @@
1
- SET statement_timeout = 0;
2
- SET lock_timeout = 0;
3
- SET client_encoding = 'UTF8';
4
- SET standard_conforming_strings = on;
5
- SET check_function_bodies = false;
6
- SET client_min_messages = warning;
7
-
8
- --
9
- -- Name: plpgsql; Type: EXTENSION; Schema: -; Owner: -
10
- --
11
-
12
- CREATE EXTENSION IF NOT EXISTS plpgsql WITH SCHEMA pg_catalog;
13
-
14
-
15
- --
16
- -- Name: EXTENSION plpgsql; Type: COMMENT; Schema: -; Owner: -
17
- --
18
-
19
- COMMENT ON EXTENSION plpgsql IS 'PL/pgSQL procedural language';
20
-
21
-
22
- --
23
- -- PostgreSQL database dump complete
24
- --
25
-
26
- SET search_path TO "$user", public;
27
-
@@ -1,10 +0,0 @@
1
- class CreateImpressions < ActiveRecord::Migration[5.0]
2
- def change
3
- create_table :impressions do |t|
4
- t.integer :response
5
- t.decimal :amount
6
-
7
- t.timestamps
8
- end
9
- end
10
- end
@@ -1,10 +0,0 @@
1
- class AddTemporalExtensionToImpressions < ActiveRecord::Migration[5.0]
2
- def self.up
3
- enable_extension 'btree_gist' unless extension_enabled?('btree_gist')
4
- change_table :impressions, temporal: true, copy_data: true
5
- end
6
-
7
- def self.down
8
- change_table :impressions, temporal: false
9
- end
10
- end
@@ -1,17 +0,0 @@
1
- require_relative 'boot'
2
-
3
- require 'rails/all'
4
-
5
- # Require the gems listed in Gemfile, including any gems
6
- # you've limited to :test, :development, or :production.
7
- Bundler.require(*Rails.groups)
8
-
9
- module Railsapp
10
- class Application < Rails::Application
11
- # Initialize configuration defaults for originally generated Rails version.
12
- config.active_record.schema_format = :sql
13
- # Settings in config/environments/* take precedence over those specified here.
14
- # Application configuration should go into files in config/initializers
15
- # -- all .rb files in that directory are automatically loaded.
16
- end
17
- end
@@ -1,5 +0,0 @@
1
- # Set up gems listed in the Gemfile.
2
- ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../../../Gemfile', __dir__)
3
-
4
- require 'bundler/setup' if File.exist?(ENV['BUNDLE_GEMFILE'])
5
- $LOAD_PATH.unshift File.expand_path('../../../lib', __dir__)
@@ -1,38 +0,0 @@
1
- Rails.application.configure do
2
- # Settings specified here will take precedence over those in config/application.rb.
3
-
4
- # In the development environment your application's code is reloaded on
5
- # every request. This slows down response time but is perfect for development
6
- # since you don't have to restart the web server when you make code changes.
7
- config.cache_classes = false
8
-
9
- # Do not eager load code on boot.
10
- config.eager_load = false
11
-
12
- # Show full error reports.
13
- config.consider_all_requests_local = true
14
-
15
- # Don't care if the mailer can't send.
16
- config.action_mailer.raise_delivery_errors = false
17
-
18
- # Print deprecation notices to the Rails logger.
19
- config.active_support.deprecation = :log
20
-
21
- # Raise an error on page load if there are pending migrations.
22
- config.active_record.migration_error = :page_load
23
-
24
- # Debug mode disables concatenation and preprocessing of assets.
25
- # This option may cause significant delays in view rendering with a large
26
- # number of complex assets.
27
- config.assets.debug = true
28
-
29
- # Suppress logger output for asset requests.
30
- config.assets.quiet = true
31
-
32
- # Raises error for missing translations
33
- # config.action_view.raise_on_missing_translations = true
34
-
35
- # Use an evented file watcher to asynchronously detect changes in source code,
36
- # routes, locales, etc. This feature depends on the listen gem.
37
- # config.file_watcher = ActiveSupport::EventedFileUpdateChecker
38
- end
@@ -1,48 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe 'database migrations', type: :aruba do
4
- context 'after a migration was generated' do
5
- before { write_file('config/database.yml',
6
- File.read(File.expand_path('fixtures/database_without_username_and_password.yml', __dir__))) }
7
-
8
- before { run_command_and_stop('bundle exec rails g migration CreateModels name:string') }
9
-
10
- describe 'bundle exec rake db:migrate' do
11
- let(:action) { run_command('bundle exec rake db:migrate') }
12
- let(:last_command) { action && last_command_started }
13
-
14
- specify { expect(last_command).to be_successfully_executed }
15
- specify { expect(last_command).to have_output(/CreateModels: migrated/) }
16
- end
17
- end
18
-
19
-
20
- describe 'rerun bundle exec rake db:drop db:create db:migrate', issue: 56 do
21
- let(:command) { 'bundle exec rake db:drop db:create db:migrate' }
22
- before do
23
- copy(
24
- '../../spec/aruba/fixtures/database_without_username_and_password.yml',
25
- 'config/database.yml'
26
- )
27
- copy(
28
- '../../spec/aruba/fixtures/migrations/56/',
29
- 'db/migrate'
30
- )
31
- end
32
-
33
- let(:action) { run_command(command) }
34
- let(:regex) { /-- change_table\(:impressions, {:temporal=>true, :copy_data=>true}\)/ }
35
-
36
- describe 'once' do
37
- let(:last_command) { action && last_command_started }
38
- specify { expect(last_command).to be_successfully_executed }
39
- specify { expect(last_command).to have_output(regex) }
40
- end
41
-
42
- describe 'twice' do
43
- let(:last_command) { run_command_and_stop(command) && action && last_command_started }
44
- specify { expect(last_command).to be_successfully_executed }
45
- specify { expect(last_command).to have_output(regex) }
46
- end
47
- end
48
- end
@@ -1,71 +0,0 @@
1
- require 'spec_helper'
2
-
3
- # add :announce_stdout, :announce_stderr, before the type: aruba tag in order
4
- # to see the commmands' stdout and stderr output.
5
- #
6
- describe 'rake tasks', type: :aruba do
7
- describe 'bundle exec rake -T' do
8
- before { run_command_and_stop('bundle exec rake -T') }
9
- subject { last_command_started }
10
-
11
- it { is_expected.to have_output(/db:structure:load/) }
12
- end
13
-
14
- describe 'db:structure:load' do
15
- let(:action) { run_command('bundle exec rake db:structure:load') }
16
- let(:last_command) { action && last_command_started }
17
-
18
- context 'given a file db/structure.sql' do
19
- let(:structure_sql) { 'fixtures/empty_structure.sql' }
20
- before { write_file('db/structure.sql', File.read(File.expand_path(structure_sql, __dir__))) }
21
- before { write_file('config/database.yml', File.read(File.expand_path(database_yml, __dir__))) }
22
-
23
- subject { expect(last_command).to be_successfully_executed }
24
-
25
- context 'with default username and password', issue: 55 do
26
- let(:database_yml) { 'fixtures/database_with_default_username_and_password.yml' }
27
-
28
- # Handle Homebrew on MacOS, whose database superuser name is
29
- # equal to the name of the current user.
30
- #
31
- before do
32
- if which 'brew'
33
- file_mangle!('config/database.yml') do |contents|
34
- contents.sub('username: postgres', "username: #{Etc.getlogin}")
35
- end
36
- end
37
- end
38
-
39
- specify { subject }
40
- end
41
-
42
- context 'without a specified username and password', issue: 55 do
43
- let(:database_yml) { 'fixtures/database_without_username_and_password.yml' }
44
-
45
- specify { subject }
46
- end
47
- end
48
- end
49
-
50
- describe 'db:data:dump' do
51
- let(:database_yml) { 'fixtures/database_without_username_and_password.yml' }
52
- before { write_file('config/database.yml', File.read(File.expand_path(database_yml, __dir__))) }
53
-
54
- before { run_command_and_stop('bundle exec rake db:data:dump DUMP=db/test.sql') }
55
-
56
- it { expect(last_command_started).to be_successfully_executed }
57
- it { expect('db/test.sql').to be_an_existing_file }
58
- end
59
-
60
- describe 'db:data:load' do
61
- let(:database_yml) { 'fixtures/database_without_username_and_password.yml' }
62
- before { write_file('config/database.yml', File.read(File.expand_path(database_yml, __dir__))) }
63
-
64
- let(:structure_sql) { 'fixtures/empty_structure.sql' }
65
- before { write_file('db/test.sql', File.read(File.expand_path(structure_sql, __dir__))) }
66
-
67
- before { run_command_and_stop('bundle exec rake db:data:load DUMP=db/test.sql') }
68
-
69
- it { expect(last_command_started).to be_successfully_executed }
70
- end
71
- end