rubysync 0.0.5 → 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (117) hide show
  1. data/HISTORY.txt +7 -0
  2. data/Manifest.txt +18 -76
  3. data/Rakefile +2 -2
  4. data/bin/rubysync +60 -21
  5. data/bin/rubysync.rb +60 -21
  6. data/examples/ar_webapp/public/dispatch.cgi +1 -1
  7. data/examples/ar_webapp/public/dispatch.fcgi +1 -1
  8. data/examples/ar_webapp/public/dispatch.rb +1 -1
  9. data/examples/csv_to_ldap/config/connectors/hr_connector.rb +14 -0
  10. data/examples/csv_to_ldap/config/connectors/ldap_vault_connector.rb +11 -0
  11. data/examples/{ar_webapp/.DS_Store → csv_to_ldap/config/db/HrImportPipeline(vault)_assoc_to_path.db} +0 -0
  12. data/{.DS_Store → examples/csv_to_ldap/config/db/HrImportPipeline(vault)_mirror.db} +0 -0
  13. data/examples/csv_to_ldap/config/db/HrImportPipeline(vault)_path_to_assoc.db +0 -0
  14. data/examples/csv_to_ldap/config/pipelines/hr_import_pipeline.rb +24 -0
  15. data/examples/csv_to_ldap/in/henchmen.csv.bak +3 -0
  16. data/examples/csv_to_xml/config/connectors/databank_connector.rb +8 -0
  17. data/examples/csv_to_xml/config/connectors/hr_connector.rb +14 -0
  18. data/examples/csv_to_xml/config/db/HrImportPipeline(vault)_assoc_to_path.db +0 -0
  19. data/examples/csv_to_xml/config/db/HrImportPipeline(vault)_mirror.db +0 -0
  20. data/examples/csv_to_xml/config/db/HrImportPipeline(vault)_path_to_assoc.db +0 -0
  21. data/examples/csv_to_xml/config/pipelines/hr_import_pipeline.rb +24 -0
  22. data/examples/csv_to_xml/databank.xml +1 -0
  23. data/examples/csv_to_xml/in/henchmen.csv.bak +3 -0
  24. data/examples/csv_to_xml/transcript.txt +1 -2
  25. data/examples/data/henchmen.csv +3 -0
  26. data/examples/data/more.csv +2 -0
  27. data/lib/ruby_sync/connectors/active_record_connector.rb +19 -4
  28. data/lib/ruby_sync/connectors/base_connector.rb +3 -9
  29. data/lib/ruby_sync/connectors/file_connector.rb +2 -2
  30. data/lib/ruby_sync/event.rb +16 -9
  31. data/lib/ruby_sync/pipelines/base_pipeline.rb +137 -164
  32. data/lib/ruby_sync/util/utilities.rb +14 -21
  33. data/lib/ruby_sync.rb +37 -39
  34. data/test/ruby_sync_test.rb +3 -2
  35. data/test/tc_active_record_connector.rb +15 -6
  36. data/test/tc_csv_file_connector.rb +10 -6
  37. data/test/tc_ldap_connector.rb +1 -1
  38. data/test/tc_memory_connectors.rb +5 -3
  39. data/test/tc_transformation.rb +15 -7
  40. data/test/tc_utilities.rb +1 -1
  41. data/test/tc_xml_connectors.rb +4 -0
  42. data/test/ts_rubysync.rb +3 -1
  43. metadata +21 -81
  44. data/.project +0 -17
  45. data/docs/in_pipeline.graffle +0 -2690
  46. data/docs/out_pipeline.graffle +0 -3274
  47. data/docs/to_sync.txt +0 -15
  48. data/docs/walkthru.txt +0 -186
  49. data/examples/ar_client_webapp/README +0 -182
  50. data/examples/ar_client_webapp/Rakefile +0 -10
  51. data/examples/ar_client_webapp/app/controllers/application.rb +0 -7
  52. data/examples/ar_client_webapp/app/controllers/user_controller.rb +0 -5
  53. data/examples/ar_client_webapp/app/helpers/application_helper.rb +0 -3
  54. data/examples/ar_client_webapp/app/helpers/user_helper.rb +0 -2
  55. data/examples/ar_client_webapp/app/models/user.rb +0 -2
  56. data/examples/ar_client_webapp/config/boot.rb +0 -45
  57. data/examples/ar_client_webapp/config/database.yml +0 -36
  58. data/examples/ar_client_webapp/config/environment.rb +0 -60
  59. data/examples/ar_client_webapp/config/environments/development.rb +0 -21
  60. data/examples/ar_client_webapp/config/environments/production.rb +0 -18
  61. data/examples/ar_client_webapp/config/environments/test.rb +0 -19
  62. data/examples/ar_client_webapp/config/routes.rb +0 -23
  63. data/examples/ar_client_webapp/db/migrate/001_create_users.rb +0 -13
  64. data/examples/ar_client_webapp/db/schema.rb +0 -13
  65. data/examples/ar_client_webapp/doc/README_FOR_APP +0 -2
  66. data/examples/ar_client_webapp/log/development.log +0 -753
  67. data/examples/ar_client_webapp/log/production.log +0 -0
  68. data/examples/ar_client_webapp/log/server.log +0 -0
  69. data/examples/ar_client_webapp/log/test.log +0 -0
  70. data/examples/ar_client_webapp/public/.htaccess +0 -40
  71. data/examples/ar_client_webapp/public/404.html +0 -30
  72. data/examples/ar_client_webapp/public/500.html +0 -30
  73. data/examples/ar_client_webapp/public/dispatch.cgi +0 -10
  74. data/examples/ar_client_webapp/public/dispatch.fcgi +0 -24
  75. data/examples/ar_client_webapp/public/dispatch.rb +0 -10
  76. data/examples/ar_client_webapp/public/favicon.ico +0 -0
  77. data/examples/ar_client_webapp/public/images/rails.png +0 -0
  78. data/examples/ar_client_webapp/public/index.html +0 -277
  79. data/examples/ar_client_webapp/public/javascripts/application.js +0 -2
  80. data/examples/ar_client_webapp/public/javascripts/controls.js +0 -833
  81. data/examples/ar_client_webapp/public/javascripts/dragdrop.js +0 -942
  82. data/examples/ar_client_webapp/public/javascripts/effects.js +0 -1088
  83. data/examples/ar_client_webapp/public/javascripts/prototype.js +0 -2515
  84. data/examples/ar_client_webapp/public/robots.txt +0 -1
  85. data/examples/ar_client_webapp/script/about +0 -3
  86. data/examples/ar_client_webapp/script/breakpointer +0 -3
  87. data/examples/ar_client_webapp/script/console +0 -3
  88. data/examples/ar_client_webapp/script/destroy +0 -3
  89. data/examples/ar_client_webapp/script/generate +0 -3
  90. data/examples/ar_client_webapp/script/performance/benchmarker +0 -3
  91. data/examples/ar_client_webapp/script/performance/profiler +0 -3
  92. data/examples/ar_client_webapp/script/plugin +0 -3
  93. data/examples/ar_client_webapp/script/process/inspector +0 -3
  94. data/examples/ar_client_webapp/script/process/reaper +0 -3
  95. data/examples/ar_client_webapp/script/process/spawner +0 -3
  96. data/examples/ar_client_webapp/script/runner +0 -3
  97. data/examples/ar_client_webapp/script/server +0 -3
  98. data/examples/ar_client_webapp/test/fixtures/users.yml +0 -5
  99. data/examples/ar_client_webapp/test/functional/user_controller_test.rb +0 -18
  100. data/examples/ar_client_webapp/test/test_helper.rb +0 -28
  101. data/examples/ar_client_webapp/test/unit/user_test.rb +0 -10
  102. data/examples/ar_client_webapp/tmp/sessions/ruby_sess.e2e3c63a67baef6d +0 -0
  103. data/examples/ar_webapp/app/.DS_Store +0 -0
  104. data/examples/ar_webapp/app/views/.DS_Store +0 -0
  105. data/examples/ar_webapp/app/views/people/.DS_Store +0 -0
  106. data/examples/ims2/connectors/hr_db_connector.rb +0 -6
  107. data/examples/ims2/connectors/my_csv_connector.rb +0 -12
  108. data/examples/ims2/pipelines/hr_import_pipeline.rb +0 -33
  109. data/examples/my_ims/connectors/my_csv_connector.rb +0 -10
  110. data/examples/my_ims/connectors/my_db_connector.rb +0 -7
  111. data/examples/my_ims/pipelines/my_pipeline.rb +0 -33
  112. data/lib/rubysync.rb +0 -19
  113. data/nbproject/private/private.properties +0 -3
  114. data/nbproject/project.properties +0 -8
  115. data/nbproject/project.xml +0 -16
  116. data/rubysync.tmproj +0 -568
  117. data/test/tc_rubysync.rb +0 -28
data/HISTORY.txt CHANGED
@@ -1,3 +1,10 @@
1
+ == 0.1.0 / 2007-09-26
2
+
3
+ * Dropped the map_client_to_vault and map_vault_to_client methods. in_transform and out_transform now handle that
4
+ this enables calculated and literal values as well as simple mappings
5
+ * Now uses the class loader from activesupport - much more stable
6
+ * Refreshed the examples
7
+
1
8
  == 0.0.5 / 2007-09-18
2
9
 
3
10
  * Fixed gem dependency issues
data/Manifest.txt CHANGED
@@ -1,5 +1,3 @@
1
- .DS_Store
2
- .project
3
1
  COPYING
4
2
  HISTORY.txt
5
3
  Manifest.txt
@@ -7,71 +5,11 @@ README.txt
7
5
  Rakefile
8
6
  bin/rubysync
9
7
  bin/rubysync.rb
10
- docs/in_pipeline.graffle
11
8
  docs/init_openldap.ldif
12
- docs/out_pipeline.graffle
13
9
  docs/schema/99rubysync.ldif
14
10
  docs/schema/rubysync.schema
15
- docs/to_sync.txt
16
- docs/walkthru.txt
17
- examples/ar_client_webapp/README
18
- examples/ar_client_webapp/Rakefile
19
- examples/ar_client_webapp/app/controllers/application.rb
20
- examples/ar_client_webapp/app/controllers/user_controller.rb
21
- examples/ar_client_webapp/app/helpers/application_helper.rb
22
- examples/ar_client_webapp/app/helpers/user_helper.rb
23
- examples/ar_client_webapp/app/models/user.rb
24
- examples/ar_client_webapp/config/boot.rb
25
- examples/ar_client_webapp/config/database.yml
26
- examples/ar_client_webapp/config/environment.rb
27
- examples/ar_client_webapp/config/environments/development.rb
28
- examples/ar_client_webapp/config/environments/production.rb
29
- examples/ar_client_webapp/config/environments/test.rb
30
- examples/ar_client_webapp/config/routes.rb
31
- examples/ar_client_webapp/db/migrate/001_create_users.rb
32
- examples/ar_client_webapp/db/schema.rb
33
- examples/ar_client_webapp/doc/README_FOR_APP
34
- examples/ar_client_webapp/log/development.log
35
- examples/ar_client_webapp/log/production.log
36
- examples/ar_client_webapp/log/server.log
37
- examples/ar_client_webapp/log/test.log
38
- examples/ar_client_webapp/public/.htaccess
39
- examples/ar_client_webapp/public/404.html
40
- examples/ar_client_webapp/public/500.html
41
- examples/ar_client_webapp/public/dispatch.cgi
42
- examples/ar_client_webapp/public/dispatch.fcgi
43
- examples/ar_client_webapp/public/dispatch.rb
44
- examples/ar_client_webapp/public/favicon.ico
45
- examples/ar_client_webapp/public/images/rails.png
46
- examples/ar_client_webapp/public/index.html
47
- examples/ar_client_webapp/public/javascripts/application.js
48
- examples/ar_client_webapp/public/javascripts/controls.js
49
- examples/ar_client_webapp/public/javascripts/dragdrop.js
50
- examples/ar_client_webapp/public/javascripts/effects.js
51
- examples/ar_client_webapp/public/javascripts/prototype.js
52
- examples/ar_client_webapp/public/robots.txt
53
- examples/ar_client_webapp/script/about
54
- examples/ar_client_webapp/script/breakpointer
55
- examples/ar_client_webapp/script/console
56
- examples/ar_client_webapp/script/destroy
57
- examples/ar_client_webapp/script/generate
58
- examples/ar_client_webapp/script/performance/benchmarker
59
- examples/ar_client_webapp/script/performance/profiler
60
- examples/ar_client_webapp/script/plugin
61
- examples/ar_client_webapp/script/process/inspector
62
- examples/ar_client_webapp/script/process/reaper
63
- examples/ar_client_webapp/script/process/spawner
64
- examples/ar_client_webapp/script/runner
65
- examples/ar_client_webapp/script/server
66
- examples/ar_client_webapp/test/fixtures/users.yml
67
- examples/ar_client_webapp/test/functional/user_controller_test.rb
68
- examples/ar_client_webapp/test/test_helper.rb
69
- examples/ar_client_webapp/test/unit/user_test.rb
70
- examples/ar_client_webapp/tmp/sessions/ruby_sess.e2e3c63a67baef6d
71
- examples/ar_webapp/.DS_Store
72
11
  examples/ar_webapp/README
73
12
  examples/ar_webapp/Rakefile
74
- examples/ar_webapp/app/.DS_Store
75
13
  examples/ar_webapp/app/controllers/application.rb
76
14
  examples/ar_webapp/app/controllers/hobbies_controller.rb
77
15
  examples/ar_webapp/app/controllers/interests_controller.rb
@@ -87,9 +25,7 @@ examples/ar_webapp/app/models/ruby_sync_observer.rb
87
25
  examples/ar_webapp/app/models/ruby_sync_operation.rb
88
26
  examples/ar_webapp/app/models/ruby_sync_state.rb
89
27
  examples/ar_webapp/app/models/ruby_sync_value.rb
90
- examples/ar_webapp/app/views/.DS_Store
91
28
  examples/ar_webapp/app/views/layouts/application.rhtml
92
- examples/ar_webapp/app/views/people/.DS_Store
93
29
  examples/ar_webapp/app/views/people/show.rhtml
94
30
  examples/ar_webapp/config/boot.rb
95
31
  examples/ar_webapp/config/database.yml
@@ -159,12 +95,24 @@ examples/ar_webapp/test/unit/ruby_sync_observer_test.rb
159
95
  examples/ar_webapp/test/unit/ruby_sync_operation_test.rb
160
96
  examples/ar_webapp/test/unit/ruby_sync_state_test.rb
161
97
  examples/ar_webapp/test/unit/ruby_sync_value_test.rb
162
- examples/ims2/connectors/hr_db_connector.rb
163
- examples/ims2/connectors/my_csv_connector.rb
164
- examples/ims2/pipelines/hr_import_pipeline.rb
165
- examples/my_ims/connectors/my_csv_connector.rb
166
- examples/my_ims/connectors/my_db_connector.rb
167
- examples/my_ims/pipelines/my_pipeline.rb
98
+ examples/csv_to_ldap/config/connectors/hr_connector.rb
99
+ examples/csv_to_ldap/config/connectors/ldap_vault_connector.rb
100
+ examples/csv_to_ldap/config/db/HrImportPipeline(vault)_assoc_to_path.db
101
+ examples/csv_to_ldap/config/db/HrImportPipeline(vault)_mirror.db
102
+ examples/csv_to_ldap/config/db/HrImportPipeline(vault)_path_to_assoc.db
103
+ examples/csv_to_ldap/config/pipelines/hr_import_pipeline.rb
104
+ examples/csv_to_ldap/in/henchmen.csv.bak
105
+ examples/csv_to_xml/config/connectors/databank_connector.rb
106
+ examples/csv_to_xml/config/connectors/hr_connector.rb
107
+ examples/csv_to_xml/config/db/HrImportPipeline(vault)_assoc_to_path.db
108
+ examples/csv_to_xml/config/db/HrImportPipeline(vault)_mirror.db
109
+ examples/csv_to_xml/config/db/HrImportPipeline(vault)_path_to_assoc.db
110
+ examples/csv_to_xml/config/pipelines/hr_import_pipeline.rb
111
+ examples/csv_to_xml/databank.xml
112
+ examples/csv_to_xml/in/henchmen.csv.bak
113
+ examples/csv_to_xml/transcript.txt
114
+ examples/data/henchmen.csv
115
+ examples/data/more.csv
168
116
  lib/net/ldif.rb
169
117
  lib/ruby_sync.rb
170
118
  lib/ruby_sync/connectors/active_record_association_handler.rb
@@ -184,11 +132,6 @@ lib/ruby_sync/operation.rb
184
132
  lib/ruby_sync/pipelines/base_pipeline.rb
185
133
  lib/ruby_sync/util/metaid.rb
186
134
  lib/ruby_sync/util/utilities.rb
187
- lib/rubysync.rb
188
- nbproject/private/private.properties
189
- nbproject/project.properties
190
- nbproject/project.xml
191
- rubysync.tmproj
192
135
  test/data/example1.ldif
193
136
  test/data/example2.ldif
194
137
  test/data/example3.ldif
@@ -209,7 +152,6 @@ test/tc_ldap_connector.rb
209
152
  test/tc_ldap_vault.rb
210
153
  test/tc_ldif.rb
211
154
  test/tc_memory_connectors.rb
212
- test/tc_rubysync.rb
213
155
  test/tc_transformation.rb
214
156
  test/tc_utilities.rb
215
157
  test/tc_xml_connectors.rb
data/Rakefile CHANGED
@@ -15,9 +15,9 @@
15
15
 
16
16
  require 'rubygems'
17
17
  require 'hoe'
18
- require './lib/rubysync.rb'
18
+ require './lib/ruby_sync.rb'
19
19
 
20
- Hoe.new('rubysync', Rubysync::VERSION) do |p|
20
+ Hoe.new('rubysync', RubySync::VERSION) do |p|
21
21
  p.rubyforge_name = 'rubysync'
22
22
  p.author = 'Ritchie Young'
23
23
  p.email = 'ritchiey@gmail.com'
data/bin/rubysync CHANGED
@@ -76,7 +76,7 @@
76
76
 
77
77
  lib_path = File.dirname(__FILE__) + '/../lib'
78
78
  $:.unshift lib_path unless $:.include?(lib_path) || $:.include?(File.expand_path(lib_path))
79
- require "ruby_sync"
79
+ require 'ruby_sync'
80
80
  require "simpleconsole"
81
81
  require 'rdoc/usage'
82
82
 
@@ -187,7 +187,7 @@ class Controller < SimpleConsole::Controller
187
187
  private
188
188
 
189
189
  def configure_logging
190
- log_levels = [Logger::WARN, Logger::INFO, Logger::DEBUG]
190
+ log_levels = [::Logger::WARN, ::Logger::INFO, ::Logger::DEBUG]
191
191
  verbosity = [(params[:verbose]||0), log_levels.size-1].min
192
192
  log.level = log_levels[verbosity]
193
193
  end
@@ -264,9 +264,6 @@ def fields
264
264
  puts @field_names.join("\n")
265
265
  end
266
266
 
267
-
268
-
269
-
270
267
  end
271
268
 
272
269
 
@@ -285,8 +282,7 @@ end
285
282
 
286
283
  def pipeline_template name, vault_name, client_name
287
284
  vault = (vault_name)? ::RubySync::Connectors::BaseConnector.class_for(vault_name) : nil
288
- vault_fields = vault && vault.fields || %w{allow these fields through}
289
- possible_fields = (vault_fields.map {|n| ":#{n}"}).join(", ")
285
+ vault_fields = vault && vault.fields || []
290
286
 
291
287
  client = (client_name)? ::RubySync::Connectors::BaseConnector.class_for(client_name) : nil
292
288
  client_fields = client && client.fields || []
@@ -301,33 +297,76 @@ class #{name.to_s.camelize}Pipeline < RubySync::Pipelines::BasePipeline
301
297
  #{vault_specifier}
302
298
 
303
299
  # Remove any fields that you don't want to set in the client from the vault
304
- allow_out #{possible_fields}
300
+ allow_out #{allow_through(vault_fields)}
305
301
 
306
302
  # Remove any fields that you don't want to set in the vault from the client
307
- allow_in #{possible_fields}
303
+ allow_in #{allow_through(client_fields)}
308
304
 
309
305
  # If the client and vault have different names for the same field, define the
310
306
  # the mapping here. For example, if the vault has a field called "first name" and
311
307
  # the client has a field called givenName you may put:
312
- # 'first name' => 'givenName'
313
- # separate each mapping with a comma.
314
- # The following fields were detected on the client:
315
- # #{(client_fields.map {|f| "'#{f}'"}).join(",")}
316
- map_vault_to_client({
317
- #{(vault_fields.map {|f| "#'#{f}' => 'a_client_field'"}).join(",\n\t\t")}
318
- })
319
-
308
+ # map 'first name', 'givenName'
309
+ #
310
+ # You can also calculate the values for fields. For more info, see
311
+ # http://rubysync.org/docs/rubysync-transformations/
312
+
320
313
  # "in" means going from client to vault
321
- #in_transform do
322
- #end
314
+ in_transform do
315
+ #{transform_fields(vault_fields, 'vault', 'client')}
316
+ end
323
317
 
324
318
  # "out" means going from vault to client
325
- #out_transform do
326
- #end
319
+ out_transform do
320
+ #{transform_fields(client_fields, 'client', 'vault')}
321
+ end
322
+
323
+ # if the vault doesn't already hold an association for this record
324
+ # from the client, perform a search here to see if a match can be found
325
+ # in_match do
326
+ # end
327
+
328
+ # if the vault doesn't have an association linking this record to one on
329
+ # the client, perform a search here to see if an existing client record
330
+ # matches this record
331
+ # out_match do
332
+ # end
333
+
334
+ # If this evaluates to false, it will veto the creation of a record on
335
+ # the vault. Good for checking you've got the required fields etc
336
+ # in_create_if do
337
+ # end
338
+
339
+ # if this evaluates to false for an outgoing event then it will
340
+ # veto the creation of a new record on the client
341
+ # out_create_if do
342
+ # end
343
+
344
+ # Should evaluate to the path for placing a new record on the vault
345
+ # in_place do
346
+ # end
347
+
348
+ # Should evaluate to the path for placing a new record on the client
349
+ # out_place do
350
+ # end
351
+
352
+
353
+ # These statements control logging. In log level 2 or higher (specify -v 2),
354
+ # the event will be dumped to the log at any of the places specified below.
355
+ # Uncomment and edit to taste.
356
+ # dump_before :in_filter, :in_transform, :in_place, :out_filter, :out_place, :out_transform
357
+ # dump_after :in_filter, :in_transform, :in_place, :out_filter, :out_place, :out_transform
358
+
327
359
 
328
360
  end
329
361
  end;
330
362
  end
331
363
 
364
+ def allow_through fields
365
+ (fields.empty? ? %w{allow these fields through} : fields).to_ruby
366
+ end
367
+
368
+ def transform_fields fields, mine, other
369
+ (fields.empty? ? ['sample',mine,'fields'] : fields).map {|f| "#map '#{f}', '#{other}_field'"}.join("\n ")
370
+ end
332
371
 
333
372
  SimpleConsole::Application.run(ARGV, Controller, View)
data/bin/rubysync.rb CHANGED
@@ -76,7 +76,7 @@
76
76
 
77
77
  lib_path = File.dirname(__FILE__) + '/../lib'
78
78
  $:.unshift lib_path unless $:.include?(lib_path) || $:.include?(File.expand_path(lib_path))
79
- require "ruby_sync"
79
+ require 'ruby_sync'
80
80
  require "simpleconsole"
81
81
  require 'rdoc/usage'
82
82
 
@@ -187,7 +187,7 @@ class Controller < SimpleConsole::Controller
187
187
  private
188
188
 
189
189
  def configure_logging
190
- log_levels = [Logger::WARN, Logger::INFO, Logger::DEBUG]
190
+ log_levels = [::Logger::WARN, ::Logger::INFO, ::Logger::DEBUG]
191
191
  verbosity = [(params[:verbose]||0), log_levels.size-1].min
192
192
  log.level = log_levels[verbosity]
193
193
  end
@@ -264,9 +264,6 @@ def fields
264
264
  puts @field_names.join("\n")
265
265
  end
266
266
 
267
-
268
-
269
-
270
267
  end
271
268
 
272
269
 
@@ -285,8 +282,7 @@ end
285
282
 
286
283
  def pipeline_template name, vault_name, client_name
287
284
  vault = (vault_name)? ::RubySync::Connectors::BaseConnector.class_for(vault_name) : nil
288
- vault_fields = vault && vault.fields || %w{allow these fields through}
289
- possible_fields = (vault_fields.map {|n| ":#{n}"}).join(", ")
285
+ vault_fields = vault && vault.fields || []
290
286
 
291
287
  client = (client_name)? ::RubySync::Connectors::BaseConnector.class_for(client_name) : nil
292
288
  client_fields = client && client.fields || []
@@ -301,33 +297,76 @@ class #{name.to_s.camelize}Pipeline < RubySync::Pipelines::BasePipeline
301
297
  #{vault_specifier}
302
298
 
303
299
  # Remove any fields that you don't want to set in the client from the vault
304
- allow_out #{possible_fields}
300
+ allow_out #{allow_through(vault_fields)}
305
301
 
306
302
  # Remove any fields that you don't want to set in the vault from the client
307
- allow_in #{possible_fields}
303
+ allow_in #{allow_through(client_fields)}
308
304
 
309
305
  # If the client and vault have different names for the same field, define the
310
306
  # the mapping here. For example, if the vault has a field called "first name" and
311
307
  # the client has a field called givenName you may put:
312
- # 'first name' => 'givenName'
313
- # separate each mapping with a comma.
314
- # The following fields were detected on the client:
315
- # #{(client_fields.map {|f| "'#{f}'"}).join(",")}
316
- map_vault_to_client({
317
- #{(vault_fields.map {|f| "#'#{f}' => 'a_client_field'"}).join(",\n\t\t")}
318
- })
319
-
308
+ # map 'first name', 'givenName'
309
+ #
310
+ # You can also calculate the values for fields. For more info, see
311
+ # http://rubysync.org/docs/rubysync-transformations/
312
+
320
313
  # "in" means going from client to vault
321
- #in_transform do
322
- #end
314
+ in_transform do
315
+ #{transform_fields(vault_fields, 'vault', 'client')}
316
+ end
323
317
 
324
318
  # "out" means going from vault to client
325
- #out_transform do
326
- #end
319
+ out_transform do
320
+ #{transform_fields(client_fields, 'client', 'vault')}
321
+ end
322
+
323
+ # if the vault doesn't already hold an association for this record
324
+ # from the client, perform a search here to see if a match can be found
325
+ # in_match do
326
+ # end
327
+
328
+ # if the vault doesn't have an association linking this record to one on
329
+ # the client, perform a search here to see if an existing client record
330
+ # matches this record
331
+ # out_match do
332
+ # end
333
+
334
+ # If this evaluates to false, it will veto the creation of a record on
335
+ # the vault. Good for checking you've got the required fields etc
336
+ # in_create_if do
337
+ # end
338
+
339
+ # if this evaluates to false for an outgoing event then it will
340
+ # veto the creation of a new record on the client
341
+ # out_create_if do
342
+ # end
343
+
344
+ # Should evaluate to the path for placing a new record on the vault
345
+ # in_place do
346
+ # end
347
+
348
+ # Should evaluate to the path for placing a new record on the client
349
+ # out_place do
350
+ # end
351
+
352
+
353
+ # These statements control logging. In log level 2 or higher (specify -v 2),
354
+ # the event will be dumped to the log at any of the places specified below.
355
+ # Uncomment and edit to taste.
356
+ # dump_before :in_filter, :in_transform, :in_place, :out_filter, :out_place, :out_transform
357
+ # dump_after :in_filter, :in_transform, :in_place, :out_filter, :out_place, :out_transform
358
+
327
359
 
328
360
  end
329
361
  end;
330
362
  end
331
363
 
364
+ def allow_through fields
365
+ (fields.empty? ? %w{allow these fields through} : fields).to_ruby
366
+ end
367
+
368
+ def transform_fields fields, mine, other
369
+ (fields.empty? ? ['sample',mine,'fields'] : fields).map {|f| "#map '#{f}', '#{other}_field'"}.join("\n ")
370
+ end
332
371
 
333
372
  SimpleConsole::Application.run(ARGV, Controller, View)
@@ -1,4 +1,4 @@
1
- #!/opt/local/bin/ruby
1
+ #!/usr/bin/env ruby
2
2
 
3
3
  require File.dirname(__FILE__) + "/../config/environment" unless defined?(RAILS_ROOT)
4
4
 
@@ -1,4 +1,4 @@
1
- #!/opt/local/bin/ruby
1
+ #!/usr/bin/env ruby
2
2
  #
3
3
  # You may specify the path to the FastCGI crash log (a log of unhandled
4
4
  # exceptions which forced the FastCGI instance to exit, great for debugging)
@@ -1,4 +1,4 @@
1
- #!/opt/local/bin/ruby
1
+ #!/usr/bin/env ruby
2
2
 
3
3
  require File.dirname(__FILE__) + "/../config/environment" unless defined?(RAILS_ROOT)
4
4
 
@@ -0,0 +1,14 @@
1
+ class HrConnector < RubySync::Connectors::CsvFileConnector
2
+
3
+ # True if the first line of each file is a header
4
+ # and should be ignored
5
+ header_line true
6
+
7
+ field_names 'id,first_name,last_name,skills'.split(',')
8
+ path_field 'id'
9
+ in_path "#{File.dirname(__FILE__)}/../../in"
10
+ #out_path '/directory/to/write/files/to'
11
+ in_glob '*.csv'
12
+ out_extension '.csv'
13
+
14
+ end
@@ -0,0 +1,11 @@
1
+ class LdapVaultConnector < RubySync::Connectors::LdapConnector
2
+
3
+ host 'localhost'
4
+ port 389
5
+ username 'cn=Manager,dc=my-domain,dc=com'
6
+ password 'secret'
7
+ search_filter "cn=*"
8
+ search_base "ou=users,o=my-organization,dc=my-domain,dc=com"
9
+ #:bind_method :simple
10
+
11
+ end
@@ -0,0 +1,24 @@
1
+ class HrImportPipeline < RubySync::Pipelines::BasePipeline
2
+
3
+ client :hr
4
+
5
+ vault :ldap_vault
6
+
7
+ # Remove any fields that you don't want to set in the vault from the client
8
+ allow_in 'id', 'first_name', 'last_name', 'skills'
9
+
10
+ # "in" means going from client to vault
11
+ in_transform do
12
+ map 'cn', 'id'
13
+ map 'sn', 'last_name'
14
+ map 'givenname', 'first_name'
15
+ map('employeeType') { value_of('skills').split(':') }
16
+ drop_changes_to 'skills'
17
+ map('objectclass') { 'inetOrgPerson' }
18
+ end
19
+ # Should evaluate to the path for placing a new record on the vault
20
+ in_place do
21
+ "cn=#{source_path},ou=users,o=my-organization,dc=my-domain,dc=com"
22
+ end
23
+
24
+ end
@@ -0,0 +1,3 @@
1
+ id,first_name,last_name,skills
2
+ bobby,BareKnuckle,Bobby,pugilism:yoga
3
+ tt,Testy,Terry,kidnapping:interrogation:juggling
@@ -0,0 +1,8 @@
1
+ class DatabankConnector < RubySync::Connectors::XmlConnector
2
+
3
+ #
4
+ # You would normally specify an absolute pathname here.
5
+ #
6
+ filename "#{File.dirname(__FILE__)}/../../databank.xml"
7
+
8
+ end
@@ -0,0 +1,14 @@
1
+ class HrConnector < RubySync::Connectors::CsvFileConnector
2
+
3
+ # True if the first line of each file is a header
4
+ # and should be ignored
5
+ header_line true
6
+
7
+ field_names 'id,first_name,last_name,skills'.split(',')
8
+ path_field 'id'
9
+ in_path "#{File.dirname(__FILE__)}/../../in"
10
+ #out_path '/directory/to/write/files/to'
11
+ in_glob '*.csv'
12
+ out_extension '.csv'
13
+
14
+ end
@@ -0,0 +1,24 @@
1
+ class HrImportPipeline < RubySync::Pipelines::BasePipeline
2
+
3
+ client :hr
4
+
5
+ vault :databank
6
+
7
+ # Remove any fields that you don't want to set in the vault from the client
8
+ allow_in 'id', 'first_name', 'last_name', 'skills'
9
+
10
+ # "in" means going from client to vault
11
+ in_transform do
12
+ map 'cn', 'id'
13
+ map 'sn', 'last_name'
14
+ map 'givenname', 'first_name'
15
+ map('employeeType') { value_of('skills').split(':') }
16
+ drop_changes_to 'skills'
17
+ map('objectclass') { 'inetOrgPerson' }
18
+ end
19
+ # Should evaluate to the path for placing a new record on the vault
20
+ in_place do
21
+ "cn=#{source_path},ou=users,o=my-organization,dc=my-domain,dc=com"
22
+ end
23
+
24
+ end
@@ -0,0 +1 @@
1
+ <entries><entry id='cn=bobby,ou=users,o=my-organization,dc=my-domain,dc=com'><attr name='cn'><value>bobby</value></attr><attr name='givenname'><value>BareKnuckle</value></attr><attr name='objectclass'><value>inetOrgPerson</value></attr><attr name='sn'><value>Bobby</value></attr><attr name='employeeType'><value>pugilism</value><value>yoga</value></attr></entry><entry id='cn=tt,ou=users,o=my-organization,dc=my-domain,dc=com'><attr name='cn'><value>tt</value></attr><attr name='givenname'><value>Testy</value></attr><attr name='objectclass'><value>inetOrgPerson</value></attr><attr name='sn'><value>Terry</value></attr><attr name='employeeType'><value>kidnapping</value><value>interrogation</value><value>juggling</value></attr></entry></entries>
@@ -0,0 +1,3 @@
1
+ id,first_name,last_name,skills
2
+ bobby,BareKnuckle,Bobby,pugilism:yoga
3
+ tt,Testy,Terry,kidnapping:interrogation:juggling
@@ -0,0 +1 @@
1
+ $ rubysync create config
2
 
1
3
  # True if the first line of each file is a header
2
4
  # and should be ignored
3
5
  header_line true
4
6
  field_names 'id,first_name,last_name,skills'.split(',')
5
7
  path_field 'id'
6
8
  in_path "#{File.dirname(__FILE__)}/../../in"
7
9
  #out_path '/directory/to/write/files/to'
8
10
  in_glob '*.csv'
9
11
  out_extension '.csv'
10
12
 
11
13
 
12
14
  client :hr
13
15
  vault :databank
14
16
  # Remove any fields that you don't want to set in the vault from the client
15
17
  allow_in 'id', 'first_name', 'last_name', 'skills'
16
18
  # "in" means going from client to vault
17
19
  in_transform do
18
20
  map 'cn', 'id'
19
21
  map 'sn', 'last_name'
20
22
  map 'givenname', 'first_name'
21
23
  map('employeeType') { value_of('skills').split(':') }
22
24
  drop_changes_to 'skills'
23
25
  map('objectclass') { 'inetOrgPerson' }
24
26
  end
25
27
  # Should evaluate to the path for placing a new record on the vault
26
28
  in_place do
27
29
  "cn=#{source_path},ou=users,o=my-organization,dc=my-domain,dc=com"
28
30
  end
29
- --
30
- --
31
31
  <entry id='cn=bobby,ou=users,o=my-organization,dc=my-domain,dc=com'>
32
32
  <attr name='cn'>
33
33
  <value>bobby</value>
34
34
  </attr>
35
35
  <attr name='givenname'>
36
36
  <value>BareKnuckle</value>
37
37
  </attr>
38
38
  <attr name='objectclass'>
39
39
  <value>inetOrgPerson</value>
40
40
  </attr>
41
41
  <attr name='sn'>
42
42
  <value>Bobby</value>
43
43
  </attr>
44
44
  <attr name='employeeType'>
45
45
  <value>pugilism</value>
46
46
  <value>yoga</value>
47
47
  </attr>
48
48
  </entry>
49
49
  <entry id='cn=tt,ou=users,o=my-organization,dc=my-domain,dc=com'>
50
50
  <attr name='cn'>
51
51
  <value>tt</value>
52
52
  </attr>
53
53
  <attr name='givenname'>
54
54
  <value>Testy</value>
55
55
  </attr>
56
56
  <attr name='objectclass'>
57
57
  <value>inetOrgPerson</value>
58
58
  </attr>
59
59
  <attr name='sn'>
60
60
  <value>Terry</value>
61
61
  </attr>
62
62
  <attr name='employeeType'>
63
63
  <value>kidnapping</value>
64
64
  <value>interrogation</value>
65
65
  <value>juggling</value>
66
66
  </attr>
67
67
  </entry>
@@ -0,0 +1,3 @@
1
+ id,first_name,last_name,skills
2
+ bobby,BareKnuckle,Bobby,pugilism:yoga
3
+ tt,Testy,Terry,kidnapping:interrogation:juggling
@@ -0,0 +1,2 @@
1
+ id,first_name,last_name,skills
2
+ frenchy,Freddy,French,kung fu:assassinations:flower arranging