fixpoints 0.1.2 → 0.1.3

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: fdfded4c7c676dbe7670b38df98318ea3d3728252353b6da8eae9cb906cfb719
4
- data.tar.gz: 2d786c4fbbe81c5607ccbb92d6610e5da8d5d04fe2b7287fffaa62fdcfd72a3d
3
+ metadata.gz: 64fc801ca2cedc0a4abc0de5eda59a90ade61b99b462bff2dcad91c7f11909f7
4
+ data.tar.gz: 60267a9065b27e86f9180a3da0243267a0fcdc7aa45a8b9f35390ad3e5ac5fdc
5
5
  SHA512:
6
- metadata.gz: ab745775d4fe7da0966d0600bce51e8f18ff20dfbc948cb6a4bfbe470371a219d797389b475471a742aee57e360b57e27f4bed4d8275e5dbda8c61807cd641a8
7
- data.tar.gz: 9aa530efeb5c6d3bc9bb368a5cf60f276766257e126c341a508400e6081baca1046fee32502e2885568b59c038bd0b07aaed6c7f846cd824a99ba340c86fbd41
6
+ metadata.gz: 3e6d1e3ae14981d469135f62ca1b5f66f81e8239cbe27b7965694791ac22a79652cea2532cfc8c35f625aa870131d73cb56a9c245ed8d7e4a044d28956702b09
7
+ data.tar.gz: 94b15a4d1b186466eed68c7db66c32f1f73c8bb168a818a46a137181adacddb67756ccdb1f911c1bd6f12a7547033235682616a065829c5719fb8196ba71a379
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- fixpoints (0.1.1)
4
+ fixpoints (0.1.2)
5
5
  activerecord (>= 5.0.0)
6
6
  rspec
7
7
 
data/README.md CHANGED
@@ -85,9 +85,7 @@ A change in a fixpoint might point to an unintended change in code.
85
85
  We need to be be careful to use `let` and `let!` with factories.
86
86
  Records might be created twice when using create in there (once by the fixpoint and once by the factory).
87
87
 
88
- **Ignoring columns**
89
-
90
- Often you might want to add more columns to ignore (e.g. login time stamps):
88
+ **Ignoring columns** Often you might want to add more columns to ignore (e.g. login time stamps):
91
89
 
92
90
  ```ruby
93
91
  let(:ignored_fixpoint_columns) { [:updated_at, :created_at, users: [:last_login_at] }
@@ -0,0 +1,58 @@
1
+ # Helper methods to be included into RSpec
2
+ module FixpointTestHelpers
3
+ def restore_fixpoint(fixname)
4
+ @last_restored = fixname
5
+ IncrementalFixpoint.from_file(fixname).load_into_database
6
+ end
7
+
8
+ # Compares the fixpoint with the records in the database.
9
+ # If there is no such fixpoint yet, it will write a new one to the file system.
10
+ # The latter is useful if the fixpoint was deleted to accommodate changes to it (see example in class description).
11
+ #
12
+ # +tables_to_compare+ can either be +:all+ or a list of table names (e.g. ['users', 'posts'])
13
+ # +ignored_columns+ see Fixnum#records_for_table
14
+ # +store_fixpoint_and_fail+ when given and the fixpoint does not already exist, a new fixpoint is created an the test will be marked pending/failed
15
+ # +parent_fixname+ when storing a new fixpoint, use this as parent fixpoint (you can specify `:last_restored` then the last given to restore_fixpoint is used; not thread safe)
16
+ # ---
17
+ # If we refactor this to a gem, we should rely on rspec (e.g. use minitest or move comparison logic to Fixpoint class).
18
+ # Anyhow, we keep it like this for now, because the expectations give much nicer output than the minitest assertions.
19
+ def compare_fixpoint(fixname, ignored_columns=[:updated_at, :created_at], tables_to_compare: :all, store_fixpoint_and_fail: false, parent_fixname: nil)
20
+ if !IncrementalFixpoint.exists?(fixname)
21
+ if store_fixpoint_and_fail
22
+ store_fixpoint(fixname, parent_fixname)
23
+ pending("Fixpoint \"#{fixname}\" did not exist yet. Skipping comparison, but created fixpoint from database. Try re-running the test.")
24
+ fail
25
+ else
26
+ raise Fixpoint::Error, "Fixpoint #{fixname} does not exist"
27
+ end
28
+ end
29
+
30
+ database_fp = IncrementalFixpoint.from_database
31
+ fixpoint_fp = IncrementalFixpoint.from_file(fixname)
32
+
33
+ tables_to_compare = (database_fp.table_names + fixpoint_fp.table_names).uniq if tables_to_compare == :all
34
+ tables_to_compare.each do |table_name|
35
+ db_records = database_fp.records_for_table(table_name, ignored_columns)
36
+ fp_records = fixpoint_fp.records_for_table(table_name, ignored_columns)
37
+
38
+ # if a table is present in a fixpoint, there must be records in it because empty tables are stripped from fixpoints
39
+ expect(db_records).not_to be_empty, "#{table_name} not in database, but in fixpoint"
40
+ expect(fp_records).not_to be_empty, "#{table_name} not in fixpoint, but in database"
41
+ # we assume that the order of records returned by SELECT is stable (so we do not do any sorting)
42
+ expect(db_records).to eq(fp_records), "Database records for table \"#{table_name}\" did not match fixpoint \"#{fixname}\". Consider removing the fixpoint and re-running the test if the change is intended."
43
+ end
44
+ end
45
+
46
+ # it is not a good idea to overwrite the fixpoint each time because timestamps may change (which then shows up in version control).
47
+ # Hence we only provide a method to write to it if it does not exist.
48
+ def store_fixpoint_unless_present(fixname, parent_fixname = nil)
49
+ store_fixpoint(fixname, parent_fixname) unless IncrementalFixpoint.exists?(fixname)
50
+ end
51
+
52
+ # +parent_fixname+ when given, only the (incremental) changes to the parent are saved
53
+ # please see store_fixpoint_unless_present for note on why not to use this method
54
+ def store_fixpoint(fixname, parent_fixname = nil)
55
+ parent_fixname = @last_restored if parent_fixname == :last_restored
56
+ IncrementalFixpoint.from_database(parent_fixname).save_to_file(fixname)
57
+ end
58
+ end
@@ -1,3 +1,3 @@
1
1
  module Fixpoints
2
- VERSION = "0.1.2"
2
+ VERSION = "0.1.3"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: fixpoints
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.2
4
+ version: 0.1.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Tom Rothe
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-09-14 00:00:00.000000000 Z
11
+ date: 2020-09-15 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activerecord
@@ -55,6 +55,7 @@ files:
55
55
  - fixpoints.gemspec
56
56
  - lib/fixpoint.rb
57
57
  - lib/fixpoint_diff.rb
58
+ - lib/fixpoint_test_helpers.rb
58
59
  - lib/fixpoints.rb
59
60
  - lib/fixpoints/version.rb
60
61
  - lib/incremental_fixpoint.rb