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.
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