rhoconnect-adapters 1.0.0.beta1
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.
- data/.gitignore +4 -0
- data/CHANGELOG +4 -0
- data/Gemfile +18 -0
- data/README.md +239 -0
- data/Rakefile +31 -0
- data/bin/rhoconnect-adapters +35 -0
- data/generators/crm/templates/application/application.rb +34 -0
- data/generators/crm/templates/source/source_adapter.rb +10 -0
- data/generators/crm/templates/source/source_spec.rb +25 -0
- data/generators/crm/templates/spec/spec_helper.rb +64 -0
- data/generators/crm/vendor/ms_dynamics/adapter.rb +301 -0
- data/generators/crm/vendor/ms_dynamics/application.rb +56 -0
- data/generators/crm/vendor/ms_dynamics/lib/crm_metadata_service.rb +43 -0
- data/generators/crm/vendor/ms_dynamics/lib/crm_service.rb +141 -0
- data/generators/crm/vendor/ms_dynamics/lib/discovery_service.rb +51 -0
- data/generators/crm/vendor/ms_dynamics/lib/wlid_service.rb +159 -0
- data/generators/crm/vendor/ms_dynamics/ms_dynamics.rb +45 -0
- data/generators/crm/vendor/ms_dynamics/settings/Account.yml +46 -0
- data/generators/crm/vendor/ms_dynamics/settings/Contact.yml +40 -0
- data/generators/crm/vendor/ms_dynamics/settings/GenericObject.yml +18 -0
- data/generators/crm/vendor/ms_dynamics/settings/Lead.yml +53 -0
- data/generators/crm/vendor/ms_dynamics/settings/Opportunity.yml +41 -0
- data/generators/crm/vendor/ms_dynamics/settings/settings.yml +9 -0
- data/generators/crm/vendor/ms_dynamics/spec/application_spec.rb +23 -0
- data/generators/crm/vendor/ms_dynamics/spec/sources/account_spec.rb +49 -0
- data/generators/crm/vendor/ms_dynamics/spec/sources/contact_spec.rb +49 -0
- data/generators/crm/vendor/ms_dynamics/spec/sources/lead_spec.rb +49 -0
- data/generators/crm/vendor/ms_dynamics/spec/sources/opportunity_spec.rb +62 -0
- data/generators/crm/vendor/ms_dynamics/spec/spec_helper.rb +78 -0
- data/generators/crm/vendor/ms_dynamics/spec_data/Account.yml +6 -0
- data/generators/crm/vendor/ms_dynamics/spec_data/Contact.yml +7 -0
- data/generators/crm/vendor/ms_dynamics/spec_data/GenericObject.yml +3 -0
- data/generators/crm/vendor/ms_dynamics/spec_data/Lead.yml +12 -0
- data/generators/crm/vendor/ms_dynamics/spec_data/Opportunity.yml +6 -0
- data/generators/crm/vendor/ms_dynamics/templates.rb +57 -0
- data/generators/crm/vendor/oracle_on_demand/adapter.rb +421 -0
- data/generators/crm/vendor/oracle_on_demand/application.rb +64 -0
- data/generators/crm/vendor/oracle_on_demand/settings/Account.yml +91 -0
- data/generators/crm/vendor/oracle_on_demand/settings/Contact.yml +54 -0
- data/generators/crm/vendor/oracle_on_demand/settings/GenericObject.yml +21 -0
- data/generators/crm/vendor/oracle_on_demand/settings/Lead.yml +72 -0
- data/generators/crm/vendor/oracle_on_demand/settings/Opportunity.yml +69 -0
- data/generators/crm/vendor/oracle_on_demand/settings/settings.yml +8 -0
- data/generators/crm/vendor/oracle_on_demand/spec/application_spec.rb +14 -0
- data/generators/crm/vendor/oracle_on_demand/spec/sources/account_spec.rb +50 -0
- data/generators/crm/vendor/oracle_on_demand/spec/sources/contact_spec.rb +50 -0
- data/generators/crm/vendor/oracle_on_demand/spec/sources/lead_spec.rb +51 -0
- data/generators/crm/vendor/oracle_on_demand/spec/sources/opportunity_spec.rb +51 -0
- data/generators/crm/vendor/oracle_on_demand/spec_data/Account.yml +8 -0
- data/generators/crm/vendor/oracle_on_demand/spec_data/Contact.yml +8 -0
- data/generators/crm/vendor/oracle_on_demand/spec_data/GenericObject.yml +4 -0
- data/generators/crm/vendor/oracle_on_demand/spec_data/Lead.yml +14 -0
- data/generators/crm/vendor/oracle_on_demand/spec_data/Opportunity.yml +6 -0
- data/generators/crm/vendor/oracle_on_demand/templates.rb +52 -0
- data/generators/crm/vendor/salesforce/adapter.rb +315 -0
- data/generators/crm/vendor/salesforce/application.rb +80 -0
- data/generators/crm/vendor/salesforce/settings/Account.yml +53 -0
- data/generators/crm/vendor/salesforce/settings/Contact.yml +61 -0
- data/generators/crm/vendor/salesforce/settings/GenericObject.yml +13 -0
- data/generators/crm/vendor/salesforce/settings/Lead.yml +73 -0
- data/generators/crm/vendor/salesforce/settings/Opportunity.yml +48 -0
- data/generators/crm/vendor/salesforce/settings/settings.yml +6 -0
- data/generators/crm/vendor/salesforce/spec/application_spec.rb +14 -0
- data/generators/crm/vendor/salesforce/spec/sources/account_spec.rb +50 -0
- data/generators/crm/vendor/salesforce/spec/sources/contact_spec.rb +50 -0
- data/generators/crm/vendor/salesforce/spec/sources/lead_spec.rb +51 -0
- data/generators/crm/vendor/salesforce/spec/sources/opportunity_spec.rb +51 -0
- data/generators/crm/vendor/salesforce/spec_data/Account.yml +14 -0
- data/generators/crm/vendor/salesforce/spec_data/Contact.yml +8 -0
- data/generators/crm/vendor/salesforce/spec_data/GenericObject.yml +3 -0
- data/generators/crm/vendor/salesforce/spec_data/Lead.yml +10 -0
- data/generators/crm/vendor/salesforce/spec_data/Opportunity.yml +10 -0
- data/generators/crm/vendor/salesforce/templates.rb +45 -0
- data/generators/crm/vendor/sugar/adapter.rb +291 -0
- data/generators/crm/vendor/sugar/application.rb +50 -0
- data/generators/crm/vendor/sugar/settings/Account.yml +49 -0
- data/generators/crm/vendor/sugar/settings/Contact.yml +62 -0
- data/generators/crm/vendor/sugar/settings/GenericObject.yml +12 -0
- data/generators/crm/vendor/sugar/settings/Lead.yml +76 -0
- data/generators/crm/vendor/sugar/settings/Opportunity.yml +49 -0
- data/generators/crm/vendor/sugar/settings/settings.yml +9 -0
- data/generators/crm/vendor/sugar/spec/application_spec.rb +25 -0
- data/generators/crm/vendor/sugar/spec/sources/account_spec.rb +53 -0
- data/generators/crm/vendor/sugar/spec/sources/contact_spec.rb +53 -0
- data/generators/crm/vendor/sugar/spec/sources/lead_spec.rb +54 -0
- data/generators/crm/vendor/sugar/spec/sources/opportunity_spec.rb +54 -0
- data/generators/crm/vendor/sugar/spec_data/Account.yml +13 -0
- data/generators/crm/vendor/sugar/spec_data/Contact.yml +8 -0
- data/generators/crm/vendor/sugar/spec_data/GenericObject.yml +3 -0
- data/generators/crm/vendor/sugar/spec_data/Lead.yml +16 -0
- data/generators/crm/vendor/sugar/spec_data/Opportunity.yml +10 -0
- data/generators/crm/vendor/sugar/sugar.rb +33 -0
- data/generators/crm/vendor/sugar/templates.rb +58 -0
- data/generators/rhoconnect-adapters.rb +217 -0
- data/lib/rhoconnect-adapters/crm/crm.rb +31 -0
- data/lib/rhoconnect-adapters/soap_service.rb +70 -0
- data/lib/rhoconnect-adapters/version.rb +3 -0
- data/lib/rhoconnect-adapters.rb +2 -0
- data/rhoconnect-adapters.gemspec +36 -0
- data/spec/apps/ms_dynamics_spec.rb +19 -0
- data/spec/apps/oracle_on_demand_spec.rb +20 -0
- data/spec/apps/salesforce_spec.rb +18 -0
- data/spec/apps/sugar_spec.rb +18 -0
- data/spec/generator/generator_spec.rb +113 -0
- data/spec/spec_helper.rb +57 -0
- metadata +288 -0
|
@@ -0,0 +1,217 @@
|
|
|
1
|
+
require 'rubygems'
|
|
2
|
+
require 'rhoconnect'
|
|
3
|
+
|
|
4
|
+
require File.join('rhoconnect', '..','..','generators','rhoconnect')
|
|
5
|
+
require 'templater'
|
|
6
|
+
|
|
7
|
+
require 'rhoconnect-adapters'
|
|
8
|
+
|
|
9
|
+
module RhoconnectAdapters
|
|
10
|
+
extend Templater::Manifold
|
|
11
|
+
extend RhoconnectAdapters
|
|
12
|
+
|
|
13
|
+
desc <<-DESC
|
|
14
|
+
Rhoconnect-adapters generator
|
|
15
|
+
DESC
|
|
16
|
+
|
|
17
|
+
class NotSupportedBackendError < Templater::MalformattedArgumentError
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
class BaseGenerator < Templater::Generator
|
|
21
|
+
def class_name
|
|
22
|
+
name.gsub('-', '_').camel_case
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
def underscore_name
|
|
26
|
+
Rhoconnect.under_score(name)
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
def configure_gemfile
|
|
30
|
+
gem_file = File.join(@destination_root,"#{name}",'Gemfile')
|
|
31
|
+
doc = "\ngem 'rhoconnect-adapters', '#{gem_version}'\n"
|
|
32
|
+
File.open(gem_file, 'a') {|f| f.write(doc) }
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
def self.invoke_generator(gen_name, excludes = nil)
|
|
36
|
+
invoke gen_name do |ext_gen|
|
|
37
|
+
if not excludes.nil?
|
|
38
|
+
ext_gen.templates.delete_if {|t| excludes.index(t.name) != nil }
|
|
39
|
+
end
|
|
40
|
+
ext_gen.new(destination_root, {}, name)
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
class CRMBaseGenerator < BaseGenerator
|
|
46
|
+
def underscore_crm
|
|
47
|
+
Rhoconnect.under_score(crm)
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
def crm_name
|
|
51
|
+
crm
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
def gem_version
|
|
55
|
+
VERSION
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
def self.check_valid_backend(name)
|
|
59
|
+
if not RhoconnectAdapters::CRM.valid_backend?(name)
|
|
60
|
+
puts "Requested CRM backend '#{name}' is not supported."
|
|
61
|
+
puts ''
|
|
62
|
+
puts 'List of supported backends:'
|
|
63
|
+
RhoconnectAdapters::CRM.registered_backends.each do |crm|
|
|
64
|
+
puts " - #{crm}"
|
|
65
|
+
end
|
|
66
|
+
puts ''
|
|
67
|
+
raise NotSupportedBackendError
|
|
68
|
+
end
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
def configure_gemfile
|
|
72
|
+
super
|
|
73
|
+
|
|
74
|
+
# also call vendor-defined method
|
|
75
|
+
gem_file = File.join(@destination_root,"#{name}",'Gemfile')
|
|
76
|
+
vendor_module = RhoconnectAdapters::CRM.const_get(crm_name.to_sym)
|
|
77
|
+
vendor_dependencies = vendor_module.configure_gemfile
|
|
78
|
+
doc = ''
|
|
79
|
+
vendor_dependencies.each do |key, val|
|
|
80
|
+
doc += "gem '#{key}', '#{val}'\n"
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
File.open(gem_file, 'a') {|f| f.write(doc) }
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
def self.add_vendor_templates(verb, tname, &block)
|
|
87
|
+
send verb, "#{tname}_vendor_custom".to_sym do |t|
|
|
88
|
+
yield t,name,crm
|
|
89
|
+
end
|
|
90
|
+
end
|
|
91
|
+
|
|
92
|
+
def initialize(generator_name, generator_class, *arguments)
|
|
93
|
+
super(generator_name, generator_class, *arguments)
|
|
94
|
+
RhoconnectAdapters::CRMBaseGenerator.check_valid_backend(arguments[1])
|
|
95
|
+
end
|
|
96
|
+
end
|
|
97
|
+
|
|
98
|
+
class CRMAppGenerator < CRMBaseGenerator
|
|
99
|
+
def self.source_root
|
|
100
|
+
File.join(File.dirname(__FILE__), 'crm', 'templates', 'application')
|
|
101
|
+
end
|
|
102
|
+
|
|
103
|
+
desc <<-DESC
|
|
104
|
+
Generates a new rhoconnect CRM application.
|
|
105
|
+
|
|
106
|
+
Required:
|
|
107
|
+
name - application name
|
|
108
|
+
CRM backend - supported CRM backend #{RhoconnectAdapters::CRM.registered_backends.inspect}
|
|
109
|
+
DESC
|
|
110
|
+
|
|
111
|
+
first_argument :name, :required => true, :desc => "application name"
|
|
112
|
+
second_argument :crm, :required => true, :desc => "supported CRM backend #{RhoconnectAdapters::CRM.registered_backends.inspect}"
|
|
113
|
+
#third_argument :__bare, :required => false, :desc => "generate CRM application without standard sources", :as => :boolean
|
|
114
|
+
option :bare, :default => false, :desc => "generate CRM application without standard sources", :as => :boolean
|
|
115
|
+
|
|
116
|
+
# to prevent re-loading on subsequent loads
|
|
117
|
+
actions.clear
|
|
118
|
+
|
|
119
|
+
# purpose of this call is to invoke all templates in
|
|
120
|
+
# the Rhoconnect::Generator except the :application - which is overriden here
|
|
121
|
+
invoke_generator :rhoconnect_app, [:application, :spec_helper]
|
|
122
|
+
template :application do |template|
|
|
123
|
+
template.source = 'application.rb'
|
|
124
|
+
template.destination = "#{name}/application.rb"
|
|
125
|
+
end
|
|
126
|
+
template :spec_helper do |template|
|
|
127
|
+
source_filename = File.join('..','..','vendor',underscore_crm,'spec','spec_helper.rb')
|
|
128
|
+
if File.exists? File.join(CRMAppGenerator.source_root, source_filename)
|
|
129
|
+
template.source = source_filename
|
|
130
|
+
else
|
|
131
|
+
template.source = File.join('..','spec','spec_helper.rb')
|
|
132
|
+
end
|
|
133
|
+
template.destination = "#{name}/spec/spec_helper.rb"
|
|
134
|
+
end
|
|
135
|
+
template :vendor_application do |template|
|
|
136
|
+
template.source = File.join('..','..','vendor',"#{underscore_crm}",'application.rb')
|
|
137
|
+
template.destination = File.join("#{name}",'vendor',"#{underscore_crm}",'application.rb')
|
|
138
|
+
end
|
|
139
|
+
template :vendor_adapter do |template|
|
|
140
|
+
template.source = File.join('..','..','vendor',"#{underscore_crm}",'adapter.rb')
|
|
141
|
+
template.destination = File.join("#{name}",'vendor',"#{underscore_crm}",'adapter.rb')
|
|
142
|
+
end
|
|
143
|
+
|
|
144
|
+
def after_run
|
|
145
|
+
configure_gemfile
|
|
146
|
+
# after app is generated , generate the standard sources
|
|
147
|
+
# but only if --bare is not specified
|
|
148
|
+
if not bare
|
|
149
|
+
RhoconnectAdapters::CRM.standard_sources.each do |source|
|
|
150
|
+
RhoconnectAdapters.run_cli(File.join(destination_root,name), 'rhoconnect-adapters', RhoconnectAdapters::VERSION, ['crmsource', "#{source}", crm])
|
|
151
|
+
end
|
|
152
|
+
end
|
|
153
|
+
end
|
|
154
|
+
end
|
|
155
|
+
|
|
156
|
+
class CRMSourceGenerator < CRMBaseGenerator
|
|
157
|
+
def self.source_root
|
|
158
|
+
File.join(File.dirname(__FILE__), 'crm', 'templates', 'source')
|
|
159
|
+
end
|
|
160
|
+
|
|
161
|
+
desc <<-DESC
|
|
162
|
+
Generates a new source adapter based on CRM object.
|
|
163
|
+
|
|
164
|
+
Required:
|
|
165
|
+
name - source name(i.e. Account)
|
|
166
|
+
CRM backend - supported CRM backend #{RhoconnectAdapters::CRM.registered_backends.inspect}
|
|
167
|
+
DESC
|
|
168
|
+
|
|
169
|
+
first_argument :name, :required => true, :desc => "source name"
|
|
170
|
+
second_argument :crm, :required => true, :desc => "supported CRM backend #{RhoconnectAdapters::CRM.registered_backends.inspect}"
|
|
171
|
+
|
|
172
|
+
# to prevent re-loading on subsequent loads
|
|
173
|
+
actions.clear
|
|
174
|
+
|
|
175
|
+
invoke_generator :rhoconnect_source, [:source, :source_spec]
|
|
176
|
+
template :source do |template|
|
|
177
|
+
template.source = 'source_adapter.rb'
|
|
178
|
+
template.destination = "sources/#{underscore_name}.rb"
|
|
179
|
+
settings_file = File.join(@destination_root,'settings','settings.yml')
|
|
180
|
+
settings = YAML.load_file(settings_file)
|
|
181
|
+
settings[:sources] ||= {}
|
|
182
|
+
settings[:sources][class_name] = {:poll_interval => 300}
|
|
183
|
+
File.open(settings_file, 'w' ) do |file|
|
|
184
|
+
file.write "#Sources" + {:sources => settings[:sources]}.to_yaml[3..-1]
|
|
185
|
+
envs = {}
|
|
186
|
+
[:development,:test,:production].each do |env|
|
|
187
|
+
envs[env] = settings[env]
|
|
188
|
+
end
|
|
189
|
+
file.write envs.to_yaml[3..-1]
|
|
190
|
+
end
|
|
191
|
+
end
|
|
192
|
+
template :source_spec do |template|
|
|
193
|
+
source_filename = File.join('..','..','vendor',underscore_crm,'spec','sources',"#{underscore_name}_spec.rb")
|
|
194
|
+
if File.exists? File.join(CRMSourceGenerator.source_root, source_filename)
|
|
195
|
+
template.source = source_filename
|
|
196
|
+
else
|
|
197
|
+
template.source = 'source_spec.rb'
|
|
198
|
+
end
|
|
199
|
+
template.destination = "spec/sources/#{underscore_name}_spec.rb"
|
|
200
|
+
end
|
|
201
|
+
end
|
|
202
|
+
|
|
203
|
+
add_private :rhoconnect_app, Rhoconnect::AppGenerator
|
|
204
|
+
add_private :rhoconnect_source, Rhoconnect::SourceGenerator
|
|
205
|
+
add :crmapp, CRMAppGenerator
|
|
206
|
+
add :crmsource, CRMSourceGenerator
|
|
207
|
+
end
|
|
208
|
+
|
|
209
|
+
include RhoconnectAdapters
|
|
210
|
+
|
|
211
|
+
if ARGV[0] == 'crmapp' || ARGV[0] == 'crmsource'
|
|
212
|
+
backend_arg = ARGV.last
|
|
213
|
+
if backend_arg == '--bare'
|
|
214
|
+
backend_arg = ARGV[2]
|
|
215
|
+
end
|
|
216
|
+
Dir[File.join(File.dirname(__FILE__),'crm','vendor',"#{Rhoconnect.under_score(backend_arg)}",'templates.rb')].each { |vendor_templates| load vendor_templates }
|
|
217
|
+
end
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
module RhoconnectAdapters
|
|
2
|
+
module CRM
|
|
3
|
+
class << self
|
|
4
|
+
attr_reader :registered_backends
|
|
5
|
+
attr_reader :standard_sources
|
|
6
|
+
|
|
7
|
+
def valid_backend?(name)
|
|
8
|
+
registered_backends.index(name) != nil
|
|
9
|
+
end
|
|
10
|
+
def standard_source?(name)
|
|
11
|
+
standard_sources.index(name) != nil
|
|
12
|
+
end
|
|
13
|
+
end
|
|
14
|
+
@registered_backends = ['MsDynamics','OracleOnDemand','Salesforce','Sugar'];
|
|
15
|
+
@standard_sources = ['Account','Contact','Opportunity','Lead'];
|
|
16
|
+
|
|
17
|
+
class Field
|
|
18
|
+
class << self
|
|
19
|
+
def create(name,type,label=nil)
|
|
20
|
+
{ name => { :type => type,
|
|
21
|
+
:label => label.nil? ? name : label }}
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
def load_file(filename,key=nil)
|
|
25
|
+
contents = YAML.load_file(filename)
|
|
26
|
+
return key.nil? ? contents : contents[key]
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
end
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
require 'rest-client'
|
|
2
|
+
require 'nokogiri'
|
|
3
|
+
|
|
4
|
+
module RhoconnectAdapters
|
|
5
|
+
class SoapService
|
|
6
|
+
@node_namespaces = {
|
|
7
|
+
'wsu' => 'http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd',
|
|
8
|
+
'wsse'=> 'http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd',
|
|
9
|
+
};
|
|
10
|
+
@envelope_namespaces = <<-DESC
|
|
11
|
+
xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\"
|
|
12
|
+
xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"
|
|
13
|
+
xmlns:wsse=\"http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd\"
|
|
14
|
+
xmlns:wsu=\"http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd\"
|
|
15
|
+
DESC
|
|
16
|
+
|
|
17
|
+
class << self
|
|
18
|
+
# use node_namespaces attribute to specify namespaces used
|
|
19
|
+
# by SoapService's select_node and select_node_text methods
|
|
20
|
+
attr_accessor :node_namespaces
|
|
21
|
+
# use envelope namespaces to be passed with the SOAP request
|
|
22
|
+
attr_accessor :envelope_namespaces
|
|
23
|
+
|
|
24
|
+
def select_node(doc,node_name)
|
|
25
|
+
doc.xpath("#{node_name}",SoapService.node_namespaces)
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
def select_node_text(doc,node_name)
|
|
29
|
+
doc.xpath("#{node_name}/text()",SoapService.node_namespaces).to_s.strip
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
def compose_wsse_header(username,password)
|
|
33
|
+
"<wsse:Security>
|
|
34
|
+
<wsse:UsernameToken wsu:Id=\"UsernameToken-1\">
|
|
35
|
+
<wsse:Username>#{username}</wsse:Username>
|
|
36
|
+
<wsse:Password Type=\"http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText\">#{password}</wsse:Password>
|
|
37
|
+
</wsse:UsernameToken>
|
|
38
|
+
</wsse:Security>"
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
def compose_message(header,body,namespaces=RhoconnectAdapters::SoapService.envelope_namespaces)
|
|
42
|
+
hdr = header ? "<s:Header>#{header}</s:Header>" : ""
|
|
43
|
+
bdy = body ? "<s:Body>#{body}</s:Body>" : ""
|
|
44
|
+
"<?xml version=\"1.0\"?>
|
|
45
|
+
<s:Envelope #{namespaces}>
|
|
46
|
+
#{hdr}
|
|
47
|
+
#{bdy}
|
|
48
|
+
</s:Envelope>"
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
def send_request(endpoint,message,action=nil,content_type='text/xml; charset=UTF-8',cookie=nil)
|
|
52
|
+
response = send_request_raw(endpoint, message, action, content_type, cookie)
|
|
53
|
+
Nokogiri::XML(response)
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
def send_request_raw(endpoint,message,action=nil,content_type='text/xml; charset=UTF-8',cookie=nil)
|
|
57
|
+
begin
|
|
58
|
+
headers = { :content_type => content_type }
|
|
59
|
+
headers.merge!({ "SOAPAction" => action }) if action
|
|
60
|
+
headers.merge!({ "Cookie" => cookie }) if cookie
|
|
61
|
+
response = RestClient.post(endpoint, message, headers)
|
|
62
|
+
rescue RestClient::Exception => ex
|
|
63
|
+
warn "#{self.name} error: " + ex.inspect.strip
|
|
64
|
+
ex.backtrace.each { |line| warn 'from ' + line }
|
|
65
|
+
raise ex
|
|
66
|
+
end
|
|
67
|
+
end
|
|
68
|
+
end
|
|
69
|
+
end
|
|
70
|
+
end
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
|
2
|
+
$:.push File.expand_path("../lib", __FILE__)
|
|
3
|
+
require "rhoconnect-adapters/version"
|
|
4
|
+
|
|
5
|
+
Gem::Specification.new do |s|
|
|
6
|
+
s.name = "rhoconnect-adapters"
|
|
7
|
+
s.version = RhoconnectAdapters::VERSION
|
|
8
|
+
s.platform = Gem::Platform::RUBY
|
|
9
|
+
s.authors = ["Rhomobile"]
|
|
10
|
+
s.date = Time.now.strftime('%Y-%m-%d')
|
|
11
|
+
s.email = %q{dev@rhomobile.com}
|
|
12
|
+
s.homepage = %q{http://rhomobile.com/products/rhoconnect-adapters}
|
|
13
|
+
s.summary = %q{Rhoconnect adapters}
|
|
14
|
+
s.description = %q{Rhoconnect out-of-the box adapters}
|
|
15
|
+
|
|
16
|
+
s.rubyforge_project = nil
|
|
17
|
+
|
|
18
|
+
s.files = `git ls-files`.split("\n")
|
|
19
|
+
s.test_files = `git ls-files -- {spec,features}/*`.split("\n")
|
|
20
|
+
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
|
21
|
+
s.require_paths = ["lib"]
|
|
22
|
+
|
|
23
|
+
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
|
24
|
+
s.rubygems_version = %q{1.5.0}
|
|
25
|
+
s.extra_rdoc_files = [
|
|
26
|
+
"README.md"
|
|
27
|
+
]
|
|
28
|
+
|
|
29
|
+
s.add_dependency('bundler', '~> 1.0')
|
|
30
|
+
s.add_dependency('rhoconnect', '>= 3.0.0.beta1')
|
|
31
|
+
s.add_dependency('activesupport', '>= 3.0.9')
|
|
32
|
+
s.add_dependency('i18n', '>= 0.6.0')
|
|
33
|
+
s.add_dependency('rake', '~> 0.9.2')
|
|
34
|
+
s.add_dependency('nokogiri', '>= 1.4.6')
|
|
35
|
+
s.add_dependency('templater', '~> 1.0.0')
|
|
36
|
+
end
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
require File.join(File.dirname(__FILE__),'..','spec_helper')
|
|
2
|
+
|
|
3
|
+
describe "MsDynamics App RUNNER" do
|
|
4
|
+
appname = "mynewapp"
|
|
5
|
+
backend = 'MsDynamics'
|
|
6
|
+
|
|
7
|
+
after(:all) do
|
|
8
|
+
FileUtils.rm_rf("/tmp/#{appname}")
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
it "should run all the specs for standard #{backend} app " do
|
|
12
|
+
RhoconnectAdapters::CRM::TestHelpers.load_templater(backend)
|
|
13
|
+
@app_generator = RhoconnectAdapters::CRM::TestHelpers.generate_sample_app('/tmp',{},appname,backend)
|
|
14
|
+
cmdline = "cd /tmp/#{appname}; rake rhoconnect:spec"
|
|
15
|
+
res = system "#{cmdline}"
|
|
16
|
+
res.should == true
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
require File.join(File.dirname(__FILE__),'..','spec_helper')
|
|
2
|
+
|
|
3
|
+
describe "OracleOnDemand App RUNNER" do
|
|
4
|
+
appname = "mynewapp"
|
|
5
|
+
backend = 'OracleOnDemand'
|
|
6
|
+
|
|
7
|
+
after(:all) do
|
|
8
|
+
FileUtils.rm_rf("/tmp/#{appname}")
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
it "should run all the specs for standard #{backend} app " do
|
|
12
|
+
RhoconnectAdapters::CRM::TestHelpers.load_templater(backend)
|
|
13
|
+
@app_generator = RhoconnectAdapters::CRM::TestHelpers.generate_sample_app('/tmp',{},appname,backend)
|
|
14
|
+
cmdline = "cd /tmp/#{appname}; rake rhoconnect:spec"
|
|
15
|
+
res = system "#{cmdline}"
|
|
16
|
+
res.should == true
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
require File.join(File.dirname(__FILE__),'..','spec_helper')
|
|
2
|
+
|
|
3
|
+
describe "Salesforce App RUNNER" do
|
|
4
|
+
appname = "mynewapp"
|
|
5
|
+
backend = 'Salesforce'
|
|
6
|
+
|
|
7
|
+
after(:all) do
|
|
8
|
+
FileUtils.rm_rf("/tmp/#{appname}")
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
it "should run all the specs for standard #{backend} app " do
|
|
12
|
+
RhoconnectAdapters::CRM::TestHelpers.load_templater(backend)
|
|
13
|
+
@app_generator = RhoconnectAdapters::CRM::TestHelpers.generate_sample_app('/tmp',{},appname,backend)
|
|
14
|
+
cmdline = "cd /tmp/#{appname}; rake rhoconnect:spec"
|
|
15
|
+
res = system "#{cmdline}"
|
|
16
|
+
res.should == true
|
|
17
|
+
end
|
|
18
|
+
end
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
require File.join(File.dirname(__FILE__),'..','spec_helper')
|
|
2
|
+
|
|
3
|
+
describe "Sugar App RUNNER" do
|
|
4
|
+
appname = "mynewapp"
|
|
5
|
+
backend = 'Sugar'
|
|
6
|
+
|
|
7
|
+
after(:all) do
|
|
8
|
+
FileUtils.rm_rf("/tmp/#{appname}")
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
it "should run all the specs for standard #{backend} app " do
|
|
12
|
+
RhoconnectAdapters::CRM::TestHelpers.load_templater(backend)
|
|
13
|
+
@app_generator = RhoconnectAdapters::CRM::TestHelpers.generate_sample_app('/tmp',{},appname,backend)
|
|
14
|
+
cmdline = "cd /tmp/#{appname}; rake rhoconnect:spec"
|
|
15
|
+
res = system "#{cmdline}"
|
|
16
|
+
res.should == true
|
|
17
|
+
end
|
|
18
|
+
end
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
require File.join(File.dirname(__FILE__),'..','spec_helper')
|
|
2
|
+
|
|
3
|
+
describe "Generator" do
|
|
4
|
+
appname = 'mynewapp'
|
|
5
|
+
source = 'CustomObj'
|
|
6
|
+
|
|
7
|
+
before(:each) do
|
|
8
|
+
FileUtils.mkdir_p '/tmp'
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
after(:all) do
|
|
12
|
+
FileUtils.rm_rf("/tmp/#{appname}")
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
describe "AppGenerator Command-line" do
|
|
16
|
+
it "should complain if no name is specified" do
|
|
17
|
+
lambda {
|
|
18
|
+
RhoconnectAdapters::CRMAppGenerator.new('/tmp',{})
|
|
19
|
+
}.should raise_error(Templater::TooFewArgumentsError)
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
it "should complain if no CRM backend is specified" do
|
|
23
|
+
lambda {
|
|
24
|
+
RhoconnectAdapters::CRMAppGenerator.new('/tmp',{},appname)
|
|
25
|
+
}.should raise_error(Templater::TooFewArgumentsError)
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
it "should complain if CRM backend is not valid" do
|
|
29
|
+
lambda {
|
|
30
|
+
RhoconnectAdapters::CRMAppGenerator.new('/tmp',{},appname,"foo")
|
|
31
|
+
}.should raise_error(RhoconnectAdapters::NotSupportedBackendError)
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
RhoconnectAdapters::CRM.registered_backends.each do |backend|
|
|
36
|
+
describe "Bare #{backend} App Generator" do
|
|
37
|
+
before(:all) do
|
|
38
|
+
RhoconnectAdapters::CRM::TestHelpers.load_templater(backend)
|
|
39
|
+
@generator = RhoconnectAdapters::CRM::TestHelpers.generate_sample_app('/tmp',{:bare => true},appname,backend)
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
it "should not generate any sources with --bare option for #{backend}" do
|
|
43
|
+
SecureRandom.should_receive(:hex).with(64).any_number_of_times
|
|
44
|
+
RhoconnectAdapters::CRM.standard_sources.each do |source|
|
|
45
|
+
source_name = Rhoconnect.under_score(source)
|
|
46
|
+
@generator.should_not create("/tmp/#{appname}/sources/#{source}.rb")
|
|
47
|
+
end
|
|
48
|
+
end
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
describe "Default #{backend} App Generator" do
|
|
52
|
+
before(:all) do
|
|
53
|
+
RhoconnectAdapters::CRM::TestHelpers.load_templater(backend)
|
|
54
|
+
@generator = RhoconnectAdapters::CRM::TestHelpers.generate_sample_app('/tmp',{},appname,backend)
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
it "should create new #{backend} standard application files" do
|
|
58
|
+
SecureRandom.should_receive(:hex).with(64).any_number_of_times
|
|
59
|
+
[
|
|
60
|
+
'application.rb',
|
|
61
|
+
"vendor/#{Rhoconnect.under_score(backend)}/application.rb",
|
|
62
|
+
"vendor/#{Rhoconnect.under_score(backend)}/adapter.rb",
|
|
63
|
+
'spec/spec_helper.rb'
|
|
64
|
+
].each do |template|
|
|
65
|
+
@generator.should create("/tmp/#{appname}/#{template}")
|
|
66
|
+
end
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
it "should generate standard #{RhoconnectAdapters::CRM.standard_sources.inspect} sources by default for #{backend}" do
|
|
70
|
+
SecureRandom.should_receive(:hex).with(64).any_number_of_times
|
|
71
|
+
RhoconnectAdapters::CRM.standard_sources.each do |source|
|
|
72
|
+
source_name = Rhoconnect.under_score(source)
|
|
73
|
+
File.should be_exist("/tmp/#{appname}/sources/#{source_name}.rb")
|
|
74
|
+
end
|
|
75
|
+
end
|
|
76
|
+
end
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
describe "SourceGenerator Command-Line" do
|
|
80
|
+
it "should complain if no name is specified" do
|
|
81
|
+
lambda {
|
|
82
|
+
RhoconnectAdapters::CRMSourceGenerator.new('/tmp',{})
|
|
83
|
+
}.should raise_error(Templater::TooFewArgumentsError)
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
it "should complain if no CRM backend is specified" do
|
|
87
|
+
lambda {
|
|
88
|
+
RhoconnectAdapters::CRMSourceGenerator.new('/tmp',{},source)
|
|
89
|
+
}.should raise_error(Templater::TooFewArgumentsError)
|
|
90
|
+
end
|
|
91
|
+
|
|
92
|
+
it "should complain if CRM backend is not valid" do
|
|
93
|
+
lambda {
|
|
94
|
+
RhoconnectAdapters::CRMSourceGenerator.new('/tmp',{},source,"foo")
|
|
95
|
+
}.should raise_error(RhoconnectAdapters::NotSupportedBackendError)
|
|
96
|
+
end
|
|
97
|
+
end
|
|
98
|
+
|
|
99
|
+
RhoconnectAdapters::CRM.registered_backends.each do |backend|
|
|
100
|
+
describe "#{backend} Source Generator" do
|
|
101
|
+
before(:each) do
|
|
102
|
+
RhoconnectAdapters::CRM::TestHelpers.load_templater(backend)
|
|
103
|
+
@app_generator = RhoconnectAdapters::CRM::TestHelpers.generate_sample_app('/tmp',{:bare => true},appname,backend)
|
|
104
|
+
@generator = RhoconnectAdapters::CRMSourceGenerator.new("/tmp/#{appname}",{},source,backend)
|
|
105
|
+
end
|
|
106
|
+
|
|
107
|
+
it "should create new source adapter and spec" do
|
|
108
|
+
@generator.should create("/tmp/#{appname}/sources/#{Rhoconnect.under_score(source)}.rb")
|
|
109
|
+
@generator.should create("/tmp/#{appname}/spec/sources/#{Rhoconnect.under_score(source)}_spec.rb")
|
|
110
|
+
end
|
|
111
|
+
end
|
|
112
|
+
end
|
|
113
|
+
end
|
data/spec/spec_helper.rb
ADDED
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
#$:.unshift File.expand_path(File.join(File.dirname(__FILE__), '..', 'lib'))
|
|
2
|
+
require 'rubygems'
|
|
3
|
+
require 'rspec'
|
|
4
|
+
require 'templater/spec/helpers'
|
|
5
|
+
|
|
6
|
+
include Templater::Spec::Helpers
|
|
7
|
+
require 'rhoconnect-adapters'
|
|
8
|
+
require File.join(File.dirname(__FILE__),'..','generators','rhoconnect-adapters')
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
ENV['RACK_ENV'] = 'test'
|
|
12
|
+
|
|
13
|
+
# this method removes all vendor-specific actions
|
|
14
|
+
# from the generator, thus, cleaning up the templater
|
|
15
|
+
# in order to prepare it to run next batch
|
|
16
|
+
# of vendor-specific specs
|
|
17
|
+
def cleanup_templater(templater)
|
|
18
|
+
standard_actions = {}
|
|
19
|
+
templater.actions.each do |type,actions|
|
|
20
|
+
standard_actions_array = []
|
|
21
|
+
actions.each do |action|
|
|
22
|
+
standard_actions_array << action unless action.name.to_s.index('vendor_custom') != nil
|
|
23
|
+
end
|
|
24
|
+
standard_actions[type] = standard_actions_array
|
|
25
|
+
end
|
|
26
|
+
templater.actions.clear
|
|
27
|
+
standard_actions.each do |type,actions|
|
|
28
|
+
templater.actions[type] = actions
|
|
29
|
+
end
|
|
30
|
+
templater
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
# in order to run the generator
|
|
34
|
+
# it is necessary to remove any previously loaded
|
|
35
|
+
# vendor-specific actions and load the new ones
|
|
36
|
+
module RhoconnectAdapters
|
|
37
|
+
module CRM
|
|
38
|
+
class TestHelpers
|
|
39
|
+
class << self
|
|
40
|
+
def load_templater(backend)
|
|
41
|
+
cleanup_templater(RhoconnectAdapters::CRMAppGenerator)
|
|
42
|
+
cleanup_templater(RhoconnectAdapters::CRMSourceGenerator)
|
|
43
|
+
Dir[File.join(File.dirname(__FILE__),'..','generators','crm','vendor',"#{Rhoconnect.under_score(backend)}",'templates.rb')].each { |vendor_templates| load vendor_templates }
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
def generate_sample_app(destination_root,options,appname,backend)
|
|
47
|
+
FileUtils.rm_rf "#{destination_root}/#{appname}"
|
|
48
|
+
|
|
49
|
+
generator = RhoconnectAdapters::CRMAppGenerator.new(destination_root,options,appname,backend)
|
|
50
|
+
generator.invoke!
|
|
51
|
+
generator.after_run
|
|
52
|
+
generator
|
|
53
|
+
end
|
|
54
|
+
end
|
|
55
|
+
end
|
|
56
|
+
end
|
|
57
|
+
end
|