sf_cli 0.0.8 → 0.0.10
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/README.rdoc +2 -2
- data/lib/sf_cli/console/commands.rb +17 -1
- data/lib/sf_cli/sf/apex/run.rb +22 -35
- data/lib/sf_cli/sf/core/base.rb +7 -0
- data/lib/sf_cli/sf/data/create_record.rb +3 -1
- data/lib/sf_cli/sf/data/delete_bulk.rb +25 -8
- data/lib/sf_cli/sf/data/delete_record.rb +3 -1
- data/lib/sf_cli/sf/data/delete_resume.rb +10 -8
- data/lib/sf_cli/sf/data/query.rb +11 -7
- data/lib/sf_cli/sf/data/resume.rb +5 -3
- data/lib/sf_cli/sf/data/search.rb +6 -4
- data/lib/sf_cli/sf/data/update_record.rb +8 -6
- data/lib/sf_cli/sf/data/upsert_bulk.rb +27 -10
- data/lib/sf_cli/sf/data/upsert_resume.rb +8 -6
- data/lib/sf_cli/sf/model/query_condition.rb +114 -61
- data/lib/sf_cli/sf/model/query_methods.rb +29 -4
- data/lib/sf_cli/sf/model/sf_command_connection.rb +4 -4
- data/lib/sf_cli/sf/org/display.rb +3 -2
- data/lib/sf_cli/sf/sobject/describe.rb +7 -5
- data/lib/sf_cli/sf/sobject/list.rb +5 -3
- data/lib/sf_cli/sf/sobject/schema.rb +452 -16
- metadata +5 -5
@@ -6,7 +6,16 @@ module SfCli
|
|
6
6
|
module QueryMethods
|
7
7
|
# @private :nodoc: just for developers
|
8
8
|
class QueryCondition
|
9
|
-
attr_reader :connection,
|
9
|
+
attr_reader :connection,
|
10
|
+
:object_name,
|
11
|
+
:all_field_names,
|
12
|
+
:fields,
|
13
|
+
:conditions,
|
14
|
+
:limit_num,
|
15
|
+
:row_order,
|
16
|
+
:count_select,
|
17
|
+
:max_select_field,
|
18
|
+
:min_select_field
|
10
19
|
|
11
20
|
def initialize(connection, object_name, field_names)
|
12
21
|
@object_name = object_name
|
@@ -16,71 +25,23 @@ module SfCli
|
|
16
25
|
@conditions = []
|
17
26
|
@limit_num = nil
|
18
27
|
@row_order = nil
|
28
|
+
@count_select = false
|
29
|
+
@max_select_field = nil
|
30
|
+
@min_select_field = nil
|
19
31
|
end
|
20
32
|
|
21
33
|
def where(*expr)
|
22
|
-
return self
|
23
|
-
return self if expr.map{|o| (o == '' || o == {} || o == []) ? nil : o}.compact.size.zero?
|
24
|
-
return self unless [Hash, Symbol, String].any?{|klass| expr.first.instance_of? klass}
|
34
|
+
return self unless valid_expr?(expr)
|
25
35
|
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
value = case expr[2].class.name.to_sym
|
30
|
-
when :String
|
31
|
-
%|'#{expr[2]}'|
|
32
|
-
when :Time
|
33
|
-
expr[2].to_datetime
|
34
|
-
when :Array
|
35
|
-
candidates = expr[2].map do |o|
|
36
|
-
case o.class.name.to_sym
|
37
|
-
when :String
|
38
|
-
%|'#{o}'|
|
39
|
-
when :Time
|
40
|
-
o.to_datetime
|
41
|
-
else
|
42
|
-
o
|
43
|
-
end
|
44
|
-
end
|
45
|
-
%|IN (#{candidates.join(', ')})|
|
46
|
-
else
|
47
|
-
expr[2]
|
48
|
-
end
|
49
|
-
conditions << %|#{expr[0]} #{expr[1]} #{value}|
|
50
|
-
|
51
|
-
return self
|
52
|
-
end
|
36
|
+
conditions.append to_string_expr(expr)
|
37
|
+
self
|
38
|
+
end
|
53
39
|
|
54
|
-
|
55
|
-
|
56
|
-
return self
|
57
|
-
end
|
40
|
+
def not(*expr)
|
41
|
+
return self unless valid_expr?(expr)
|
58
42
|
|
59
|
-
|
60
|
-
|
61
|
-
case v.class.name.to_sym
|
62
|
-
when :String
|
63
|
-
%|#{k} = '#{v}'|
|
64
|
-
when :Time
|
65
|
-
%|#{k} = #{v.to_datetime}|
|
66
|
-
when :Array
|
67
|
-
candidates = v.map do |o|
|
68
|
-
case o.class.name.to_sym
|
69
|
-
when :String
|
70
|
-
%|'#{o}'|
|
71
|
-
when :Time
|
72
|
-
%|#{o.to_datetime}|
|
73
|
-
else
|
74
|
-
o
|
75
|
-
end
|
76
|
-
end
|
77
|
-
%|#{k} IN (#{candidates.join(', ')})|
|
78
|
-
else
|
79
|
-
"#{k} = #{v}"
|
80
|
-
end
|
81
|
-
end
|
82
|
-
conditions.append new_conditions
|
83
|
-
return self
|
43
|
+
conditions.append %|NOT(#{to_string_expr(expr)})|
|
44
|
+
self
|
84
45
|
end
|
85
46
|
|
86
47
|
def select(*expr)
|
@@ -115,21 +76,113 @@ module SfCli
|
|
115
76
|
[base, where, _order, limit].compact.join(' ')
|
116
77
|
end
|
117
78
|
|
79
|
+
def to_csv
|
80
|
+
connection.query(to_soql, Object.const_get(object_name.to_sym), :csv)
|
81
|
+
end
|
82
|
+
|
118
83
|
def all
|
119
84
|
connection.query(to_soql, Object.const_get(object_name.to_sym))
|
120
85
|
end
|
121
86
|
|
122
87
|
def pluck(field_name)
|
123
|
-
|
88
|
+
connection.query(to_soql, nil).map{|record| record[field_name.to_s]}
|
124
89
|
end
|
125
90
|
|
126
91
|
def take
|
127
92
|
limit(1).all.first
|
128
93
|
end
|
129
94
|
|
95
|
+
def count
|
96
|
+
@count_select = true
|
97
|
+
connection.query(to_soql, nil).first['expr0']
|
98
|
+
end
|
99
|
+
|
100
|
+
def max(field_name)
|
101
|
+
@max_select_field = field_name
|
102
|
+
connection.query(to_soql, nil).first['expr0']
|
103
|
+
end
|
104
|
+
|
105
|
+
def min(field_name)
|
106
|
+
@min_select_field = field_name
|
107
|
+
connection.query(to_soql, nil).first['expr0']
|
108
|
+
end
|
109
|
+
|
110
|
+
private
|
111
|
+
|
130
112
|
def select_fields
|
113
|
+
return 'COUNT(Id)' if count_select
|
114
|
+
return "MAX(#{max_select_field})" if max_select_field
|
115
|
+
return "MIN(#{min_select_field})" if min_select_field
|
116
|
+
|
131
117
|
(fields.empty? ? all_field_names : fields).join(', ')
|
132
118
|
end
|
119
|
+
|
120
|
+
def to_string_expr(expr)
|
121
|
+
return str_by_ternary_expr(expr) if expr.size > 1
|
122
|
+
return expr[0] if expr[0].instance_of? String
|
123
|
+
|
124
|
+
strs_by_hash_expr(expr)
|
125
|
+
end
|
126
|
+
|
127
|
+
def str_by_ternary_expr(expr)
|
128
|
+
return self if expr.size < 3
|
129
|
+
|
130
|
+
value = case expr[2].class.name.to_sym
|
131
|
+
when :String
|
132
|
+
%|'#{expr[2]}'|
|
133
|
+
when :Time
|
134
|
+
expr[2].to_datetime
|
135
|
+
when :Array
|
136
|
+
candidates = expr[2].map do |o|
|
137
|
+
case o.class.name.to_sym
|
138
|
+
when :String
|
139
|
+
%|'#{o}'|
|
140
|
+
when :Time
|
141
|
+
o.to_datetime
|
142
|
+
else
|
143
|
+
o
|
144
|
+
end
|
145
|
+
end
|
146
|
+
%|IN (#{candidates.join(', ')})|
|
147
|
+
else
|
148
|
+
expr[2]
|
149
|
+
end
|
150
|
+
%|#{expr[0]} #{expr[1]} #{value}|
|
151
|
+
end
|
152
|
+
|
153
|
+
def valid_expr?(expr)
|
154
|
+
return false if expr&.empty?
|
155
|
+
return false if expr.map{|o| (o == '' || o == {} || o == []) ? nil : o}.compact.size.zero?
|
156
|
+
return false unless [Hash, Symbol, String].any?{|klass| expr.first.instance_of? klass}
|
157
|
+
|
158
|
+
true
|
159
|
+
end
|
160
|
+
|
161
|
+
def strs_by_hash_expr(expr)
|
162
|
+
expr[0].map do |k,v|
|
163
|
+
case v.class.name.to_sym
|
164
|
+
when :String
|
165
|
+
%|#{k} = '#{v}'|
|
166
|
+
when :Time
|
167
|
+
%|#{k} = #{v.to_datetime}|
|
168
|
+
when :Array
|
169
|
+
candidates = v.map do |o|
|
170
|
+
case o.class.name.to_sym
|
171
|
+
when :String
|
172
|
+
%|'#{o}'|
|
173
|
+
when :Time
|
174
|
+
%|#{o.to_datetime}|
|
175
|
+
else
|
176
|
+
o
|
177
|
+
end
|
178
|
+
end
|
179
|
+
%|#{k} IN (#{candidates.join(', ')})|
|
180
|
+
else
|
181
|
+
"#{k} = #{v}"
|
182
|
+
end
|
183
|
+
end
|
184
|
+
.join(' AND ')
|
185
|
+
end
|
133
186
|
end
|
134
187
|
end
|
135
188
|
end
|
@@ -22,10 +22,6 @@ module SfCli
|
|
22
22
|
return qc
|
23
23
|
end
|
24
24
|
|
25
|
-
def find(id)
|
26
|
-
connection.find(name.to_sym, id, Object.const_get(name.to_sym))
|
27
|
-
end
|
28
|
-
|
29
25
|
def limit(num)
|
30
26
|
qc = QueryCondition.new(connection, self.name, self.field_names)
|
31
27
|
qc.limit(num)
|
@@ -38,11 +34,25 @@ module SfCli
|
|
38
34
|
qc
|
39
35
|
end
|
40
36
|
|
37
|
+
def find(id)
|
38
|
+
connection.find(name.to_sym, id, Object.const_get(name.to_sym))
|
39
|
+
end
|
40
|
+
|
41
|
+
def find_by(*find_condition)
|
42
|
+
qc = QueryCondition.new(connection, self.name, self.field_names)
|
43
|
+
qc.where(*find_condition).take
|
44
|
+
end
|
45
|
+
|
41
46
|
def all
|
42
47
|
qc = QueryCondition.new(connection, self.name, self.field_names)
|
43
48
|
qc.all
|
44
49
|
end
|
45
50
|
|
51
|
+
def to_csv
|
52
|
+
qc = QueryCondition.new(connection, self.name, self.field_names)
|
53
|
+
qc.to_csv
|
54
|
+
end
|
55
|
+
|
46
56
|
def pluck(field_name)
|
47
57
|
qc = QueryCondition.new(connection, self.name, self.field_names)
|
48
58
|
qc.pluck(field_name)
|
@@ -52,6 +62,21 @@ module SfCli
|
|
52
62
|
qc = QueryCondition.new(connection, self.name, self.field_names)
|
53
63
|
qc.take
|
54
64
|
end
|
65
|
+
|
66
|
+
def count
|
67
|
+
qc = QueryCondition.new(connection, self.name, self.field_names)
|
68
|
+
qc.count
|
69
|
+
end
|
70
|
+
|
71
|
+
def max(field_name)
|
72
|
+
qc = QueryCondition.new(connection, self.name, self.field_names)
|
73
|
+
qc.max(field_name)
|
74
|
+
end
|
75
|
+
|
76
|
+
def min(field_name)
|
77
|
+
qc = QueryCondition.new(connection, self.name, self.field_names)
|
78
|
+
qc.min(field_name)
|
79
|
+
end
|
55
80
|
end
|
56
81
|
end
|
57
82
|
end
|
@@ -37,8 +37,8 @@ module SfCli
|
|
37
37
|
#
|
38
38
|
# For query details, see {SfCli::Sf::Data::Query sf data query}
|
39
39
|
#
|
40
|
-
def exec_query(soql, format: nil, bulk: false,
|
41
|
-
sf_data.query(soql, target_org: target_org, format: format, bulk: bulk,
|
40
|
+
def exec_query(soql, format: nil, bulk: false, wait: nil, model_class: nil)
|
41
|
+
sf_data.query(soql, target_org: target_org, format: format, bulk: bulk, wait: wait, model_class: model_class)
|
42
42
|
end
|
43
43
|
|
44
44
|
# @private :nodoc: just for developers
|
@@ -65,8 +65,8 @@ module SfCli
|
|
65
65
|
end
|
66
66
|
|
67
67
|
# @private :nodoc: just for developers
|
68
|
-
def query(soql, klass)
|
69
|
-
sf_data.query soql, target_org: target_org, model_class: klass
|
68
|
+
def query(soql, klass, format = nil)
|
69
|
+
sf_data.query soql, target_org: target_org, format: format, model_class: klass
|
70
70
|
end
|
71
71
|
|
72
72
|
# @private :nodoc: just for developers
|
@@ -5,6 +5,7 @@ module SfCli::Sf::Org
|
|
5
5
|
#
|
6
6
|
# Returns the org's connection information
|
7
7
|
# @param target_org [Symbol,String] an alias of paticular org, or username can be used
|
8
|
+
# @param api_version [Numeric] override the api version used for api requests made by this command
|
8
9
|
#
|
9
10
|
# @note this function returns the org information including security sensitive things such as access token, username and so on.
|
10
11
|
# @return [ConnectionInfo] the org's connection information
|
@@ -24,8 +25,8 @@ module SfCli::Sf::Org
|
|
24
25
|
#
|
25
26
|
# @see https://developer.salesforce.com/docs/atlas.en-us.sfdx_cli_reference.meta/sfdx_cli_reference/cli_reference_org_commands_unified.htm#cli_reference_org_display_unified command reference
|
26
27
|
#
|
27
|
-
def display(target_org: nil)
|
28
|
-
flags = {:"target-org" => target_org}
|
28
|
+
def display(target_org: nil, api_version: nil)
|
29
|
+
flags = {:"target-org" => target_org, :"api-version" => api_version}
|
29
30
|
json = exec(__method__, flags: flags, redirection: :null_stderr)
|
30
31
|
|
31
32
|
ConnectionInfo.new(
|
@@ -5,6 +5,7 @@ module SfCli::Sf::Sobject
|
|
5
5
|
# Returns a schema object containing the Salesforce object schema
|
6
6
|
# @param object_type [Symbol,String] object type(ex: Account)
|
7
7
|
# @param target_org [Symbol,String] an alias of paticular org, or username can be used
|
8
|
+
# @param api_version [Numeric] override the api version used for api requests made by this command
|
8
9
|
#
|
9
10
|
# @return [Schema] a schema object that represents the object schema
|
10
11
|
#
|
@@ -12,15 +13,16 @@ module SfCli::Sf::Sobject
|
|
12
13
|
# schema = sf.sobject.describe :Account
|
13
14
|
# schema.name # Account
|
14
15
|
# schema.label # Account
|
15
|
-
# schema.field_names
|
16
|
-
# schema.fields
|
16
|
+
# schema.field_names # [:Id, :Name, ....]
|
17
|
+
# schema.fields.name_and_labels # [['Id', 'Account Id'], ['Name', 'Account Name'], ...]
|
17
18
|
#
|
18
19
|
# @see https://developer.salesforce.com/docs/atlas.en-us.sfdx_cli_reference.meta/sfdx_cli_reference/cli_reference_sobject_commands_unified.htm#cli_reference_sobject_describe_unified command reference
|
19
20
|
#
|
20
|
-
def describe(object_type, target_org: nil)
|
21
|
+
def describe(object_type, target_org: nil, api_version: nil)
|
21
22
|
flags = {
|
22
|
-
:"sobject"
|
23
|
-
:"target-org"
|
23
|
+
:"sobject" => object_type,
|
24
|
+
:"target-org" => target_org,
|
25
|
+
:"api-version" => api_version,
|
24
26
|
}
|
25
27
|
json = exec(__method__, flags: flags, redirection: :null_stderr)
|
26
28
|
Schema.new(json['result'])
|
@@ -3,13 +3,15 @@ module SfCli::Sf::Sobject
|
|
3
3
|
# Returns a list of Salesforce object name
|
4
4
|
# @param object_type [Symbol,String] 'all' or 'custom'
|
5
5
|
# @param target_org [Symbol,String] an alias of paticular org, or username can be used
|
6
|
+
# @param api_version [Numeric] override the api version used for api requests made by this command
|
6
7
|
#
|
7
8
|
# @see https://developer.salesforce.com/docs/atlas.en-us.sfdx_cli_reference.meta/sfdx_cli_reference/cli_reference_sobject_commands_unified.htm#cli_reference_sobject_list_unified command reference
|
8
9
|
#
|
9
|
-
def list(object_type, target_org: nil)
|
10
|
+
def list(object_type, target_org: nil, api_version: nil)
|
10
11
|
flags = {
|
11
|
-
:"sobject"
|
12
|
-
:"target-org"
|
12
|
+
:"sobject" => (object_type.to_sym == :custom ? :custom : :all),
|
13
|
+
:"target-org" => target_org,
|
14
|
+
:"api-version" => api_version,
|
13
15
|
}
|
14
16
|
json = exec(__method__, flags: flags, redirection: :null_stderr)
|
15
17
|
json['result']
|