leap_salesforce 0.1.0 → 0.1.1
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 +0 -1
- data/.gitlab-ci.yml +22 -0
- data/.idea/.rakeTasks +7 -0
- data/.idea/leap-salesforce.iml +73 -83
- data/.idea/misc.xml +1 -0
- data/.idea/workspace.xml +563 -358
- data/.leap_salesforce.yml +2 -2
- data/ChangeLog +5 -0
- data/README.md +5 -1
- data/Rakefile +3 -3
- data/config/environments/prod.rb +4 -0
- data/config/general.rb +6 -0
- data/exe/leap_salesforce +54 -0
- data/leap_salesforce.gemspec +1 -2
- data/lib/leap_salesforce/ext/string.rb +6 -1
- data/lib/leap_salesforce/generator/default.rb +52 -0
- data/lib/leap_salesforce/generator/exe_helpers.rb +29 -0
- data/lib/leap_salesforce/generator/generator.rb +60 -0
- data/lib/leap_salesforce/generator/soql_enums.rb +4 -2
- data/lib/leap_salesforce/generator/soql_objects.rb +29 -44
- data/lib/leap_salesforce/generator/templates/.leap_salesforce.yml.erb +9 -0
- data/lib/leap_salesforce/generator/templates/.rspec.erb +3 -0
- data/lib/leap_salesforce/generator/templates/Gemfile.erb +4 -0
- data/lib/leap_salesforce/generator/templates/Rakefile.erb +8 -0
- data/lib/leap_salesforce/generator/templates/config/credentials/salesforce_oauth2.yml.erb +3 -0
- data/lib/leap_salesforce/generator/templates/config/environments/specific_file.rb.erb +4 -0
- data/lib/leap_salesforce/generator/templates/config/general.rb.erb +6 -0
- data/lib/leap_salesforce/generator/templates/factory.rb.erb +3 -3
- data/lib/leap_salesforce/generator/templates/soql_object.rb.erb +5 -5
- data/lib/leap_salesforce/generator/templates/soql_object_field_names.rb.erb +2 -2
- data/lib/leap_salesforce/generator/templates/spec/crud_eg_spec.rb.erb +24 -0
- data/lib/leap_salesforce/generator/templates/spec/limit_spec.rb.erb +14 -0
- data/lib/leap_salesforce/generator/templates/spec/spec_helper.rb.erb +5 -0
- data/lib/leap_salesforce/limits.rb +3 -2
- data/lib/leap_salesforce/parameters.rb +13 -1
- data/lib/leap_salesforce/rake/setup.rake +0 -2
- data/lib/leap_salesforce/soql_data/data_relationships.rb +4 -4
- data/lib/leap_salesforce/soql_data/soql_data.rb +2 -2
- data/lib/leap_salesforce/soql_data/soql_global_data.rb +2 -0
- data/lib/leap_salesforce/soql_data/soql_global_object_data.rb +13 -8
- data/lib/leap_salesforce/soql_object.rb +49 -0
- data/lib/leap_salesforce/users/user.rb +12 -0
- data/lib/leap_salesforce/users/users.rb +14 -4
- data/lib/leap_salesforce/version.rb +1 -1
- data/lib/leap_salesforce.rb +13 -3
- metadata +36 -33
- data/exe/leap-salesforce +0 -7
- data/lib/leap_salesforce/generator/default_fields.rb +0 -13
data/.leap_salesforce.yml
CHANGED
data/ChangeLog
ADDED
data/README.md
CHANGED
@@ -25,6 +25,10 @@ Or install it yourself as:
|
|
25
25
|
|
26
26
|
TODO: Write usage instructions here
|
27
27
|
|
28
|
+
## Docs
|
29
|
+
|
30
|
+
Technical docs [here](https://www.rubydoc.info/gems/leap_salesforce)
|
31
|
+
|
28
32
|
## Development
|
29
33
|
|
30
34
|
After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake spec` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
|
@@ -41,7 +45,7 @@ The gem is available as open source under the terms of the [MIT License](https:/
|
|
41
45
|
|
42
46
|
## Code of Conduct
|
43
47
|
|
44
|
-
Everyone interacting in the
|
48
|
+
Everyone interacting in the LeapSalesforce project’s codebases, issue trackers, chat rooms and mailing lists is expected to follow the [code of conduct](https://gitlab.com/leap-dojo/leap_salesforce/blob/master/CODE_OF_CONDUCT.md).
|
45
49
|
|
46
50
|
# Examples
|
47
51
|
|
data/Rakefile
CHANGED
@@ -2,17 +2,17 @@
|
|
2
2
|
|
3
3
|
require 'bundler/gem_tasks'
|
4
4
|
require 'rspec/core/rake_task'
|
5
|
+
require 'rake/clean'
|
5
6
|
|
6
7
|
require 'leap_salesforce/rake'
|
7
8
|
|
9
|
+
CLEAN.include 'tmp/*'
|
8
10
|
|
9
11
|
RSpec::Core::RakeTask.new(:spec)
|
10
12
|
|
11
|
-
task default:
|
13
|
+
task default: %i[clean spec]
|
12
14
|
|
13
|
-
# TODO: This needs to be in one place
|
14
15
|
require 'leap_salesforce'
|
15
|
-
LeapSalesforce.api_user = LeapSalesforce::Users.where(key: :cet)
|
16
16
|
|
17
17
|
desc "Create stubs for dynamic methods so they're picked up by the IDE"
|
18
18
|
task :stub do
|
data/config/general.rb
ADDED
data/exe/leap_salesforce
ADDED
@@ -0,0 +1,54 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
$LOAD_PATH.unshift File.join(File.dirname(__FILE__), '..', 'lib')
|
5
|
+
|
6
|
+
require 'thor'
|
7
|
+
require 'leap_salesforce/parameters'
|
8
|
+
require 'leap_salesforce/generator/generator'
|
9
|
+
|
10
|
+
module LeapSalesforce
|
11
|
+
# Executable for setting up Leap Salesforce
|
12
|
+
class Exe < Thor
|
13
|
+
include LeapSalesforce::Generator
|
14
|
+
include LeapSalesforce::ExeHelpers
|
15
|
+
|
16
|
+
OAUTH_WIKI = 'https://gitlab.com/leap-dojo/leap_salesforce/wikis/SetUpOAuthApp'
|
17
|
+
|
18
|
+
desc 'init', 'Create new leap salesforce repository'
|
19
|
+
option :setup_done, default: false, type: :boolean, banner: 'Whether setup is done'
|
20
|
+
option :client_id, banner: 'OAuth2 client id'
|
21
|
+
option :client_secret, banner: 'OAuth2 client secret'
|
22
|
+
option :username, banner: 'Username'
|
23
|
+
option :user_key, banner: 'Key to identify user by'
|
24
|
+
option :password, banner: 'User password'
|
25
|
+
option :environment, banner: 'Environment to set automation code up for'
|
26
|
+
def init
|
27
|
+
# Ask user to create OAuth application by following
|
28
|
+
unless options[:setup_done]
|
29
|
+
oauth_setup = input_for "Have you set up OAuth application by following #{OAUTH_WIKI} (y/n)?"
|
30
|
+
exit if oauth_setup.downcase == 'n'
|
31
|
+
end
|
32
|
+
|
33
|
+
query_for_parameters
|
34
|
+
generate_files binding, ['Gemfile', 'Rakefile', '.leap_salesforce.yml', '.rspec',
|
35
|
+
{ config: ['general.rb', { credentials: 'salesforce_oauth2.yml' }] },
|
36
|
+
{ spec: %w[spec_helper.rb limit_spec.rb crud_eg_spec.rb] }]
|
37
|
+
|
38
|
+
environment_content = read_template File.join('config', 'environments', 'specific_file.rb.erb'),
|
39
|
+
binding
|
40
|
+
generate_file File.join('config', 'environments', "#{@environment}.rb"), environment_content,
|
41
|
+
overwrite: false
|
42
|
+
|
43
|
+
puts 'Initial files created!'
|
44
|
+
puts 'Installing gems'
|
45
|
+
puts `bundle install`
|
46
|
+
puts 'Creating initial Soql objects. See ".leap_salesforce.yml" for list'
|
47
|
+
puts `rake leaps:create_soql_objects`
|
48
|
+
puts 'Creating enums'
|
49
|
+
puts `rake leaps:create_enums`
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
LeapSalesforce::Exe.start(ARGV)
|
data/leap_salesforce.gemspec
CHANGED
@@ -27,13 +27,12 @@ It reads the Metadata from Salesforce and creates the foundation for API tests.'
|
|
27
27
|
spec.require_paths = ['lib']
|
28
28
|
|
29
29
|
spec.add_development_dependency 'bundler', '~> 2.0'
|
30
|
-
spec.add_development_dependency 'faker'
|
31
30
|
spec.add_development_dependency 'pry'
|
32
|
-
spec.add_development_dependency 'rake', '~> 10.0'
|
33
31
|
spec.add_development_dependency 'rspec', '~> 3.0'
|
34
32
|
spec.add_development_dependency 'topoisomerase'
|
35
33
|
spec.add_dependency 'activerecord'
|
36
34
|
spec.add_dependency 'factory_bot'
|
35
|
+
spec.add_dependency 'faker'
|
37
36
|
spec.add_dependency 'rake'
|
38
37
|
spec.add_dependency 'require_all'
|
39
38
|
spec.add_dependency 'rubocop'
|
@@ -8,7 +8,12 @@ class String
|
|
8
8
|
# @todo: Have method of replacing all
|
9
9
|
# @return [String] Remove many complex characters to make a key for a Ruby Hash that is usable
|
10
10
|
def to_key_name
|
11
|
-
tr('
|
11
|
+
tr(' ,-', '_').tr("'/():", '').tr('&', '').gsub('<', 'gt').remove_macrons.snakecase.gsub('__', '_')
|
12
|
+
end
|
13
|
+
|
14
|
+
# @return [String] Return string without macrons, used for filenames and ruby methods
|
15
|
+
def remove_macrons
|
16
|
+
tr('ā', 'a').tr('ē', 'e').tr('ō', 'o').tr('ī', 'i').tr('ū', 'u')
|
12
17
|
end
|
13
18
|
|
14
19
|
# A ruby friendly method name that is not taken by keywords like 'class', 'alias'
|
@@ -0,0 +1,52 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module LeapSalesforce
|
4
|
+
module Default
|
5
|
+
# Defaults for various objects within a Factory
|
6
|
+
module Factory
|
7
|
+
class << self
|
8
|
+
# @return [String] String to set Factory field to value specified
|
9
|
+
def set(value, use_quotes: nil)
|
10
|
+
if use_quotes
|
11
|
+
"#{@field['label'].unused_ruby_name} { '#{value}' }"
|
12
|
+
else
|
13
|
+
"#{@field['label'].unused_ruby_name} { #{value} }"
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
# @return [String] Default value for Factory
|
18
|
+
def value_for(field, class_name)
|
19
|
+
@field = field
|
20
|
+
case field['type']
|
21
|
+
when 'string' then set("Faker::Lorem.paragraph_by_chars(#{field['length']})")
|
22
|
+
when 'id' then set('Best to not hard code this', use_quotes: true)
|
23
|
+
when 'boolean' then set('true')
|
24
|
+
when 'picklist' then set("#{class_name}::#{field['name']}.sample")
|
25
|
+
when 'reference'
|
26
|
+
soql_obj = LeapSalesforce.soql_objects.find { |so| so.backend_name == field['relationshipName'] }&.reference
|
27
|
+
if soql_obj
|
28
|
+
"association :#{@field['label'].unused_ruby_name}, factory: :#{soql_obj}"
|
29
|
+
else
|
30
|
+
"# Please add #{field['relationshipName']} to .leap_salesforce.yml to create association for #{field}"
|
31
|
+
end
|
32
|
+
else
|
33
|
+
set("Content depending on #{field['type']}", use_quotes: true)
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
# Contains default fields for various out of the box entities to be included in Factory
|
40
|
+
module Fields
|
41
|
+
class << self
|
42
|
+
def contact
|
43
|
+
%w[FirstName LastName]
|
44
|
+
end
|
45
|
+
|
46
|
+
def account
|
47
|
+
['Name']
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module LeapSalesforce
|
4
|
+
# Helpers for LeapSalesforce executable
|
5
|
+
module ExeHelpers
|
6
|
+
# Return input for query
|
7
|
+
# @param [String] query Query to ask on terminal
|
8
|
+
# @return [String] User input to store
|
9
|
+
def input_for(query)
|
10
|
+
puts query
|
11
|
+
$stdin.gets.strip
|
12
|
+
end
|
13
|
+
|
14
|
+
# Ask user to enter parameters specific to their Salesforce environment
|
15
|
+
def query_for_parameters
|
16
|
+
puts 'Please enter the following information to generate files for a new leap_salesforce testing repo'
|
17
|
+
# Ask for OAuth credential details
|
18
|
+
@client_id = options[:client_id] || input_for('Enter the client id')
|
19
|
+
@client_secret = options[:client_secret] || input_for('Enter the client secret')
|
20
|
+
@username = options[:username] || input_for('Enter the Salesforce username. It is ideal to start with a System admin' \
|
21
|
+
' so that any necessary metadata can be read')
|
22
|
+
@user_key = options[:user_key] || input_for('Enter a key to refer to this user (This will be stored as a Symbol)')
|
23
|
+
@password = options[:password] || input_for('Enter password for this user. Recommendation is that 1 password be shared across' \
|
24
|
+
' all test users to be easier to manage')
|
25
|
+
@environment = options[:environment] || input_for('Enter the environment you want to set things up for ' \
|
26
|
+
'(This will be parameterised so can be changed later)')
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,60 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
require 'erb'
|
3
|
+
require 'fileutils'
|
4
|
+
require_relative 'exe_helpers'
|
5
|
+
|
6
|
+
module LeapSalesforce
|
7
|
+
# Generators for creating code
|
8
|
+
module Generator
|
9
|
+
# @param [String] filename Relative filename to this file
|
10
|
+
# @param [Binding] binding Binding object used for ERB variables
|
11
|
+
# @return [String] Interpreted file after calculating ERB for template file passed
|
12
|
+
def read_template(filename, binding)
|
13
|
+
ERB.new(File.read(File.join(__dir__, 'templates', filename))).result(binding)
|
14
|
+
end
|
15
|
+
|
16
|
+
# Generate file creating necessary folder if necessary
|
17
|
+
# @param [String] filename Name of file to generate
|
18
|
+
# @param [String] content Content to put within file
|
19
|
+
def generate_file(filename, content, overwrite: true)
|
20
|
+
FileUtils.mkdir_p File.dirname filename unless File.directory? File.dirname(filename)
|
21
|
+
return puts "File '#{filename}' already exists, skipping..." if (File.exist?(filename) && !overwrite)
|
22
|
+
|
23
|
+
File.write filename, content
|
24
|
+
puts "Created file at #{filename}"
|
25
|
+
end
|
26
|
+
|
27
|
+
# @example Create a spec_helper file and test file in spec folder
|
28
|
+
# generate_files [ { spec: [ 'spec_helper.rb', 'limit_spec.rb' ] } ]
|
29
|
+
# @param [Hash] list_of_files Hash of files to generate for
|
30
|
+
def generate_files(binding, list_of_files, folder: nil)
|
31
|
+
return create_inner_file(folder, list_of_files, binding) unless list_of_files.respond_to? :each
|
32
|
+
|
33
|
+
list_of_files.each do |item|
|
34
|
+
if item.is_a? Hash # Go one level deeper
|
35
|
+
item.each do |inner_folder, sub_files|
|
36
|
+
inner_folder = inner_folder.to_s
|
37
|
+
current_folder = folder ? File.join(folder, inner_folder) : inner_folder
|
38
|
+
generate_files binding, sub_files, folder: current_folder
|
39
|
+
end
|
40
|
+
else
|
41
|
+
create_inner_file folder, item, binding
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
def create_inner_file(folder, name, binding)
|
47
|
+
item = name.to_s
|
48
|
+
path = folder ? File.join(folder, item) : item
|
49
|
+
generate_from_template path, binding
|
50
|
+
end
|
51
|
+
|
52
|
+
# Generate file from template
|
53
|
+
# @param [String] template_name Path to file with templates folder to use as template
|
54
|
+
# @param [Binding] binding Binding object used for ERB variables
|
55
|
+
def generate_from_template(template_name, binding)
|
56
|
+
content = read_template "#{template_name}.erb", binding
|
57
|
+
generate_file template_name, content, overwrite: false
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require_relative 'soql_objects'
|
2
4
|
|
3
5
|
module LeapSalesforce
|
@@ -29,8 +31,8 @@ module LeapSalesforce
|
|
29
31
|
puts "#{picklists.count} picklists found"
|
30
32
|
picklists.each do |picklist|
|
31
33
|
@picklist = picklist
|
32
|
-
@enum_name = picklist.tr(" '/()-", '')
|
33
|
-
picklist_name = picklist.
|
34
|
+
@enum_name = picklist.tr(" '/()-", '').remove_macrons
|
35
|
+
picklist_name = picklist.to_key_name
|
34
36
|
values = entity.picklist_for picklist
|
35
37
|
@enum_values = {}
|
36
38
|
values.each { |value| @enum_values[value.to_key_name] = value }
|
@@ -1,25 +1,12 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'fileutils'
|
2
|
-
require_relative '
|
4
|
+
require_relative 'default'
|
5
|
+
require_relative 'generator'
|
3
6
|
|
4
7
|
module LeapSalesforce
|
5
8
|
# Generators for creating code
|
6
9
|
module Generator
|
7
|
-
# @param [String] filename Relative filename to this file
|
8
|
-
# @param [Binding] binding Binding object used for ERB variables
|
9
|
-
# @return [String] Interpreted file after calculating ERB for template file passed
|
10
|
-
def read_template(filename, binding)
|
11
|
-
ERB.new(File.read(File.join(__dir__, 'templates', filename))).result(binding)
|
12
|
-
end
|
13
|
-
|
14
|
-
# Generate file creating necessary folder if necessary
|
15
|
-
# @param [String] filename Name of file to generate
|
16
|
-
# @param [String] content Content to put within file
|
17
|
-
def generate_file(filename, content)
|
18
|
-
FileUtils.mkdir_p File.dirname filename unless File.directory? File.dirname(filename)
|
19
|
-
File.write filename, content
|
20
|
-
puts "Created file at #{filename}"
|
21
|
-
end
|
22
|
-
|
23
10
|
# Creates SoqlObjects and related modules
|
24
11
|
class SoqlObjects
|
25
12
|
include Generator
|
@@ -27,23 +14,12 @@ module LeapSalesforce
|
|
27
14
|
SOQL_OBJECT_FOLDER = File.join(LeapSalesforce.lib_folder, 'soql_data').freeze
|
28
15
|
FACTORY_FOLDER = File.join(LeapSalesforce.lib_folder, 'factories').freeze
|
29
16
|
|
30
|
-
# Extracts the soql_object defined in '.leap_salesforce.yml' and assigns instance variables
|
31
|
-
def extract_info_from_object(soql_object)
|
32
|
-
@class_name, @soql_object = case soql_object
|
33
|
-
when Hash
|
34
|
-
@create_enum = soql_object['create_enum'].nil? ? true : soql_object['create_enum']
|
35
|
-
[soql_object.keys[0], soql_object.values[0] || soql_object.keys[0]]
|
36
|
-
else
|
37
|
-
[soql_object.to_s, soql_object.to_s]
|
38
|
-
end
|
39
|
-
end
|
40
|
-
|
41
17
|
# Create temporary class for building API requests on
|
42
18
|
def ensure_class_defined
|
43
|
-
@soql_class = Object.const_get @class_name
|
19
|
+
@soql_class = Object.const_get @soql_object.class_name
|
44
20
|
rescue NameError
|
45
|
-
@soql_class = Object.const_set @class_name, Class.new(SoqlData)
|
46
|
-
@soql_class.instance_variable_set(:@soql_object_name, @soql_object)
|
21
|
+
@soql_class = Object.const_set @soql_object.class_name, Class.new(SoqlData)
|
22
|
+
@soql_class.instance_variable_set(:@soql_object_name, @soql_object.backend_name)
|
47
23
|
end
|
48
24
|
|
49
25
|
# Generate Soql object file
|
@@ -52,10 +28,10 @@ module LeapSalesforce
|
|
52
28
|
desc = @soql_class.description
|
53
29
|
unless desc.soql_fields?
|
54
30
|
raise LeapSalesforce::SetupError, "Error producing Soql data for '#{@soql_class}', soql table " \
|
55
|
-
" '#{@soql_object}'. Error message: '#{desc.error_message}'"
|
31
|
+
" '#{@soql_object.backend_name}'. Error message: '#{desc.error_message}'"
|
56
32
|
end
|
57
33
|
content = read_template 'soql_object.rb.erb', binding
|
58
|
-
file = File.join(SOQL_OBJECT_FOLDER, "#{@
|
34
|
+
file = File.join(SOQL_OBJECT_FOLDER, "#{@soql_object.reference}.rb")
|
59
35
|
generate_file file, content
|
60
36
|
end
|
61
37
|
|
@@ -68,23 +44,19 @@ module LeapSalesforce
|
|
68
44
|
|
69
45
|
# Generate factory for mass generating objects using FactoryBot
|
70
46
|
def generate_factory
|
71
|
-
|
72
|
-
all_fields = @soql_class.fields
|
73
|
-
@default_fields, @other_fields = if DefaultFields.respond_to? class_method_name
|
74
|
-
all_fields.partition { |field| DefaultFields.send(class_method_name).include? field['name'] }
|
75
|
-
else
|
76
|
-
[[], all_fields]
|
77
|
-
end
|
47
|
+
@default_fields, @other_fields = filter_fields
|
78
48
|
content = read_template 'factory.rb.erb', binding
|
79
|
-
file = File.join(FACTORY_FOLDER, "#{@
|
49
|
+
file = File.join(FACTORY_FOLDER, "#{@soql_object.reference}.rb")
|
80
50
|
generate_file file, content
|
81
51
|
end
|
82
52
|
|
83
53
|
# Generate soql_object and it's related modules, factories
|
84
54
|
def create_all
|
85
|
-
LeapSalesforce.soql_objects.
|
86
|
-
|
87
|
-
|
55
|
+
puts "Generating Soql objects for #{LeapSalesforce.soql_objects.count} objects"
|
56
|
+
LeapSalesforce.soql_objects.each do |soql_object| # Soql object is now special class
|
57
|
+
# extract_info_from_object soql_object
|
58
|
+
@soql_object = soql_object
|
59
|
+
@field_name_file = "#{soql_object.reference}_field_names"
|
88
60
|
generate_soql_object
|
89
61
|
generate_field_module
|
90
62
|
generate_factory
|
@@ -92,6 +64,19 @@ module LeapSalesforce
|
|
92
64
|
`rubocop -a #{SOQL_OBJECT_FOLDER}`
|
93
65
|
`rubocop -a #{FACTORY_FOLDER}`
|
94
66
|
end
|
67
|
+
|
68
|
+
private
|
69
|
+
|
70
|
+
# @return [Array] Returns Array with first list being default fields for Factory and the 2nd being
|
71
|
+
# all other fields
|
72
|
+
def filter_fields
|
73
|
+
all_fields = @soql_class.fields
|
74
|
+
if Default::Fields.respond_to? @soql_object.reference
|
75
|
+
all_fields.partition { |field| Default::Fields.send(@soql_object.reference).include? field['name'] }
|
76
|
+
else
|
77
|
+
[[], all_fields]
|
78
|
+
end
|
79
|
+
end
|
95
80
|
end
|
96
81
|
end
|
97
82
|
end
|
@@ -0,0 +1,9 @@
|
|
1
|
+
environment: <%= @environment %>
|
2
|
+
# lib_folder: lib/leap_salesforce # Default folder where assets will be stored
|
3
|
+
soql_objects:
|
4
|
+
- Case
|
5
|
+
- Contact
|
6
|
+
- Document: ContentDocument
|
7
|
+
- User:
|
8
|
+
create_enum: false # Example of indicating that enumerations are not required to be generated for
|
9
|
+
- Account
|
@@ -1,12 +1,12 @@
|
|
1
1
|
# Basic factory settings made according to values defined at
|
2
2
|
# https://developer.salesforce.com/docs/atlas.en-us.api.meta/api/sforce_api_objects_case.htm
|
3
3
|
FactoryBot.define do
|
4
|
-
<%= "factory :#{@
|
4
|
+
<%= "factory :#{@soql_object.reference} do" %>
|
5
5
|
<% @default_fields.each do |field| %>
|
6
|
-
<%=
|
6
|
+
<%= LeapSalesforce::Default::Factory.value_for(field, @soql_object.class_name) %> <% end %>
|
7
7
|
trait :all do
|
8
8
|
<% @other_fields.each do |field| %>
|
9
|
-
<%=
|
9
|
+
<%= LeapSalesforce::Default::Factory.value_for(field, @soql_object.class_name) %> <% end %>
|
10
10
|
end
|
11
11
|
<%= 'end' %>
|
12
12
|
end
|
@@ -1,7 +1,7 @@
|
|
1
1
|
require_relative '<%= @field_name_file %>'
|
2
|
-
# An <%= @class_name %> object mapping to a SOQL <%= @soql_object %>
|
3
|
-
class <%= @class_name %> < SoqlData
|
4
|
-
include <%= @class_name %>::Fields
|
5
|
-
<%= "soql_object '#{@soql_object}'" unless @soql_object == @class_name %>
|
6
|
-
<%= "create_enum false" if @create_enum == false %>
|
2
|
+
# An <%= @soql_object.class_name %> object mapping to a SOQL <%= @soql_object.backend_name %>
|
3
|
+
class <%= @soql_object.class_name %> < SoqlData
|
4
|
+
include <%= @soql_object.class_name %>::Fields
|
5
|
+
<%= "soql_object '#{@soql_object.backend_name}'" unless @soql_object.backend_name == @soql_object.class_name %>
|
6
|
+
<%= "create_enum false" if @soql_object.create_enum == false %>
|
7
7
|
end
|
@@ -1,5 +1,5 @@
|
|
1
|
-
# Fields for <%= @class_name %> mapped from SOQL <%= @soql_object %>
|
2
|
-
class <%= @class_name %> < SoqlData
|
1
|
+
# Fields for <%= @soql_object.class_name %> mapped from SOQL <%= @soql_object.backend_name %>
|
2
|
+
class <%= @soql_object.class_name %> < SoqlData
|
3
3
|
module Fields
|
4
4
|
extend SoqlGlobalObjectData
|
5
5
|
<% @soql_class.fields.each do |field| %>
|
@@ -0,0 +1,24 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
# This file demonstrates how simple creation, reading updating and deletion (CRUD)
|
3
|
+
# can be done through LeapSalesforce classes
|
4
|
+
# Depending on validation rules and mandatory fields this may or may not work
|
5
|
+
|
6
|
+
RSpec.describe 'Contact CRUD' do
|
7
|
+
let(:uniq_value) { 'UNIQ FIRST NAME' }
|
8
|
+
let(:updated_value) { 'New Value' }
|
9
|
+
it 'Create using factory bot' do
|
10
|
+
@contact = FactoryBot.create(:contact)
|
11
|
+
end
|
12
|
+
it 'Read contact by name' do
|
13
|
+
FactoryBot.create(:contact, first_name: uniq_value)
|
14
|
+
@contact = Contact.find(FirstName: uniq_value)
|
15
|
+
retrieved_first_name = @contact.first_name
|
16
|
+
expect(retrieved_first_name).to eq uniq_value
|
17
|
+
end
|
18
|
+
it 'Updates contacts name' do
|
19
|
+
@contact = FactoryBot.create(:contact, first_name: uniq_value)
|
20
|
+
@contact.first_name = updated_value
|
21
|
+
expect(@contact.find.first_name).to eq updated_value
|
22
|
+
end
|
23
|
+
after { @contact.delete } # Delete data after each action. Comment out if you want data to remain
|
24
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
# This test demonstrates how limits can be checked for an organisation to ensure that memory is not run out of
|
3
|
+
|
4
|
+
RSpec.describe 'Limits' do
|
5
|
+
let(:soql_limits) { SoqlData.limits }
|
6
|
+
context 'Storage > 4MB' do
|
7
|
+
it 'data storage' do
|
8
|
+
expect(LeapSalesforce::Limits.remaining_for(:DataStorageMB)).to be > 4
|
9
|
+
end
|
10
|
+
it 'file storage' do
|
11
|
+
expect(LeapSalesforce::Limits.remaining_for(:FileStorageMB)).to be > 4
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module LeapSalesforce
|
2
4
|
# Handles retrieving limits of a Salesforce instance
|
3
5
|
class Limits
|
@@ -5,8 +7,7 @@ module LeapSalesforce
|
|
5
7
|
# @param [Symbol, String] limit_name Name of limit to find remaining amount for
|
6
8
|
# @return [Integer] Finds remaining amount for a Salesforce limit
|
7
9
|
def remaining_for(limit_name)
|
8
|
-
|
9
|
-
limit_data['Max'] - limit_data['Remaining']
|
10
|
+
SoqlData.limits[limit_name]['Remaining']
|
10
11
|
end
|
11
12
|
end
|
12
13
|
end
|
@@ -1,6 +1,7 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
require_relative 'users/users'
|
4
|
+
require_relative 'soql_object'
|
4
5
|
|
5
6
|
# Adding parameters to set for authentication
|
6
7
|
module LeapSalesforce
|
@@ -8,6 +9,10 @@ module LeapSalesforce
|
|
8
9
|
@lib_folder = File.join('lib', 'leap_salesforce').freeze
|
9
10
|
@objects_to_verify = []
|
10
11
|
@soql_objects = []
|
12
|
+
@client_id = ENV['client_id']
|
13
|
+
@client_secret = ENV['client_secret']
|
14
|
+
@password = ENV['password']
|
15
|
+
@environment = nil
|
11
16
|
class << self
|
12
17
|
# @return [String] Environment to use for tests. This can be accessed to change the username used to login
|
13
18
|
# to test.salesforce with. This can be set on the command line with 'LEAP_ENV'
|
@@ -48,6 +53,13 @@ module LeapSalesforce
|
|
48
53
|
# Changes to these values will need to be version controlled
|
49
54
|
attr_accessor :objects_to_verify
|
50
55
|
# @return [Array] List of Soql Objects identified for Leap Salesforce to maintain
|
51
|
-
|
56
|
+
attr_reader :soql_objects
|
57
|
+
|
58
|
+
# @return [Array] list_of_soql_objects Array describing Soql objects taken from .leap_salesforce.yml
|
59
|
+
def soql_objects=(list_of_soql_objects)
|
60
|
+
@soql_objects = list_of_soql_objects.collect do |soql_object_desc|
|
61
|
+
SoqlObject.new(soql_object_desc)
|
62
|
+
end
|
63
|
+
end
|
52
64
|
end
|
53
65
|
end
|