rhoconnect-adapters 1.0.0.beta1
Sign up to get free protection for your applications and to get access to all the features.
- 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
|