rhoconnect-adapters 1.0.0.beta1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (106) hide show
  1. data/.gitignore +4 -0
  2. data/CHANGELOG +4 -0
  3. data/Gemfile +18 -0
  4. data/README.md +239 -0
  5. data/Rakefile +31 -0
  6. data/bin/rhoconnect-adapters +35 -0
  7. data/generators/crm/templates/application/application.rb +34 -0
  8. data/generators/crm/templates/source/source_adapter.rb +10 -0
  9. data/generators/crm/templates/source/source_spec.rb +25 -0
  10. data/generators/crm/templates/spec/spec_helper.rb +64 -0
  11. data/generators/crm/vendor/ms_dynamics/adapter.rb +301 -0
  12. data/generators/crm/vendor/ms_dynamics/application.rb +56 -0
  13. data/generators/crm/vendor/ms_dynamics/lib/crm_metadata_service.rb +43 -0
  14. data/generators/crm/vendor/ms_dynamics/lib/crm_service.rb +141 -0
  15. data/generators/crm/vendor/ms_dynamics/lib/discovery_service.rb +51 -0
  16. data/generators/crm/vendor/ms_dynamics/lib/wlid_service.rb +159 -0
  17. data/generators/crm/vendor/ms_dynamics/ms_dynamics.rb +45 -0
  18. data/generators/crm/vendor/ms_dynamics/settings/Account.yml +46 -0
  19. data/generators/crm/vendor/ms_dynamics/settings/Contact.yml +40 -0
  20. data/generators/crm/vendor/ms_dynamics/settings/GenericObject.yml +18 -0
  21. data/generators/crm/vendor/ms_dynamics/settings/Lead.yml +53 -0
  22. data/generators/crm/vendor/ms_dynamics/settings/Opportunity.yml +41 -0
  23. data/generators/crm/vendor/ms_dynamics/settings/settings.yml +9 -0
  24. data/generators/crm/vendor/ms_dynamics/spec/application_spec.rb +23 -0
  25. data/generators/crm/vendor/ms_dynamics/spec/sources/account_spec.rb +49 -0
  26. data/generators/crm/vendor/ms_dynamics/spec/sources/contact_spec.rb +49 -0
  27. data/generators/crm/vendor/ms_dynamics/spec/sources/lead_spec.rb +49 -0
  28. data/generators/crm/vendor/ms_dynamics/spec/sources/opportunity_spec.rb +62 -0
  29. data/generators/crm/vendor/ms_dynamics/spec/spec_helper.rb +78 -0
  30. data/generators/crm/vendor/ms_dynamics/spec_data/Account.yml +6 -0
  31. data/generators/crm/vendor/ms_dynamics/spec_data/Contact.yml +7 -0
  32. data/generators/crm/vendor/ms_dynamics/spec_data/GenericObject.yml +3 -0
  33. data/generators/crm/vendor/ms_dynamics/spec_data/Lead.yml +12 -0
  34. data/generators/crm/vendor/ms_dynamics/spec_data/Opportunity.yml +6 -0
  35. data/generators/crm/vendor/ms_dynamics/templates.rb +57 -0
  36. data/generators/crm/vendor/oracle_on_demand/adapter.rb +421 -0
  37. data/generators/crm/vendor/oracle_on_demand/application.rb +64 -0
  38. data/generators/crm/vendor/oracle_on_demand/settings/Account.yml +91 -0
  39. data/generators/crm/vendor/oracle_on_demand/settings/Contact.yml +54 -0
  40. data/generators/crm/vendor/oracle_on_demand/settings/GenericObject.yml +21 -0
  41. data/generators/crm/vendor/oracle_on_demand/settings/Lead.yml +72 -0
  42. data/generators/crm/vendor/oracle_on_demand/settings/Opportunity.yml +69 -0
  43. data/generators/crm/vendor/oracle_on_demand/settings/settings.yml +8 -0
  44. data/generators/crm/vendor/oracle_on_demand/spec/application_spec.rb +14 -0
  45. data/generators/crm/vendor/oracle_on_demand/spec/sources/account_spec.rb +50 -0
  46. data/generators/crm/vendor/oracle_on_demand/spec/sources/contact_spec.rb +50 -0
  47. data/generators/crm/vendor/oracle_on_demand/spec/sources/lead_spec.rb +51 -0
  48. data/generators/crm/vendor/oracle_on_demand/spec/sources/opportunity_spec.rb +51 -0
  49. data/generators/crm/vendor/oracle_on_demand/spec_data/Account.yml +8 -0
  50. data/generators/crm/vendor/oracle_on_demand/spec_data/Contact.yml +8 -0
  51. data/generators/crm/vendor/oracle_on_demand/spec_data/GenericObject.yml +4 -0
  52. data/generators/crm/vendor/oracle_on_demand/spec_data/Lead.yml +14 -0
  53. data/generators/crm/vendor/oracle_on_demand/spec_data/Opportunity.yml +6 -0
  54. data/generators/crm/vendor/oracle_on_demand/templates.rb +52 -0
  55. data/generators/crm/vendor/salesforce/adapter.rb +315 -0
  56. data/generators/crm/vendor/salesforce/application.rb +80 -0
  57. data/generators/crm/vendor/salesforce/settings/Account.yml +53 -0
  58. data/generators/crm/vendor/salesforce/settings/Contact.yml +61 -0
  59. data/generators/crm/vendor/salesforce/settings/GenericObject.yml +13 -0
  60. data/generators/crm/vendor/salesforce/settings/Lead.yml +73 -0
  61. data/generators/crm/vendor/salesforce/settings/Opportunity.yml +48 -0
  62. data/generators/crm/vendor/salesforce/settings/settings.yml +6 -0
  63. data/generators/crm/vendor/salesforce/spec/application_spec.rb +14 -0
  64. data/generators/crm/vendor/salesforce/spec/sources/account_spec.rb +50 -0
  65. data/generators/crm/vendor/salesforce/spec/sources/contact_spec.rb +50 -0
  66. data/generators/crm/vendor/salesforce/spec/sources/lead_spec.rb +51 -0
  67. data/generators/crm/vendor/salesforce/spec/sources/opportunity_spec.rb +51 -0
  68. data/generators/crm/vendor/salesforce/spec_data/Account.yml +14 -0
  69. data/generators/crm/vendor/salesforce/spec_data/Contact.yml +8 -0
  70. data/generators/crm/vendor/salesforce/spec_data/GenericObject.yml +3 -0
  71. data/generators/crm/vendor/salesforce/spec_data/Lead.yml +10 -0
  72. data/generators/crm/vendor/salesforce/spec_data/Opportunity.yml +10 -0
  73. data/generators/crm/vendor/salesforce/templates.rb +45 -0
  74. data/generators/crm/vendor/sugar/adapter.rb +291 -0
  75. data/generators/crm/vendor/sugar/application.rb +50 -0
  76. data/generators/crm/vendor/sugar/settings/Account.yml +49 -0
  77. data/generators/crm/vendor/sugar/settings/Contact.yml +62 -0
  78. data/generators/crm/vendor/sugar/settings/GenericObject.yml +12 -0
  79. data/generators/crm/vendor/sugar/settings/Lead.yml +76 -0
  80. data/generators/crm/vendor/sugar/settings/Opportunity.yml +49 -0
  81. data/generators/crm/vendor/sugar/settings/settings.yml +9 -0
  82. data/generators/crm/vendor/sugar/spec/application_spec.rb +25 -0
  83. data/generators/crm/vendor/sugar/spec/sources/account_spec.rb +53 -0
  84. data/generators/crm/vendor/sugar/spec/sources/contact_spec.rb +53 -0
  85. data/generators/crm/vendor/sugar/spec/sources/lead_spec.rb +54 -0
  86. data/generators/crm/vendor/sugar/spec/sources/opportunity_spec.rb +54 -0
  87. data/generators/crm/vendor/sugar/spec_data/Account.yml +13 -0
  88. data/generators/crm/vendor/sugar/spec_data/Contact.yml +8 -0
  89. data/generators/crm/vendor/sugar/spec_data/GenericObject.yml +3 -0
  90. data/generators/crm/vendor/sugar/spec_data/Lead.yml +16 -0
  91. data/generators/crm/vendor/sugar/spec_data/Opportunity.yml +10 -0
  92. data/generators/crm/vendor/sugar/sugar.rb +33 -0
  93. data/generators/crm/vendor/sugar/templates.rb +58 -0
  94. data/generators/rhoconnect-adapters.rb +217 -0
  95. data/lib/rhoconnect-adapters/crm/crm.rb +31 -0
  96. data/lib/rhoconnect-adapters/soap_service.rb +70 -0
  97. data/lib/rhoconnect-adapters/version.rb +3 -0
  98. data/lib/rhoconnect-adapters.rb +2 -0
  99. data/rhoconnect-adapters.gemspec +36 -0
  100. data/spec/apps/ms_dynamics_spec.rb +19 -0
  101. data/spec/apps/oracle_on_demand_spec.rb +20 -0
  102. data/spec/apps/salesforce_spec.rb +18 -0
  103. data/spec/apps/sugar_spec.rb +18 -0
  104. data/spec/generator/generator_spec.rb +113 -0
  105. data/spec/spec_helper.rb +57 -0
  106. 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,3 @@
1
+ module RhoconnectAdapters
2
+ VERSION = "1.0.0.beta1"
3
+ end
@@ -0,0 +1,2 @@
1
+ require 'rhoconnect-adapters/version'
2
+ require 'rhoconnect-adapters/crm/crm.rb'
@@ -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
@@ -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