mdata 1.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.
- checksums.yaml +7 -0
- data/bin/mdata +252 -0
- data/lib/mdata/metadata/Profile.rb +87 -0
- data/lib/mdata/metadata.rb +1 -0
- data/lib/mdata/types/ApexClassAccess.rb +14 -0
- data/lib/mdata/types/ApexPageAccess.rb +14 -0
- data/lib/mdata/types/ApplicationVisibility.rb +15 -0
- data/lib/mdata/types/CustomPermissions.rb +14 -0
- data/lib/mdata/types/ExternalDataSourceAccess.rb +14 -0
- data/lib/mdata/types/FieldLevelSecurity.rb +52 -0
- data/lib/mdata/types/LayoutAssignments.rb +14 -0
- data/lib/mdata/types/LoginHours.rb +26 -0
- data/lib/mdata/types/LoginIpRange.rb +15 -0
- data/lib/mdata/types/ObjectPermissions.rb +19 -0
- data/lib/mdata/types/RecordTypeVisibility.rb +16 -0
- data/lib/mdata/types/TabVisibility.rb +14 -0
- data/lib/mdata/types/UserPermission.rb +14 -0
- data/lib/mdata/types.rb +13 -0
- data/lib/mdata.rb +2 -0
- metadata +105 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 59ba3c43a2d5c4a92d35f80cd17e376009691f59
|
4
|
+
data.tar.gz: 3fd5301f77852b750e80218a71170c42f30db8ba
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: a7f0de6579e18a699d0e08aaff78deadcf7e5ff03cb395e0cca8ea1d2a635832881f4288c902185181d9c2323ff6c58c9a14481afab892d240d5cf587a7a7c10
|
7
|
+
data.tar.gz: f9642aed7d6d97e4f35f58d1dca0b042636a70cfe47434103b009838878e2d2d4eb1e6fae4c49cf3f6f62ef5500e168a316ed8c0c429eb30fd3fda045a388527
|
data/bin/mdata
ADDED
@@ -0,0 +1,252 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require 'rubygems'
|
4
|
+
require 'commander/import'
|
5
|
+
require 'mdata/metadata'
|
6
|
+
require 'terminal-table'
|
7
|
+
|
8
|
+
program :version, '1.0.0'
|
9
|
+
program :description, 'Your Salesforce metadata navigator and manipulator'
|
10
|
+
program :help, 'Author', 'Ben Burwell <ben.burwell@trifecta.com>'
|
11
|
+
|
12
|
+
global_option '--dir DIRECTORY', String, 'Specify a custom directory to search in'
|
13
|
+
|
14
|
+
command 'profile create' do |c|
|
15
|
+
c.syntax = 'mdata profile create --profile PROFILE'
|
16
|
+
c.summary = 'Create a new profile'
|
17
|
+
c.option '--profile PROFILE', String, 'The name of the profile to create'
|
18
|
+
c.action do |args, opts|
|
19
|
+
begin
|
20
|
+
raise ArgumentError, 'no profile specified' if opts.profile.nil?
|
21
|
+
Salesforce::Metadata::Profile.touch opts.profile, opts.dir
|
22
|
+
rescue ArgumentError => e
|
23
|
+
puts "Error executing command: #{e.message}"
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
# Profile - Field Permissions - Read
|
29
|
+
command :'profile fieldPermissions:read' do |c|
|
30
|
+
c.syntax = 'mdata profile fieldPermission:read --profile PROFILE [options]'
|
31
|
+
c.summary = 'See what permissions a particular profile is granted'
|
32
|
+
c.option '--profile PROFILE', String, 'The profile to examine'
|
33
|
+
c.option '--field FIELD', String, 'Optionally, a specific field to look for.'
|
34
|
+
c.action do |args, opts|
|
35
|
+
begin
|
36
|
+
raise ArgumentError, 'no profile specified' if opts.profile.nil?
|
37
|
+
profile = Salesforce::Metadata::Profile.read opts.profile, opts.dir
|
38
|
+
profile.fieldPermissions.keep_if { |x| x.field == opts.field } unless opts.field.nil?
|
39
|
+
profile.fieldPermissions.sort! { |a, b| a.field <=> b.field }
|
40
|
+
rows = []
|
41
|
+
profile.fieldPermissions.each do |fp|
|
42
|
+
obj = fp.field.split('.')[0]
|
43
|
+
field = fp.field.split('.')[1]
|
44
|
+
rows << [ obj, field, fp.to_flag_style ]
|
45
|
+
end
|
46
|
+
table = Terminal::Table.new :rows => rows, :headings => ['Object', 'Field', 'Permissions']
|
47
|
+
puts table
|
48
|
+
rescue ArgumentError => e
|
49
|
+
puts "Error executing command: #{e.message}"
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
# Profile - Field Permissions - Set
|
55
|
+
command :'profile fieldPermissions:set' do |c|
|
56
|
+
c.syntax = 'mdata profile fieldPermissions:set --profile PROFILE --field FIELD [options]'
|
57
|
+
c.summary = 'Overwrites any existing permissions for the field on the profile with the ones specified'
|
58
|
+
c.option '--profile PROFILE', String, 'The profile to configure'
|
59
|
+
c.option '--field FIELD', String, 'The field to assign permissions for'
|
60
|
+
c.option '--readable', 'Set the read permission'
|
61
|
+
c.option '--editable', 'Set the edit permission'
|
62
|
+
c.option '--hidden', 'Set the field to be hidden'
|
63
|
+
c.action do |args, opts|
|
64
|
+
begin
|
65
|
+
raise ArgumentError, 'no profile specified' if opts.profile.nil?
|
66
|
+
raise ArgumentError, 'no field specified' if opts.field.nil?
|
67
|
+
profile = Salesforce::Metadata::Profile.read opts.profile, opts.dir
|
68
|
+
idx = profile.fieldPermissions.find_index { |x| x.field == opts.field }
|
69
|
+
|
70
|
+
if idx.nil?
|
71
|
+
fp = Salesforce::Types::ProfileFieldLevelSecurity.new
|
72
|
+
fp.field = opts.field
|
73
|
+
profile.fieldPermissions.push fp
|
74
|
+
idx = profile.fieldPermissions.count - 1
|
75
|
+
end
|
76
|
+
|
77
|
+
profile.fieldPermissions[idx].readable = case opts.readable
|
78
|
+
when nil then 'false'
|
79
|
+
else 'true'
|
80
|
+
end
|
81
|
+
profile.fieldPermissions[idx].editable = case opts.editable
|
82
|
+
when nil then 'false'
|
83
|
+
else 'true'
|
84
|
+
end
|
85
|
+
profile.fieldPermissions[idx].hidden = case opts.hidden
|
86
|
+
when nil then 'false'
|
87
|
+
else 'true'
|
88
|
+
end
|
89
|
+
profile.save
|
90
|
+
rescue ArgumentError => e
|
91
|
+
puts "Error executing command: #{e.message}"
|
92
|
+
end
|
93
|
+
end
|
94
|
+
end
|
95
|
+
|
96
|
+
# Profile - Field Permissions - Grant
|
97
|
+
command :'profile fieldPermissions:grant' do |c|
|
98
|
+
c.syntax = 'mdata profile fieldPermissions:grant --profile PROFILE --field FIELD [options]'
|
99
|
+
c.summary = 'Grants the specified permission on the field to the profile and leaves all others intact'
|
100
|
+
c.option '--profile PROFILE', String, 'The profile to configure'
|
101
|
+
c.option '--field FIELD', String, 'The field to grant permissions on'
|
102
|
+
c.option '--readable', 'Grant the read permission'
|
103
|
+
c.option '--editable', 'Grant the edit permission'
|
104
|
+
c.option '--hidden', 'Make the field hidden'
|
105
|
+
c.action do |args, opts|
|
106
|
+
begin
|
107
|
+
raise ArgumentError, 'no profile specified' if opts.profile.nil?
|
108
|
+
raise ArgumentError, 'no field specified' if opts.field.nil?
|
109
|
+
profile = Salesforce::Metadata::Profile.read opts.profile, opts.dir
|
110
|
+
idx = profile.fieldPermissions.find_index { |x| x.field == opts.field }
|
111
|
+
|
112
|
+
if idx.nil?
|
113
|
+
fp = Salesforce::Types::ProfileFieldLevelSecurity.new
|
114
|
+
fp.field = opts.field
|
115
|
+
profile.fieldPermissions.push fp
|
116
|
+
idx = profile.fieldPermissions.count - 1
|
117
|
+
end
|
118
|
+
|
119
|
+
profile.fieldPermissions[idx].readable = 'true' unless opts.readable.nil?
|
120
|
+
profile.fieldPermissions[idx].editable = 'true' unless opts.editable.nil?
|
121
|
+
profile.fieldPermissions[idx].hidden = 'true' unless opts.hidden.nil?
|
122
|
+
profile.save
|
123
|
+
rescue ArgumentError => e
|
124
|
+
puts "Error executing command: #{e.message}"
|
125
|
+
end
|
126
|
+
end
|
127
|
+
end
|
128
|
+
|
129
|
+
# Profile - Field Permissions - Revoke
|
130
|
+
command :'profile fieldPermissions:revoke' do |c|
|
131
|
+
c.syntax = 'mdata profile fieldPermissions:revoke --profile PROFILE --field FIELD [options]'
|
132
|
+
c.summary = 'Revokes the specified permission on the field to the profile and leaves all others intact'
|
133
|
+
c.option '--profile PROFILE', String, 'The profile to configure'
|
134
|
+
c.option '--field FIELD', String, 'The field to revoke permissions on'
|
135
|
+
c.option '--readable', 'Revoke the read permission'
|
136
|
+
c.option '--editable', 'Revoke the edit permission'
|
137
|
+
c.option '--hidden', 'Remove the hidden flag'
|
138
|
+
c.action do |args, opts|
|
139
|
+
begin
|
140
|
+
raise ArgumentError, 'no profile specified' if opts.profile.nil?
|
141
|
+
raise ArgumentError, 'no field specified' if opts.field.nil?
|
142
|
+
profile = Salesforce::Metadata::Profile.read opts.profile, opts.dir
|
143
|
+
idx = profile.fieldPermissions.find_index { |x| x.field == opts.field }
|
144
|
+
raise ArgumentError, 'field not found in profile' if idx.nil?
|
145
|
+
profile.fieldPermissions[idx].readable = 'false' unless opts.readable.nil?
|
146
|
+
profile.fieldPermissions[idx].editable = 'false' unless opts.editable.nil?
|
147
|
+
profile.fieldPermissions[idx].hidden = 'false' unless opts.hidden.nil?
|
148
|
+
profile.save
|
149
|
+
rescue ArgumentError => e
|
150
|
+
puts "Error executing command: #{e.message}"
|
151
|
+
end
|
152
|
+
end
|
153
|
+
end
|
154
|
+
|
155
|
+
# Profile - Field Permissions - Copy
|
156
|
+
command :'profile fieldPermissions:copy' do |c|
|
157
|
+
c.syntax = 'mdata profile fieldPermissions:copy --fromProfile PROFILE --toProfile PROFILE --fromField FIELD --toField FIELD [options]'
|
158
|
+
c.summary = 'Copies the specified permissions for a field from one profile to another'
|
159
|
+
c.description = [
|
160
|
+
'Copies the permissions on fromProfile for the object fromField to toField on toProfile.',
|
161
|
+
'',
|
162
|
+
'If you are copying the permissions from one field to another on the same profile, you can use',
|
163
|
+
'the --profile option rather than specifying the same --fromProfile and --toProfile.',
|
164
|
+
'',
|
165
|
+
'Likewise, if you are copying the permissions for an field from one profile to another, you can',
|
166
|
+
'specify an --field rather than a --fromField and --toField.'
|
167
|
+
].join("\n")
|
168
|
+
c.option '--fromProfile PROFILE', String, 'The source profile'
|
169
|
+
c.option '--toProfile PROFILE', String, 'The destination profile'
|
170
|
+
c.option '--profile PROFILE', String, 'A profile to use as the source and destination'
|
171
|
+
c.option '--fromField FIELD', String, 'The source field'
|
172
|
+
c.option '--toField FIELD', String, 'The destination field'
|
173
|
+
c.option '--field FIELD', String, 'A field to use as the source and destination'
|
174
|
+
c.option '--all', 'Copy all permissions'
|
175
|
+
c.option '--readable', 'Copy the read permission'
|
176
|
+
c.option '--editable', 'Copy the edit permission'
|
177
|
+
c.option '--hidden', 'Copy the hidden permission'
|
178
|
+
c.action do |args, opts|
|
179
|
+
# Override options for helper options
|
180
|
+
opts.fromProfile = opts.profile if opts.profile
|
181
|
+
opts.toProfile = opts.profile if opts.profile
|
182
|
+
opts.fromField = opts.field if opts.field
|
183
|
+
opts.toField = opts.field if opts.field
|
184
|
+
opts.readable = true if opts.all
|
185
|
+
opts.editable = true if opts.all
|
186
|
+
opts.hidden = true if opts.all
|
187
|
+
|
188
|
+
begin
|
189
|
+
raise ArgumentError, 'no source profile specified' if opts.fromProfile.nil?
|
190
|
+
raise ArgumentError, 'no destination profile specified' if opts.toProfile.nil?
|
191
|
+
raise ArgumentError, 'no source field specified' if opts.fromField.nil?
|
192
|
+
raise ArgumentError, 'no destination field specified' if opts.toField.nil?
|
193
|
+
|
194
|
+
from_profile = Salesforce::Metadata::Profile.read opts.fromProfile, opts.dir
|
195
|
+
src_idx = from_profile.fieldPermissions.find_index { |x| x.field == opts.fromField }
|
196
|
+
raise ArgumentError, 'source field not found in source profile' if src_idx.nil?
|
197
|
+
|
198
|
+
to_profile = Salesforce::Metadata::Profile.read opts.toProfile, opts.dir
|
199
|
+
dst_idx = to_profile.fieldPermissions.find_index { |x| x.field == opts.toField }
|
200
|
+
|
201
|
+
if dst_idx.nil?
|
202
|
+
fp = Salesforce::Types::ProfileFieldLevelSecurity.new
|
203
|
+
fp.field = opts.toField
|
204
|
+
to_profile.fieldPermissions.push fp
|
205
|
+
dst_idx = to_profile.fieldPermissions.count - 1
|
206
|
+
end
|
207
|
+
|
208
|
+
unless opts.readable.nil?
|
209
|
+
val = from_profile.fieldPermissions[src_idx].readable
|
210
|
+
to_profile.fieldPermissions[dst_idx].readable = val
|
211
|
+
end
|
212
|
+
unless opts.editable.nil?
|
213
|
+
val = from_profile.fieldPermissions[src_idx].editable
|
214
|
+
to_profile.fieldPermissions[dst_idx].editable = val
|
215
|
+
end
|
216
|
+
unless opts.hidden.nil?
|
217
|
+
val = from_profile.fieldPermissions[src_idx].hidden
|
218
|
+
to_profile.fieldPermissions[dst_idx].hidden = val
|
219
|
+
end
|
220
|
+
|
221
|
+
to_profile.save
|
222
|
+
rescue ArgumentError => e
|
223
|
+
puts "Error executing command: #{e.message}"
|
224
|
+
end
|
225
|
+
end
|
226
|
+
end
|
227
|
+
|
228
|
+
# Profile - Field Permissions - Revoke
|
229
|
+
command :'profile fieldPermissions:delete' do |c|
|
230
|
+
c.syntax = 'mdata profile fieldPermissions:delete --profile PROFILE --field FIELD'
|
231
|
+
c.summary = 'Completely removes the permissions for a particular field. Useful if a field is deleted from an object.'
|
232
|
+
c.option '--profile PROFILE', String, 'The profile to configure'
|
233
|
+
c.option '--field FIELD', String, 'The field to revoke permissions on'
|
234
|
+
c.action do |args, opts|
|
235
|
+
begin
|
236
|
+
raise ArgumentError, 'no profile specified' if opts.profile.nil?
|
237
|
+
raise ArgumentError, 'no field specified' if opts.field.nil?
|
238
|
+
profile = Salesforce::Metadata::Profile.read opts.profile, opts.dir
|
239
|
+
profile.fieldPermissions.delete_if { |x| x.field == opts.field }
|
240
|
+
profile.save
|
241
|
+
rescue ArgumentError => e
|
242
|
+
puts "Error executing command: #{e.message}"
|
243
|
+
end
|
244
|
+
end
|
245
|
+
end
|
246
|
+
|
247
|
+
alias_command :'pr fp:r', :'profile fieldPermissions:read'
|
248
|
+
alias_command :'pr fp:s', :'profile fieldPermissions:set'
|
249
|
+
alias_command :'pr fp:g', :'profile fieldPermissions:grant'
|
250
|
+
alias_command :'pr fp:v', :'profile fieldPermissions:revoke'
|
251
|
+
alias_command :'pr fp:c', :'profile fieldPermissions:copy'
|
252
|
+
alias_command :'pr fp:d', :'profile fieldPermissions:delete'
|
@@ -0,0 +1,87 @@
|
|
1
|
+
require 'roxml'
|
2
|
+
require 'nokogiri'
|
3
|
+
require 'mdata/types'
|
4
|
+
|
5
|
+
module Salesforce
|
6
|
+
module Metadata
|
7
|
+
class Profile
|
8
|
+
include ROXML
|
9
|
+
|
10
|
+
attr_accessor :filename
|
11
|
+
|
12
|
+
xml_name 'Profile'
|
13
|
+
|
14
|
+
xml_accessor :applicationVisibilities,
|
15
|
+
as: [Salesforce::Types::ProfileApplicationVisibility],
|
16
|
+
from: 'applicationVisibilities'
|
17
|
+
xml_accessor :classAccesses,
|
18
|
+
as: [Salesforce::Types::ProfileApexClassAccess],
|
19
|
+
from: 'classAccesses'
|
20
|
+
xml_accessor :custom
|
21
|
+
xml_accessor :customPermissions,
|
22
|
+
as: [Salesforce::Types::ProfileCustomPermissions],
|
23
|
+
from: 'customPermissions'
|
24
|
+
xml_accessor :description
|
25
|
+
xml_accessor :externalDataSourceAccesses,
|
26
|
+
as: [Salesforce::Types::ProfileExternalDataSourceAccess],
|
27
|
+
from: 'externalDataSourceAccesses'
|
28
|
+
xml_accessor :fieldLevelSecurities,
|
29
|
+
as: [Salesforce::Types::ProfileFieldLevelSecurity],
|
30
|
+
from: 'fieldLevelSecurities'
|
31
|
+
xml_accessor :fieldPermissions,
|
32
|
+
as: [Salesforce::Types::ProfileFieldLevelSecurity],
|
33
|
+
from: 'fieldPermissions'
|
34
|
+
xml_accessor :fullName
|
35
|
+
xml_accessor :layoutAssignments,
|
36
|
+
as: [Salesforce::Types::ProfileLayoutAssignments],
|
37
|
+
from: 'layoutAssignments'
|
38
|
+
xml_accessor :loginHours,
|
39
|
+
as: [Salesforce::Types::ProfileLoginHours],
|
40
|
+
from: 'loginHours'
|
41
|
+
xml_accessor :loginIpRanges,
|
42
|
+
as: [Salesforce::Types::ProfileLoginIpRange],
|
43
|
+
from: 'loginIpRanges'
|
44
|
+
xml_accessor :objectPermissions,
|
45
|
+
as: [Salesforce::Types::ProfileObjectPermissions],
|
46
|
+
from: 'objectPermissions'
|
47
|
+
xml_accessor :pageAccesses,
|
48
|
+
as: [Salesforce::Types::ProfileApexPageAccess],
|
49
|
+
from: 'pageAccesses'
|
50
|
+
xml_accessor :recordTypeVisibilities,
|
51
|
+
as: [Salesforce::Types::ProfileRecordTypeVisibility],
|
52
|
+
from: 'recordTypeVisibilities'
|
53
|
+
xml_accessor :tabVisibilities,
|
54
|
+
as: [Salesforce::Types::ProfileTabVisibility],
|
55
|
+
from: 'tabVisibilities'
|
56
|
+
xml_accessor :userLicense
|
57
|
+
xml_accessor :userPermissions,
|
58
|
+
as: [Salesforce::Types::ProfileUserPermission],
|
59
|
+
from: 'userPermissions'
|
60
|
+
|
61
|
+
def self.read name, dir
|
62
|
+
dir = './src/profiles' if dir.nil?
|
63
|
+
filename = "#{dir}/#{name}.profile"
|
64
|
+
profile = Profile.from_xml(File.read(filename))
|
65
|
+
profile.filename = filename
|
66
|
+
profile
|
67
|
+
end
|
68
|
+
|
69
|
+
def save
|
70
|
+
doc = ::Nokogiri::XML::Document.new
|
71
|
+
doc.root = to_xml()
|
72
|
+
doc.root.add_namespace nil, 'http://soap.sforce.com/2006/04/metadata'
|
73
|
+
File.open @filename, 'w' do |file|
|
74
|
+
file << doc.serialize
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
def self.touch name, dir
|
79
|
+
dir = './src/profiles' if dir.nil?
|
80
|
+
filename = "#{dir}/#{name}.profile"
|
81
|
+
profile = Profile.new
|
82
|
+
profile.filename = filename
|
83
|
+
profile.save
|
84
|
+
end
|
85
|
+
end
|
86
|
+
end
|
87
|
+
end
|
@@ -0,0 +1 @@
|
|
1
|
+
require 'mdata/metadata/Profile'
|
@@ -0,0 +1,15 @@
|
|
1
|
+
require 'roxml'
|
2
|
+
|
3
|
+
module Salesforce
|
4
|
+
module Types
|
5
|
+
class ApplicationVisibility
|
6
|
+
include ROXML
|
7
|
+
|
8
|
+
xml_accessor :application
|
9
|
+
xml_accessor :default
|
10
|
+
xml_accessor :visible
|
11
|
+
end
|
12
|
+
|
13
|
+
class ProfileApplicationVisibility < ApplicationVisibility; end
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
require 'roxml'
|
2
|
+
|
3
|
+
module Salesforce
|
4
|
+
module Types
|
5
|
+
class ExternalDataSourceAccess
|
6
|
+
include ROXML
|
7
|
+
|
8
|
+
xml_accessor :enabled
|
9
|
+
xml_accessor :externalDataSource
|
10
|
+
end
|
11
|
+
|
12
|
+
class ProfileExternalDataSourceAccess < ExternalDataSourceAccess; end
|
13
|
+
end
|
14
|
+
end
|
@@ -0,0 +1,52 @@
|
|
1
|
+
require 'roxml'
|
2
|
+
|
3
|
+
module Salesforce
|
4
|
+
module Types
|
5
|
+
class FieldLevelSecurity
|
6
|
+
include ROXML
|
7
|
+
|
8
|
+
xml_accessor :editable
|
9
|
+
xml_accessor :field
|
10
|
+
xml_accessor :hidden
|
11
|
+
xml_accessor :readable
|
12
|
+
|
13
|
+
def get_permissions
|
14
|
+
permissions = Array.new
|
15
|
+
permissions.push 'Editable' if @editable == 'true'
|
16
|
+
permissions.push 'Hidden' if @hidden == 'true'
|
17
|
+
permissions.push 'Readable' if @readable == 'true'
|
18
|
+
permissions
|
19
|
+
end
|
20
|
+
|
21
|
+
def to_s
|
22
|
+
get_permissions.join(', ')
|
23
|
+
end
|
24
|
+
|
25
|
+
def to_flag_style
|
26
|
+
flags = ''
|
27
|
+
if @readable == 'true'
|
28
|
+
flags += 'Readable '
|
29
|
+
else
|
30
|
+
flags += ' '
|
31
|
+
end
|
32
|
+
|
33
|
+
if @editable == 'true'
|
34
|
+
flags += 'Editable '
|
35
|
+
else
|
36
|
+
flags += ' '
|
37
|
+
end
|
38
|
+
|
39
|
+
if @hidden == 'true'
|
40
|
+
flags += 'Hidden'
|
41
|
+
else
|
42
|
+
flags += ' '
|
43
|
+
end
|
44
|
+
|
45
|
+
flags
|
46
|
+
end
|
47
|
+
|
48
|
+
end
|
49
|
+
|
50
|
+
class ProfileFieldLevelSecurity < FieldLevelSecurity; end
|
51
|
+
end
|
52
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
require 'roxml'
|
2
|
+
|
3
|
+
module Salesforce
|
4
|
+
module Types
|
5
|
+
class LoginHours
|
6
|
+
include ROXML
|
7
|
+
|
8
|
+
xml_accessor :mondayStart
|
9
|
+
xml_accessor :mondayEnd
|
10
|
+
xml_accessor :tuesdayStart
|
11
|
+
xml_accessor :tuesdayEnd
|
12
|
+
xml_accessor :wednesdayStart
|
13
|
+
xml_accessor :wednesdayEnd
|
14
|
+
xml_accessor :thursdayStart
|
15
|
+
xml_accessor :thursdayEnd
|
16
|
+
xml_accessor :fridayStart
|
17
|
+
xml_accessor :fridayEnd
|
18
|
+
xml_accessor :saturdayStart
|
19
|
+
xml_accessor :saturdayEnd
|
20
|
+
xml_accessor :sundayStart
|
21
|
+
xml_accessor :sundayEnd
|
22
|
+
end
|
23
|
+
|
24
|
+
class ProfileLoginHours < LoginHours; end
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
require 'roxml'
|
2
|
+
|
3
|
+
module Salesforce
|
4
|
+
module Types
|
5
|
+
class ObjectPermissions
|
6
|
+
include ROXML
|
7
|
+
|
8
|
+
xml_accessor :allowCreate
|
9
|
+
xml_accessor :allowDelete
|
10
|
+
xml_accessor :allowEdit
|
11
|
+
xml_accessor :allowRead
|
12
|
+
xml_accessor :modifyAllRecords
|
13
|
+
xml_accessor :object
|
14
|
+
xml_accessor :viewAllRecords
|
15
|
+
end
|
16
|
+
|
17
|
+
class ProfileObjectPermissions < ObjectPermissions; end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
require 'roxml'
|
2
|
+
|
3
|
+
module Salesforce
|
4
|
+
module Types
|
5
|
+
class RecordTypeVisibility
|
6
|
+
include ROXML
|
7
|
+
|
8
|
+
xml_accessor :default
|
9
|
+
xml_accessor :personAccountDefault
|
10
|
+
xml_accessor :recordType
|
11
|
+
xml_accessor :visible
|
12
|
+
end
|
13
|
+
|
14
|
+
class ProfileRecordTypeVisibility < RecordTypeVisibility; end
|
15
|
+
end
|
16
|
+
end
|
data/lib/mdata/types.rb
ADDED
@@ -0,0 +1,13 @@
|
|
1
|
+
require 'mdata/types/ApplicationVisibility'
|
2
|
+
require 'mdata/types/ApexClassAccess'
|
3
|
+
require 'mdata/types/CustomPermissions'
|
4
|
+
require 'mdata/types/ExternalDataSourceAccess'
|
5
|
+
require 'mdata/types/FieldLevelSecurity'
|
6
|
+
require 'mdata/types/LayoutAssignments'
|
7
|
+
require 'mdata/types/LoginHours'
|
8
|
+
require 'mdata/types/LoginIpRange'
|
9
|
+
require 'mdata/types/ObjectPermissions'
|
10
|
+
require 'mdata/types/ApexPageAccess'
|
11
|
+
require 'mdata/types/RecordTypeVisibility'
|
12
|
+
require 'mdata/types/TabVisibility'
|
13
|
+
require 'mdata/types/UserPermission'
|
data/lib/mdata.rb
ADDED
metadata
ADDED
@@ -0,0 +1,105 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: mdata
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 1.0.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Ben Burwell
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2015-09-22 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: commander
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - '>='
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: 4.3.5
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - '>='
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: 4.3.5
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: roxml
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - '>='
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: 3.3.1
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - '>='
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: 3.3.1
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: terminal-table
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - '>='
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: 1.5.2
|
48
|
+
type: :runtime
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - '>='
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: 1.5.2
|
55
|
+
description: A command line tool to help manipulate Salesforce metadata without digging
|
56
|
+
into XML
|
57
|
+
email: ben.burwell@trifecta.com
|
58
|
+
executables:
|
59
|
+
- mdata
|
60
|
+
extensions: []
|
61
|
+
extra_rdoc_files: []
|
62
|
+
files:
|
63
|
+
- lib/mdata.rb
|
64
|
+
- lib/mdata/metadata.rb
|
65
|
+
- lib/mdata/metadata/Profile.rb
|
66
|
+
- lib/mdata/types.rb
|
67
|
+
- lib/mdata/types/ApplicationVisibility.rb
|
68
|
+
- lib/mdata/types/ApexClassAccess.rb
|
69
|
+
- lib/mdata/types/CustomPermissions.rb
|
70
|
+
- lib/mdata/types/ExternalDataSourceAccess.rb
|
71
|
+
- lib/mdata/types/FieldLevelSecurity.rb
|
72
|
+
- lib/mdata/types/LayoutAssignments.rb
|
73
|
+
- lib/mdata/types/LoginHours.rb
|
74
|
+
- lib/mdata/types/LoginIpRange.rb
|
75
|
+
- lib/mdata/types/ObjectPermissions.rb
|
76
|
+
- lib/mdata/types/ApexPageAccess.rb
|
77
|
+
- lib/mdata/types/RecordTypeVisibility.rb
|
78
|
+
- lib/mdata/types/TabVisibility.rb
|
79
|
+
- lib/mdata/types/UserPermission.rb
|
80
|
+
- bin/mdata
|
81
|
+
homepage: http://www.trifecta.com/
|
82
|
+
licenses:
|
83
|
+
- MIT
|
84
|
+
metadata: {}
|
85
|
+
post_install_message:
|
86
|
+
rdoc_options: []
|
87
|
+
require_paths:
|
88
|
+
- lib
|
89
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
90
|
+
requirements:
|
91
|
+
- - '>='
|
92
|
+
- !ruby/object:Gem::Version
|
93
|
+
version: '0'
|
94
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
95
|
+
requirements:
|
96
|
+
- - '>='
|
97
|
+
- !ruby/object:Gem::Version
|
98
|
+
version: '0'
|
99
|
+
requirements: []
|
100
|
+
rubyforge_project:
|
101
|
+
rubygems_version: 2.0.14
|
102
|
+
signing_key:
|
103
|
+
specification_version: 4
|
104
|
+
summary: Your Salesforce metadata navigator and manipulator
|
105
|
+
test_files: []
|