culturecode_stagehand 0.10.2 → 0.11.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: bd8d168cfca3a30f6904f1f84fc27d7eec96d5d5
4
- data.tar.gz: 4ae03b6e5e13aed6c1d13d85e5dc2fe3470dec26
3
+ metadata.gz: 631cfae3a83514e2678436cf359e33af77f49234
4
+ data.tar.gz: 40ad332a8e324c076e8cbff79d678657db0d58a6
5
5
  SHA512:
6
- metadata.gz: cb78f8ebdb79f4b9441cf79ecf81577428efe58a90cfd664f6f8ed5716c5b2984098fb3575c8d25859c06b728d4c53140ba006a510bec5bfdb65fbd16f81e097
7
- data.tar.gz: 18f250b45b7f14dc3437c6121766c1215b8aeaf1b5b84225990732962ce70483621880d04278503cfb2b73d43bb44d2dff7621c12bd02127391dd1f0dcd1b3e1
6
+ metadata.gz: a52cace12d2485973e0443c2a44eee10a4c2df86f4c429b1db29ea3b8a7f2b9fb7830e325594016ea2e6851b95d2f54c37094dc85d2d750e91d896190015a66b
7
+ data.tar.gz: 05c33366d9c63aecce718f89a442bef8119b895f1bdd42066d81f738a46e7d0d89a6d6011125c398adff0e9c04737d8a4f21e836f5378ca48ed048c6cf9ec358
@@ -0,0 +1,84 @@
1
+ require 'graphviz'
2
+
3
+ module Stagehand
4
+ module Auditor
5
+ class ChecklistVisualizer
6
+ def initialize(checklist, show_all_commits: false)
7
+ entries = checklist.affected_entries.select(&:commit_id)
8
+
9
+ @graph = GraphViz.new( :G, :type => :graph );
10
+ @commits = Hash.new {|hash, commit_id| hash[commit_id] = Stagehand::Staging::CommitEntry.find(commit_id) }
11
+ nodes = Hash.new
12
+ edges = []
13
+
14
+ # Detect edges
15
+ entries.group_by(&:key).each_value do |entries|
16
+ entries.combination(2).each do |entry_a, entry_b|
17
+ current_edge = [entry_a, entry_b]
18
+ next if edges.detect {|edge| edge.sort == current_edge.sort }
19
+ next if same_node?(entry_a, entry_b)
20
+ next if same_subject?(entry_a, entry_b)
21
+ edges << current_edge
22
+ end
23
+ end
24
+
25
+ # Create Subgraph nodes for commits with connections to other subjects
26
+ entries = edges.flatten.uniq unless show_all_commits
27
+ entries.group_by {|entry| commit_subject(entry) }.each do |subject, entries|
28
+ subgraph = create_subgraph(subject, @graph)
29
+ entries.each do |entry|
30
+ nodes[entry] = create_node(entry, subgraph)
31
+ end
32
+ end
33
+
34
+ # Create edges
35
+ edges.each do |entry_a, entry_b|
36
+ create_edge(nodes[entry_a], nodes[entry_b], :label => edge_label(entry_a, entry_b))
37
+ end
38
+ end
39
+
40
+ def output(file_name, format: File.extname(file_name)[1..-1])
41
+ @graph.output(format => file_name)
42
+ File.open(file_name)
43
+ end
44
+
45
+ private
46
+
47
+ def create_subgraph(subject, graph)
48
+ graph.add_graph("cluster_#{subject}", :label => subject, :style => :filled, :color => :lightgrey)
49
+ end
50
+
51
+ def create_edge(node_a, node_b, options = {})
52
+ @graph.add_edges(node_a, node_b, options.reverse_merge(:color => :red, :fontcolor => :red))
53
+ end
54
+
55
+ def create_node(entry, graph)
56
+ graph.add_nodes(node_name(entry), :shape => :rect, :style => :filled, :fillcolor => :white)
57
+ end
58
+
59
+ def edge_label(entry_a, entry_b)
60
+ pretty_key(entry_a)
61
+ end
62
+
63
+ def same_node?(entry_a, entry_b)
64
+ node_name(entry_a) == node_name(entry_b)
65
+ end
66
+
67
+ def same_subject?(entry_a, entry_b)
68
+ commit_subject(entry_a) == commit_subject(entry_b)
69
+ end
70
+
71
+ def commit_subject(entry)
72
+ pretty_key(@commits[entry.commit_id])
73
+ end
74
+
75
+ def node_name(entry)
76
+ "Commit #{entry.commit_id}"
77
+ end
78
+
79
+ def pretty_key(entry)
80
+ "#{entry.table_name.classify} #{entry.record_id}"
81
+ end
82
+ end
83
+ end
84
+ end
@@ -1,3 +1,5 @@
1
+ require 'stagehand/auditor/checklist_visualizer'
2
+
1
3
  module Stagehand
2
4
  module Auditor
3
5
  extend self
@@ -64,6 +66,14 @@ module Stagehand
64
66
  return output
65
67
  end
66
68
 
69
+ def visualize(subject, output_file_name, options = {})
70
+ visualize_checklist(Staging::Checklist.new(subject), output_file_name, options)
71
+ end
72
+
73
+ def visualize_checklist(checklist, output_file_name, options = {})
74
+ ChecklistVisualizer.new(checklist, options).output(output_file_name)
75
+ end
76
+
67
77
  private
68
78
 
69
79
  # Incomplete End Operation that are not the last entry in their session
@@ -5,13 +5,13 @@ module Stagehand
5
5
  CommitEntry.start_operations.pluck(:id).collect {|id| find(id) }
6
6
  end
7
7
 
8
- def self.capture(subject_record = nil, &block)
8
+ def self.capture(subject_record = nil, except: [], &block)
9
9
  start_operation = start_commit(subject_record)
10
10
  init_session!(start_operation)
11
11
  block.call(start_operation)
12
- return end_commit(start_operation)
12
+ return end_commit(start_operation, except)
13
13
  rescue => e
14
- end_commit(start_operation)
14
+ end_commit(start_operation, except)
15
15
  raise(e)
16
16
  end
17
17
 
@@ -45,13 +45,12 @@ module Stagehand
45
45
 
46
46
  # Sets the commit_id on all the entries between the start and end op.
47
47
  # Returns the commit object for those entries
48
- def self.end_commit(start_operation)
48
+ def self.end_commit(start_operation, except)
49
49
  end_operation = CommitEntry.end_operations.create(:session => start_operation.session)
50
50
 
51
- CommitEntry
52
- .where(:id => start_operation.id..end_operation.id)
53
- .where(:session => start_operation.session)
54
- .update_all(:commit_id => start_operation.id)
51
+ scope = CommitEntry.where(:id => start_operation.id..end_operation.id, :session => start_operation.session)
52
+ scope = scope.where('table_name NOT IN (?) OR table_name IS NULL', except) if except.present?
53
+ scope.update_all(:commit_id => start_operation.id)
55
54
 
56
55
  return new(start_operation.id)
57
56
  end
@@ -9,8 +9,8 @@ module Stagehand
9
9
  end
10
10
 
11
11
  # Creates a stagehand commit to log database changes associated with the given record
12
- def stage_changes(subject_record = nil, &block)
13
- Staging::Commit.capture(subject_record, &block)
12
+ def stage_changes(*args, &block)
13
+ Staging::Commit.capture(*args, &block)
14
14
  end
15
15
 
16
16
  # Syncs the given record and all affected records to the production database
@@ -1,3 +1,3 @@
1
1
  module Stagehand
2
- VERSION = "0.10.2"
2
+ VERSION = "0.11.0"
3
3
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: culturecode_stagehand
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.10.2
4
+ version: 0.11.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Nicholas Jakobsen
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2016-11-02 00:00:00.000000000 Z
12
+ date: 2016-11-14 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rails
@@ -39,6 +39,20 @@ dependencies:
39
39
  - - ">="
40
40
  - !ruby/object:Gem::Version
41
41
  version: '0'
42
+ - !ruby/object:Gem::Dependency
43
+ name: ruby-graphviz
44
+ requirement: !ruby/object:Gem::Requirement
45
+ requirements:
46
+ - - ">="
47
+ - !ruby/object:Gem::Version
48
+ version: '0'
49
+ type: :runtime
50
+ prerelease: false
51
+ version_requirements: !ruby/object:Gem::Requirement
52
+ requirements:
53
+ - - ">="
54
+ - !ruby/object:Gem::Version
55
+ version: '0'
42
56
  - !ruby/object:Gem::Dependency
43
57
  name: rspec-rails
44
58
  requirement: !ruby/object:Gem::Requirement
@@ -69,6 +83,7 @@ files:
69
83
  - lib/stagehand.rb
70
84
  - lib/stagehand/active_record_extensions.rb
71
85
  - lib/stagehand/auditor.rb
86
+ - lib/stagehand/auditor/checklist_visualizer.rb
72
87
  - lib/stagehand/cache.rb
73
88
  - lib/stagehand/configuration.rb
74
89
  - lib/stagehand/connection_adapter_extensions.rb
@@ -109,7 +124,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
109
124
  version: '0'
110
125
  requirements: []
111
126
  rubyforge_project:
112
- rubygems_version: 2.6.7
127
+ rubygems_version: 2.5.1
113
128
  signing_key:
114
129
  specification_version: 4
115
130
  summary: Simplify the management of a sandbox database that can sync content to a