salesforce-dcgen 0.5.0 → 0.6.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.
- checksums.yaml +4 -4
- data/.gitignore +1 -1
- data/README.md +1 -0
- data/bin/dcgen +5 -0
- data/lib/dcgen/app.rb +7 -5
- data/lib/dcgen/plugins/apexclass.rb +6 -4
- data/lib/dcgen/plugins/apexpage.rb +6 -4
- data/lib/dcgen/plugins/apextrigger.rb +6 -4
- data/lib/dcgen/plugins/approvalprocess.rb +6 -4
- data/lib/dcgen/plugins/customfield.rb +7 -4
- data/lib/dcgen/plugins/customobject.rb +6 -4
- data/lib/dcgen/plugins/group.rb +6 -4
- data/lib/dcgen/plugins/label.rb +7 -4
- data/lib/dcgen/plugins/layout.rb +6 -4
- data/lib/dcgen/plugins/permissionset.rb +6 -4
- data/lib/dcgen/plugins/validationrule.rb +46 -0
- data/lib/dcgen/plugins/workflowfieldupdate.rb +6 -4
- data/lib/dcgen/plugins/workflowrule.rb +6 -4
- data/lib/dcgen/version.rb +1 -1
- data/tpl/destructiveChanges.xml.erb +8 -0
- metadata +4 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 686ce608e7d06544dda1e2547578f930ef572215
|
4
|
+
data.tar.gz: df46fd772d024595c3ae6d5c0c95b1804ac20017
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 3490e33b42da93499da6b6f97974a886abd09f7d127fbb04fb2d1b6f9785c64daec937300412ed067789d0758d7d250518f9ceb5109e33de452b95e5b8592af3
|
7
|
+
data.tar.gz: 773cf02f3fcc331ba4e131ebee6900e084d8d6f89671d1e4f704e07f0eab7ecad9cca7a9e4b877fd59f7bcdad747c924093678489c59cf2f59524da8d44a08e9
|
data/.gitignore
CHANGED
data/README.md
CHANGED
data/bin/dcgen
CHANGED
@@ -10,6 +10,10 @@ parser = OptionParser.new do |opts|
|
|
10
10
|
|
11
11
|
opts.banner = 'Usage: dcgen [options]'
|
12
12
|
|
13
|
+
opts.on('-q', '--quiet', 'Disable verbose output') do |dir|
|
14
|
+
options[:quiet] = dir
|
15
|
+
end
|
16
|
+
|
13
17
|
opts.on('-m', '--master dir', 'Source dir') do |dir|
|
14
18
|
options[:master] = dir
|
15
19
|
end
|
@@ -64,6 +68,7 @@ end
|
|
64
68
|
begin
|
65
69
|
dcgen = Dcgen::App.new
|
66
70
|
|
71
|
+
dcgen.verbose = ! options[:quiet]
|
67
72
|
dcgen.master = options[:master]
|
68
73
|
dcgen.destination = options[:destination]
|
69
74
|
dcgen.output = options[:output] if not options[:output].nil?
|
data/lib/dcgen/app.rb
CHANGED
@@ -1,10 +1,11 @@
|
|
1
1
|
module Dcgen
|
2
2
|
class App
|
3
3
|
|
4
|
-
attr_accessor :master, :destination, :output, :exclude
|
4
|
+
attr_accessor :master, :destination, :output, :exclude, :verbose
|
5
5
|
|
6
6
|
def initialize
|
7
7
|
|
8
|
+
@verbose = true
|
8
9
|
@metadata = {}
|
9
10
|
@exclude = []
|
10
11
|
|
@@ -36,8 +37,8 @@ File generated:
|
|
36
37
|
===============
|
37
38
|
|
38
39
|
#{out_file}
|
39
|
-
|
40
|
-
"
|
40
|
+
|
41
|
+
" if @verbose
|
41
42
|
|
42
43
|
end
|
43
44
|
|
@@ -64,16 +65,17 @@ Changes detected:
|
|
64
65
|
validate_directories
|
65
66
|
|
66
67
|
# header output
|
67
|
-
print_header
|
68
|
+
print_header if @verbose
|
68
69
|
|
69
70
|
# Load plugins and build metadata variables
|
70
71
|
plugins = Dir.glob(File.dirname(__FILE__) + "/plugins/*" )
|
71
72
|
|
72
73
|
plugins.each do |plugin|
|
74
|
+
|
73
75
|
require_relative plugin
|
74
76
|
|
75
77
|
plugin_name = plugin.match(/^.*\/(.*).rb$/)[1]
|
76
|
-
plugin_metadata = eval "Dcgen::#{plugin_name} @master, @destination"
|
78
|
+
plugin_metadata = eval "Dcgen::#{plugin_name} @master, @destination, @verbose"
|
77
79
|
@metadata[plugin_name.to_sym] = plugin_metadata - @exclude unless plugin_metadata.nil?
|
78
80
|
|
79
81
|
end
|
@@ -1,15 +1,17 @@
|
|
1
1
|
module Dcgen
|
2
2
|
|
3
|
-
def self.apexclass master , destination
|
3
|
+
def self.apexclass master , destination, output = true
|
4
4
|
|
5
5
|
master_classes = Dir.glob(master + '/classes/*cls').map {|c| c.match(/^.*\/(.*).cls$/)[1] }
|
6
6
|
destination_classes = Dir.glob(destination + '/classes/*cls').map {|c| c.match(/^.*\/(.*).cls$/)[1] }
|
7
7
|
|
8
8
|
remove_classes = destination_classes - master_classes
|
9
9
|
|
10
|
-
|
11
|
-
|
12
|
-
|
10
|
+
if output
|
11
|
+
puts "ApexClasses:" if not remove_classes.empty?
|
12
|
+
remove_classes.each do |apexclass|
|
13
|
+
puts " #{apexclass}"
|
14
|
+
end
|
13
15
|
end
|
14
16
|
|
15
17
|
remove_classes
|
@@ -1,15 +1,17 @@
|
|
1
1
|
module Dcgen
|
2
2
|
|
3
|
-
def self.apexpage master , destination
|
3
|
+
def self.apexpage master , destination, output = true
|
4
4
|
|
5
5
|
master_pages = Dir.glob(master + '/pages/*page').map {|c| c.match(/^.*\/(.*).page$/)[1] }
|
6
6
|
destination_pages = Dir.glob(destination + '/pages/*page').map {|c| c.match(/^.*\/(.*).page$/)[1] }
|
7
7
|
|
8
8
|
remove_pages = destination_pages - master_pages
|
9
9
|
|
10
|
-
|
11
|
-
|
12
|
-
|
10
|
+
if output
|
11
|
+
puts "ApexPages:" if not remove_pages.empty?
|
12
|
+
remove_pages.each do |aplexpage|
|
13
|
+
puts " #{aplexpage}"
|
14
|
+
end
|
13
15
|
end
|
14
16
|
|
15
17
|
remove_pages
|
@@ -1,15 +1,17 @@
|
|
1
1
|
module Dcgen
|
2
2
|
|
3
|
-
def self.apextrigger master , destination
|
3
|
+
def self.apextrigger master , destination, output = true
|
4
4
|
|
5
5
|
master_triggers = Dir.glob(master + '/triggers/*trigger').map {|c| c.match(/^.*\/(.*).trigger$/)[1] }
|
6
6
|
destination_triggers = Dir.glob(destination + '/triggers/*trigger').map {|c| c.match(/^.*\/(.*).trigger$/)[1] }
|
7
7
|
|
8
8
|
remove_triggers = destination_triggers - master_triggers
|
9
9
|
|
10
|
-
|
11
|
-
|
12
|
-
|
10
|
+
if output
|
11
|
+
puts "ApexTriggers:" if not remove_triggers.empty?
|
12
|
+
remove_triggers.each do |apextrigger|
|
13
|
+
puts " #{apextrigger}"
|
14
|
+
end
|
13
15
|
end
|
14
16
|
|
15
17
|
remove_triggers
|
@@ -1,15 +1,17 @@
|
|
1
1
|
module Dcgen
|
2
2
|
|
3
|
-
def self.approvalprocess master , destination
|
3
|
+
def self.approvalprocess master , destination, output = true
|
4
4
|
|
5
5
|
master_approvalprocess = Dir.glob(master + '/approvalProcesses/*approvalProcess').map {|c| c.match(/^.*\/(.*).approvalProcess$/)[1] }
|
6
6
|
destination_approvalprocess = Dir.glob(destination + '/approvalProcesses/*approvalProcess').map {|c| c.match(/^.*\/(.*).approvalProcess$/)[1] }
|
7
7
|
|
8
8
|
remove_approvalprocess = destination_approvalprocess - master_approvalprocess
|
9
9
|
|
10
|
-
|
11
|
-
|
12
|
-
|
10
|
+
if output
|
11
|
+
puts "ApprovalProcesses:" if not remove_approvalprocess.empty?
|
12
|
+
remove_approvalprocess.each do |approvalprocess|
|
13
|
+
puts " #{approvalprocess}"
|
14
|
+
end
|
13
15
|
end
|
14
16
|
|
15
17
|
remove_approvalprocess
|
@@ -2,7 +2,7 @@ require 'nokogiri'
|
|
2
2
|
|
3
3
|
module Dcgen
|
4
4
|
|
5
|
-
def self.customfield master , destination
|
5
|
+
def self.customfield master , destination, output = true
|
6
6
|
|
7
7
|
remove_customfields = []
|
8
8
|
|
@@ -31,9 +31,12 @@ module Dcgen
|
|
31
31
|
|
32
32
|
end
|
33
33
|
|
34
|
-
|
35
|
-
|
36
|
-
puts "
|
34
|
+
|
35
|
+
if output
|
36
|
+
puts "CustomFields:" if not remove_customfields.empty?
|
37
|
+
remove_customfields.each do |customfield|
|
38
|
+
puts " #{customfield}"
|
39
|
+
end
|
37
40
|
end
|
38
41
|
|
39
42
|
remove_customfields
|
@@ -1,15 +1,17 @@
|
|
1
1
|
module Dcgen
|
2
2
|
|
3
|
-
def self.customobject master , destination
|
3
|
+
def self.customobject master , destination, output = true
|
4
4
|
|
5
5
|
master_customobject = Dir.glob(master + '/objects/*object').map {|c| c.match(/^.*\/(.*).object$/)[1] }
|
6
6
|
destination_customobject = Dir.glob(destination + '/objects/*object').map {|c| c.match(/^.*\/(.*).object$/)[1] }
|
7
7
|
|
8
8
|
remove_customobject = destination_customobject - master_customobject
|
9
9
|
|
10
|
-
|
11
|
-
|
12
|
-
|
10
|
+
if output
|
11
|
+
puts "CustomObjects:" if not remove_customobject.empty?
|
12
|
+
remove_customobject.each do |customobject|
|
13
|
+
puts " #{customobject}"
|
14
|
+
end
|
13
15
|
end
|
14
16
|
|
15
17
|
remove_customobject
|
data/lib/dcgen/plugins/group.rb
CHANGED
@@ -1,15 +1,17 @@
|
|
1
1
|
module Dcgen
|
2
2
|
|
3
|
-
def self.group master , destination
|
3
|
+
def self.group master , destination, output = true
|
4
4
|
|
5
5
|
master_groups = Dir.glob(master + '/groups/*group').map {|c| c.match(/^.*\/(.*).group$/)[1] }
|
6
6
|
destination_groups = Dir.glob(destination + '/groups/*group').map {|c| c.match(/^.*\/(.*).group$/)[1] }
|
7
7
|
|
8
8
|
remove_groups = destination_groups - master_groups
|
9
9
|
|
10
|
-
|
11
|
-
|
12
|
-
|
10
|
+
if output
|
11
|
+
puts "Groups:" if not remove_groups.empty?
|
12
|
+
remove_groups.each do |group|
|
13
|
+
puts " #{group}"
|
14
|
+
end
|
13
15
|
end
|
14
16
|
|
15
17
|
remove_groups
|
data/lib/dcgen/plugins/label.rb
CHANGED
@@ -2,7 +2,7 @@ require 'nokogiri'
|
|
2
2
|
|
3
3
|
module Dcgen
|
4
4
|
|
5
|
-
def self.label master , destination
|
5
|
+
def self.label master , destination, output = true
|
6
6
|
|
7
7
|
remove_labels = []
|
8
8
|
|
@@ -31,9 +31,12 @@ module Dcgen
|
|
31
31
|
|
32
32
|
end
|
33
33
|
|
34
|
-
|
35
|
-
|
36
|
-
puts "
|
34
|
+
|
35
|
+
if output
|
36
|
+
puts "Labels:" if not remove_labels.empty?
|
37
|
+
remove_labels.each do |label|
|
38
|
+
puts " #{label}"
|
39
|
+
end
|
37
40
|
end
|
38
41
|
|
39
42
|
remove_labels
|
data/lib/dcgen/plugins/layout.rb
CHANGED
@@ -1,15 +1,17 @@
|
|
1
1
|
module Dcgen
|
2
2
|
|
3
|
-
def self.layout master , destination
|
3
|
+
def self.layout master , destination, output = true
|
4
4
|
|
5
5
|
master_layout = Dir.glob(master + '/layouts/*layout').map {|c| c.match(/^.*\/(.*).layout$/)[1] }
|
6
6
|
destination_layout = Dir.glob(destination + '/layouts/*layout').map {|c| c.match(/^.*\/(.*).layout$/)[1] }
|
7
7
|
|
8
8
|
remove_layout = destination_layout - master_layout
|
9
9
|
|
10
|
-
|
11
|
-
|
12
|
-
|
10
|
+
if output
|
11
|
+
puts "Layouts:" if not remove_layout.empty?
|
12
|
+
remove_layout.each do |layout|
|
13
|
+
puts " #{layout}"
|
14
|
+
end
|
13
15
|
end
|
14
16
|
|
15
17
|
remove_layout
|
@@ -1,15 +1,17 @@
|
|
1
1
|
module Dcgen
|
2
2
|
|
3
|
-
def self.permissionset master , destination
|
3
|
+
def self.permissionset master , destination, output = true
|
4
4
|
|
5
5
|
master_permissionset = Dir.glob(master + '/permissionsets/*permissionset').map {|c| c.match(/^.*\/(.*).permissionset$/)[1] }
|
6
6
|
destination_permissionset = Dir.glob(destination + '/permissionsets/*permissionset').map {|c| c.match(/^.*\/(.*).permissionset$/)[1] }
|
7
7
|
|
8
8
|
remove_permissionset = destination_permissionset - master_permissionset
|
9
9
|
|
10
|
-
|
11
|
-
|
12
|
-
|
10
|
+
if output
|
11
|
+
puts "PermissionSets:" if not remove_permissionset.empty?
|
12
|
+
remove_permissionset.each do |permissionset|
|
13
|
+
puts " #{permissionset}"
|
14
|
+
end
|
13
15
|
end
|
14
16
|
|
15
17
|
remove_permissionset
|
@@ -0,0 +1,46 @@
|
|
1
|
+
require 'nokogiri'
|
2
|
+
|
3
|
+
module Dcgen
|
4
|
+
|
5
|
+
def self.validationrule master , destination, output = true
|
6
|
+
|
7
|
+
remove_validationrules = []
|
8
|
+
|
9
|
+
master_obj = Dir.glob(master + '/objects/*object').map {|c| c.match(/^.*\/(.*).object$/)[1] }
|
10
|
+
|
11
|
+
master_obj.each do |obj|
|
12
|
+
|
13
|
+
master_obj_file = File.join(master,'objects',obj + '.object')
|
14
|
+
destination_obj_file = File.join(destination,'objects',obj + '.object')
|
15
|
+
|
16
|
+
if File.exists? destination_obj_file
|
17
|
+
|
18
|
+
master_obj_xml = File.open(master_obj_file).read
|
19
|
+
destination_obj_xml = File.open(destination_obj_file).read
|
20
|
+
|
21
|
+
master_obj_xml = Nokogiri::XML(master_obj_xml).remove_namespaces!
|
22
|
+
destination_obj_xml = Nokogiri::XML(destination_obj_xml).remove_namespaces!
|
23
|
+
|
24
|
+
# Find all the customfields that are in destination, if they are not present in
|
25
|
+
# master, then they have to be in the remove list
|
26
|
+
destination_obj_xml.xpath('//validationRules/fullName').each do |vr|
|
27
|
+
remove_validationrules << "#{obj}.#{vr.text}" if master_obj_xml.xpath("//validationRules[fullName=\"#{vr.text}\"]").empty?
|
28
|
+
end
|
29
|
+
|
30
|
+
end
|
31
|
+
|
32
|
+
end
|
33
|
+
|
34
|
+
|
35
|
+
if output
|
36
|
+
puts "ValidationRules:" if not remove_validationrules.empty?
|
37
|
+
remove_validationrules.each do |obj|
|
38
|
+
puts " #{obj}"
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
remove_validationrules
|
43
|
+
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
@@ -2,7 +2,7 @@ require 'nokogiri'
|
|
2
2
|
|
3
3
|
module Dcgen
|
4
4
|
|
5
|
-
def self.workflowfieldupdate master , destination
|
5
|
+
def self.workflowfieldupdate master , destination, output = true
|
6
6
|
|
7
7
|
remove_fieldupdates = []
|
8
8
|
|
@@ -31,9 +31,11 @@ module Dcgen
|
|
31
31
|
|
32
32
|
end
|
33
33
|
|
34
|
-
|
35
|
-
|
36
|
-
|
34
|
+
if output
|
35
|
+
puts "FieldUpdates:" if not remove_fieldupdates.empty?
|
36
|
+
remove_fieldupdates.each do |fieldupdate|
|
37
|
+
puts " #{fieldupdate}"
|
38
|
+
end
|
37
39
|
end
|
38
40
|
|
39
41
|
remove_fieldupdates
|
@@ -2,7 +2,7 @@ require 'nokogiri'
|
|
2
2
|
|
3
3
|
module Dcgen
|
4
4
|
|
5
|
-
def self.workflowrule master , destination
|
5
|
+
def self.workflowrule master , destination, output = true
|
6
6
|
|
7
7
|
remove_workflowrules = []
|
8
8
|
|
@@ -31,9 +31,11 @@ module Dcgen
|
|
31
31
|
|
32
32
|
end
|
33
33
|
|
34
|
-
|
35
|
-
|
36
|
-
|
34
|
+
if output
|
35
|
+
puts "WorkflowRules:" if not remove_workflowrules.empty?
|
36
|
+
remove_workflowrules.each do |workflowrule|
|
37
|
+
puts " #{workflowrule}"
|
38
|
+
end
|
37
39
|
end
|
38
40
|
|
39
41
|
remove_workflowrules
|
data/lib/dcgen/version.rb
CHANGED
@@ -88,6 +88,14 @@
|
|
88
88
|
<name>Layout</name>
|
89
89
|
</types>
|
90
90
|
<% end %>
|
91
|
+
<% if not @metadata[:validationrule].empty? %>
|
92
|
+
<types>
|
93
|
+
<% for @validationrule in @metadata[:validationrule] %>
|
94
|
+
<members><%= @validationrule %></members>
|
95
|
+
<% end %>
|
96
|
+
<name>ValidationRule</name>
|
97
|
+
</types>
|
98
|
+
<% end %>
|
91
99
|
<% if not @metadata[:customobject].empty? %>
|
92
100
|
<types>
|
93
101
|
<% for @customobject in @metadata[:customobject] %>
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: salesforce-dcgen
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.6.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Juan Breinlinger
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2015-01-08 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -78,6 +78,7 @@ files:
|
|
78
78
|
- lib/dcgen/plugins/label.rb
|
79
79
|
- lib/dcgen/plugins/layout.rb
|
80
80
|
- lib/dcgen/plugins/permissionset.rb
|
81
|
+
- lib/dcgen/plugins/validationrule.rb
|
81
82
|
- lib/dcgen/plugins/workflowfieldupdate.rb
|
82
83
|
- lib/dcgen/plugins/workflowrule.rb
|
83
84
|
- lib/dcgen/version.rb
|
@@ -103,7 +104,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
103
104
|
version: '0'
|
104
105
|
requirements: []
|
105
106
|
rubyforge_project:
|
106
|
-
rubygems_version: 2.
|
107
|
+
rubygems_version: 2.4.3
|
107
108
|
signing_key:
|
108
109
|
specification_version: 4
|
109
110
|
summary: dcgen will generate a destructiveChanges.xml by comparing two source directories
|