ass_launcher 0.1.1.alpha → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (60) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +69 -67
  3. data/Rakefile +19 -0
  4. data/ass_launcher.gemspec +8 -2
  5. data/bin/dev-helper +7 -0
  6. data/bin/lib/dev_helper/cli_def_report.rb +191 -0
  7. data/bin/lib/dev_helper/cli_def_snippets.rb +426 -0
  8. data/bin/lib/dev_helper/designer.rb +172 -0
  9. data/bin/lib/dev_helper.rb +59 -0
  10. data/examples/arguments_builder_example.rb +150 -0
  11. data/examples/binary_wrappers_example.rb +211 -0
  12. data/examples/connection_string_example.rb +59 -0
  13. data/examples/create_infobase_example.rb +45 -0
  14. data/examples/enterprise_ole_example.rb +238 -0
  15. data/examples/enterprise_out_example.rb +87 -0
  16. data/examples/enterprise_running_example.rb +103 -0
  17. data/examples/example_helper.rb +122 -0
  18. data/examples/templates/example_template.cf +0 -0
  19. data/examples/templates/example_template.v8i +9 -0
  20. data/examples/templates/hello.epf +0 -0
  21. data/examples/troubles/with_creteinfobase_example.rb +408 -0
  22. data/examples/troubles/with_running_1c_example.rb +212 -0
  23. data/examples/v8i_file_example.rb +72 -0
  24. data/examples/webclient_example.rb +67 -0
  25. data/lib/ass_launcher/api.rb +113 -0
  26. data/lib/ass_launcher/enterprise/binary_wrapper.rb +159 -144
  27. data/lib/ass_launcher/enterprise/cli/arguments_builder.rb +177 -16
  28. data/lib/ass_launcher/enterprise/cli/binary_matcher.rb +69 -0
  29. data/lib/ass_launcher/enterprise/cli/parameters.rb +297 -44
  30. data/lib/ass_launcher/enterprise/cli/spec_dsl/dsl_helpers.rb +111 -5
  31. data/lib/ass_launcher/enterprise/cli/spec_dsl.rb +102 -51
  32. data/lib/ass_launcher/enterprise/cli.rb +50 -90
  33. data/lib/ass_launcher/enterprise/cli_def/8.2.17.rb +317 -0
  34. data/lib/ass_launcher/enterprise/cli_def/8.2.18.rb +3 -0
  35. data/lib/ass_launcher/enterprise/cli_def/8.3.3.rb +90 -0
  36. data/lib/ass_launcher/enterprise/cli_def/8.3.4.rb +58 -0
  37. data/lib/ass_launcher/enterprise/cli_def/8.3.5.rb +21 -0
  38. data/lib/ass_launcher/enterprise/cli_def/8.3.6.rb +91 -0
  39. data/lib/ass_launcher/enterprise/cli_def/8.3.7.rb +34 -0
  40. data/lib/ass_launcher/enterprise/cli_def/8.3.8.rb +127 -0
  41. data/lib/ass_launcher/enterprise/cli_def/8.3.9.rb +131 -0
  42. data/lib/ass_launcher/enterprise/cli_def.rb +46 -0
  43. data/lib/ass_launcher/enterprise/cli_defs_loader.rb +36 -0
  44. data/lib/ass_launcher/enterprise/ole/ole_binaries.rb +9 -2
  45. data/lib/ass_launcher/enterprise/ole/win32ole.rb +1 -1
  46. data/lib/ass_launcher/enterprise/ole.rb +17 -1
  47. data/lib/ass_launcher/enterprise/web_client.rb +164 -0
  48. data/lib/ass_launcher/enterprise.rb +33 -6
  49. data/lib/ass_launcher/support/connection_string.rb +33 -8
  50. data/lib/ass_launcher/support/linux.rb +88 -0
  51. data/lib/ass_launcher/support/platforms.rb +42 -10
  52. data/lib/ass_launcher/support/shell.rb +33 -6
  53. data/lib/ass_launcher/support/v8i_file.rb +3 -1
  54. data/lib/ass_launcher/support/v8i_section.rb +88 -40
  55. data/lib/ass_launcher/support.rb +1 -0
  56. data/lib/ass_launcher/version.rb +8 -1
  57. data/lib/ass_launcher.rb +1 -0
  58. metadata +79 -17
  59. data/lib/ass_launcher/enterprise/cli/cli.spec +0 -256
  60. data/lib/ass_launcher/enterprise/web_clients.rb +0 -59
@@ -0,0 +1,69 @@
1
+ module AssLauncher
2
+ module Enterprise
3
+ module Cli
4
+ # @api private
5
+ class BinaryMatcher
6
+ ALL_CLIENTS = [:thick, :thin, :web]
7
+
8
+ def self.modes_for
9
+ @modes_for ||= {
10
+ web: Enterprise::WebClient.run_modes,
11
+ thick: Enterprise::BinaryWrapper::ThickClient.run_modes,
12
+ thin: Enterprise::BinaryWrapper::ThinClient.run_modes
13
+ }
14
+ end
15
+ private_class_method :modes_for
16
+
17
+ # Calculate matcher for +run_mode+
18
+ def self.auto(run_modes, requirement = '> 0')
19
+ new auto_client(run_modes), requirement
20
+ end
21
+
22
+ def self.auto_client(modes)
23
+ r = []
24
+ r << :web if satisfied? modes, :web
25
+ r << :thick if satisfied? modes, :thick
26
+ r << :thin if satisfied? modes, :thin
27
+ r
28
+ end
29
+ private_class_method :auto_client
30
+
31
+ def self.satisfied?(modes, client)
32
+ (modes & modes_for[client]).size > 0
33
+ end
34
+ private_class_method :satisfied?
35
+
36
+ attr_reader :clients, :requirement
37
+ def initialize(clients_array = nil, requirement = '>= 0')
38
+ @clients = nil_if_zsize(clients_array) || ALL_CLIENTS
39
+ @requirement = Gem::Requirement.new requirement.to_s
40
+ end
41
+
42
+ def nil_if_zsize(array)
43
+ return nil if (array || []).size == 0
44
+ array
45
+ end
46
+ private :nil_if_zsize
47
+
48
+ def requirement=(r)
49
+ fail ArgumentError unless r.is_a? Gem::Version::Requirement
50
+ @requirement = r
51
+ end
52
+
53
+ def match?(binary_wrapper)
54
+ match_client?(binary_wrapper) && match_version?(binary_wrapper)
55
+ end
56
+
57
+ private
58
+ def match_client?(bw)
59
+ clients.include? bw.class.name.split('::').last.
60
+ to_s.downcase.gsub(/client$/,'').to_sym
61
+ end
62
+
63
+ def match_version?(bw)
64
+ requirement.satisfied_by? bw.version
65
+ end
66
+ end
67
+ end
68
+ end
69
+ end
@@ -13,12 +13,13 @@ module AssLauncher
13
13
  # +parent+ propery. If +parent+ property is +nil+ it is root parameter
14
14
  # and subpurameter if else
15
15
  module Parameters
16
+ # Options for parameter
16
17
  DEFAULT_OPTIONS = {
17
18
  required: false,
18
- value_validator: proc { |value| value },
19
+ value_validator: nil,
19
20
  switch_list: nil,
20
21
  chose_list: nil,
21
- switch_value: proc { |value| value }
22
+ switch_value: nil
22
23
  }.freeze
23
24
 
24
25
  # Parameter name like it define in 1C cli api
@@ -43,61 +44,98 @@ module AssLauncher
43
44
  # Parent parameter for subpurameter
44
45
  # @return kinde of [String]
45
46
  attr_reader :parent
46
- # Options
47
+ # Options see {DEFAULT_OPTIONS}
47
48
  # @return [Hash]
48
49
  attr_reader :options
49
50
 
51
+ # Return +true+ if parameter defined for +binary_wrapper+ and +run_mode+
52
+ # @param binary_wrapper [BinaryWrapper::ThickClient
53
+ # BinaryWrapper::ThinClient WebClient]
54
+ # @param run_mode [Symbol] see {Parameters#modes}
50
55
  def match?(binary_wrapper, run_mode)
51
56
  binary_matcher.match?(binary_wrapper) && modes.include?(run_mode)
52
57
  end
53
58
 
59
+ # Return +true+ if parameter defined for +version+
60
+ # @param version [Gem::Version]
61
+ def match_version?(version)
62
+ binary_matcher.requirement.satisfied_by? version
63
+ end
64
+
65
+ # :nodoc:
54
66
  def to_sym
55
67
  name.downcase.to_sym
56
68
  end
57
69
 
70
+ # Returns parameter full name. Full name
71
+ # composed from +full_name+ of all
72
+ # {#parents} parameters
73
+ # @return [String]
58
74
  def full_name
59
75
  return name if root?
60
76
  "#{parent.full_name}#{name}"
61
77
  end
62
78
 
79
+ # Array of parent parameters
80
+ # @return [Array]
63
81
  def parents
64
82
  return [] if root?
65
83
  parent.parents << parent
66
84
  end
67
85
 
86
+ # Returns deep parameter in hierarchy tree
87
+ # @return [Fixnum]
68
88
  def deep
69
89
  parents.size
70
90
  end
71
91
 
92
+ # Returns +true+ if haven't {#parent} parameter
72
93
  def root?
73
94
  parent.nil?
74
95
  end
75
96
 
97
+ # Returns +true+ if it's child of +expected_parent+ parameter
98
+ # @param expected_parent kinde of [StringParam]
76
99
  def child?(expected_parent)
77
100
  return false if root?
78
101
  parent == expected_parent
79
102
  end
80
103
 
104
+ # :nodoc:
81
105
  def to_s
82
106
  name.to_s
83
107
  end
84
108
 
109
+ # Returns self with +value+ as 1C:Enterprise CLI argumets array
110
+ # @example
111
+ # param.name #=> "/Parm"
112
+ # param.to_args 'value' #=> ["/Param", "value"]
113
+ # @return [Array<String>]
85
114
  def to_args(value)
86
- [key(value), value(value)]
115
+ [key(value).to_s, value(value).to_s]
87
116
  end
88
117
 
118
+ # Wrapper for {#options}
89
119
  def switch_list
90
120
  options[:switch_list]
91
121
  end
92
122
 
123
+ # (see #switch_list)
93
124
  def chose_list
94
125
  options[:chose_list]
95
126
  end
96
127
 
128
+ # (see #switch_list)
97
129
  def value_validator
98
- options[:value_validator]
130
+ options[:value_validator] || proc { |value| value }
99
131
  end
100
132
 
133
+ # (see #switch_list)
134
+ def switch_value
135
+ options[:switch_value] || proc { |value| value }
136
+ end
137
+
138
+ # (see #switch_list)
101
139
  def required?
102
140
  options[:required]
103
141
  end
@@ -123,24 +161,51 @@ module AssLauncher
123
161
  end
124
162
  private :def_options
125
163
 
164
+ # Builds usage message
126
165
  def usage
127
166
  fail NotImplementedError
128
167
  end
129
168
 
130
169
  def auto_binary_matcher(arg)
131
170
  return arg if arg.is_a? BinaryMatcher
132
- return BinaryMatcher.new(auto_client, arg) if arg.is_a? String
133
- BinaryMatcher.new auto_client
171
+ return BinaryMatcher.auto(modes, arg) if arg.is_a? String
172
+ BinaryMatcher.auto modes
134
173
  end
135
174
  private :auto_binary_matcher
136
175
 
137
- def auto_client
138
- #return :thick if modes.include?(:createinfobase) ||
139
- # modes.include?(:designer)
140
- return :thick unless modes.include?(:enterprise)
141
- :all
176
+ # Array of subparameters
177
+ # @return [Array]
178
+ def childs
179
+ @childs ||= []
142
180
  end
143
- private :auto_client
181
+
182
+ # Add subparameter into {#childs} array
183
+ # @param param kinde of {StringParam}
184
+ def add_child(param)
185
+ childs << param
186
+ end
187
+
188
+ # Restricts parameter from +version+
189
+ # and do it recursively for all subparameters from {#childs} array
190
+ # @param (see #match_version?)
191
+ def restrict_from(version)
192
+ restrict_childs(version)
193
+ binary_matcher.requirement =
194
+ restrict_v(binary_matcher.requirement,
195
+ version) if match_version? version
196
+ end
197
+
198
+ def restrict_childs(version)
199
+ childs.each do |p|
200
+ p.restrict_from version
201
+ end
202
+ end
203
+ private :restrict_childs
204
+
205
+ def restrict_v(r, v)
206
+ Gem::Version::Requirement.new r.to_s.split(','), "< #{v}"
207
+ end
208
+ private :restrict_v
144
209
 
145
210
  # Parameter expects string value
146
211
  class StringParam
@@ -151,12 +216,12 @@ module AssLauncher
151
216
  # @param binary_matcher [BinaryMatcher, String, nil] for which
152
217
  # parameter defined
153
218
  # - If nil will be build default matcher.
154
- # - If string. String value mast be suitable for Gem::Requirement.
219
+ # - If string. String value must be suitable for Gem::Requirement.
155
220
  # In this case, will be build matcher for version defined in
156
221
  # string and suitable bynary type detected on run_modes
157
222
  # @param group [Symbol] parameter group
158
223
  # @param modes [Array] run modes for which parameter defined
159
- # @param parent kinde of [StringParam] parent for subpurameter
224
+ # @param parent kinde of {StringParam} parent for subpurameter
160
225
  # @param options [Hash] see {Parameters::DEFAULT_OPTIONS}
161
226
  def initialize(name, desc, binary_matcher,
162
227
  group, modes, parent = nil, **options)
@@ -167,6 +232,17 @@ module AssLauncher
167
232
  @group = group
168
233
  @options = def_options.merge options
169
234
  @parent = parent
235
+ @parent.add_child(self) unless parent.nil?
236
+ end
237
+
238
+ # Parameter require argumet
239
+ def argument_require
240
+ arguments_count > 0
241
+ end
242
+
243
+ # Count of parameter argumets
244
+ def arguments_count
245
+ 1
170
246
  end
171
247
  end
172
248
 
@@ -176,43 +252,128 @@ module AssLauncher
176
252
  # It class instance make path string platform independet use
177
253
  # {AssLauncher::Support::Platforms::PathExtension} class
178
254
  class Path < StringParam
255
+ # Extends for {Parameters::DEFAULT_OPTIONS}.
256
+ #
257
+ # Option: +:must_be+ expects +:exist+ or +:not_exist+ values.
258
+ #
259
+ # If +:exist+ given verified for path must be exists and
260
+ # if +:not_exist+ given verified for pat must be not exists
261
+ DEFAULT_OPTIONS = Parameters::DEFAULT_OPTIONS.merge(must_be: nil)
179
262
  include AssLauncher::Support::Platforms
263
+
264
+ def default_options
265
+ DEFAULT_OPTIONS
266
+ end
267
+ private :default_options
268
+
269
+ # (see #switch_list)
270
+ def must_be
271
+ options[:must_be]
272
+ end
273
+
180
274
  def value(value)
181
- platform.path(value).to_s
275
+ validate(value)
276
+ path = platform.path(value).realdirpath
277
+ verify(path)
278
+ path.to_s
182
279
  end
183
280
  private :value
281
+
282
+ def verify(path)
283
+ case must_be
284
+ when :exist then must_exists(path)
285
+ when :not_exist then must_not_exists(path)
286
+ end
287
+ end
288
+ private :verify
289
+
290
+ def must_exists(path)
291
+ fail ArgumentError, "Wrong value for #{name}."\
292
+ " Path #{path} not exists" unless path.exist?
293
+ end
294
+ private :must_exists
295
+
296
+ def must_not_exists(path)
297
+ fail ArgumentError, "Wrong value for #{name}."\
298
+ " Path #{path} exists" if path.exist?
299
+ end
300
+ private :must_not_exists
184
301
  end
185
302
 
186
- # Chose parameter expects argunment value from chose_list
187
- class Chose < StringParam
188
- def validate(value)
189
- fail ArgumentError, "Wrong value `#{value}' for #{name} parameter"\
190
- unless chose_list.key? value.to_sym
303
+ # In 8.3.8 platform add CLI parameters like as
304
+ # +/DumpExternalDataProcessorOrReportToFiles+ expects 2 argumetns
305
+ class PathTwice < StringParam
306
+ include AssLauncher::Support::Platforms
307
+ def to_args(p1, p2)
308
+ [key('').to_s, rdp_(p1).to_s, rdp_(p2).to_s]
191
309
  end
192
- private :validate
310
+
311
+ def rdp_(p)
312
+ platform.path(p).realdirpath
313
+ end
314
+ private :rdp_
193
315
  end
194
316
 
195
317
  # Flag parameter not expects argument
196
318
  class Flag < StringParam
197
- def to_args
319
+ # Returns self as 1C:Enterprise CLI argumets array like
320
+ # +["/Flag", ""]+
321
+ # @param _ [nil] {Flag} not expects argument
322
+ # @return (see StringParam#to_args)
323
+ def to_args(_ = nil)
198
324
  super ''
199
325
  end
326
+
327
+ # Count of parameter argumets
328
+ def arguments_count
329
+ 0
330
+ end
331
+ end
332
+
333
+ class SkippedError < StandardError; end
334
+
335
+ # Stub for define stupid or not importand parameters
336
+ # {#to_args} raises of {SkippedError}
337
+ class Skip < StringParam
338
+ def to_args(*values)
339
+ fail SkippedError, "Parameter #{full_name} skipped and restricted for use"
340
+ end
341
+
342
+ def skip?
343
+ true
344
+ end
200
345
  end
201
346
 
202
- # Switch parameter is most stupid cli parameter of 1C:Enterprise.
203
- # Switch parameter expects argument value from +:switch_list* or
347
+ # Chose parameter expects argunment value from chose_list
348
+ class Chose < StringParam
349
+ def validate(value)
350
+ fail ArgumentError,
351
+ "Wrong value `#{value}' for #{name} parameter" unless\
352
+ valid?(value)
353
+ end
354
+ private :validate
355
+
356
+ def valid?(value)
357
+ chose_list.keys.map(&:to_s).map(&:downcase).include?\
358
+ value.to_s.downcase
359
+ end
360
+ end
361
+
362
+
363
+ # Switch parameter is most stupid CLI parameter of 1C:Enterprise.
364
+ # Switch parameter expects argument value from +:switch_list+ or
204
365
  # block +:switch_value+ which return modified value argument.
205
366
  # Switch parameter modifyed self name when uses parameter value
206
367
  # @example
207
- # # /UseHwLicenses have {:"+"=>'',:"-"=>''} switch_list and:
208
- # to_args(:"+") # => ['/UseHwLicenses+','']
209
- # to_args(:"-") # => ['/UseHwLicenses-','']
210
- # to_args(:"bad value") # => ArgumentError
368
+ # # /UseHwLicenses have {:+=>'',:-=>''} switch_list and:
369
+ # to_args(:+) # => ['/UseHwLicenses+','']
370
+ # to_args(:-) # => ['/UseHwLicenses-','']
371
+ # to_args(:bad_value) # => ArgumentError
211
372
  #
212
373
  # # -TimeLimit have block:
213
- # switch_value: =>{|value|; ":#{value}"}
374
+ # {switch_value: ->(value) { ":#{value}"}}
214
375
  # # and
215
- # to_args("12:00") #=> ['-TimeLimit:12:00','']
376
+ # to_args("12:00") # => ['-TimeLimit:12:00','']
216
377
  class Switch < StringParam
217
378
  def value(_value)
218
379
  ''
@@ -220,30 +381,38 @@ module AssLauncher
220
381
  private :value
221
382
 
222
383
  def key(value)
223
- "#{name}#{switch_value(value)}"
384
+ "#{name}#{switch_value_get(value)}"
224
385
  end
225
386
  private :key
226
387
 
227
- def switch_value(value)
388
+ def switch_value_get(value)
228
389
  if switch_list
229
- fail ArgumentError, "Wrong value #{value} for parameter #{name}"\
230
- unless switch_list.key? value.to_sym
390
+ fail ArgumentError,
391
+ "Wrong value #{value} for parameter #{name}" unless\
392
+ valid?(value)
231
393
  end
232
394
  validate(value)
233
- options[:switch_value].call(value)
395
+ switch_value.call(value)
396
+ end
397
+ private :switch_value_get
398
+
399
+ def valid?(value)
400
+ switch_list.keys.map(&:to_s).map(&:downcase).include?\
401
+ value.to_s.downcase
234
402
  end
235
- private :switch_value
236
403
  end
237
404
 
238
- # List of parameters
405
+ # List of parameters defined for one version
406
+ # @raise (see #<<)
239
407
  class ParametersList
240
- def initialize
241
- @parameters = []
408
+ # Array of parameters.
409
+ # For add parameter into array use {#<<}
410
+ def parameters
411
+ @parameters ||= []
242
412
  end
243
413
 
244
- attr_reader :parameters
245
- private :parameters
246
-
414
+ # Returns +true+ if parameter +p+ presents in list
415
+ # @param p kinde of {StringParam}
247
416
  def param_defined?(p)
248
417
  !find(p.name, p.parent).nil?
249
418
  end
@@ -255,7 +424,7 @@ module AssLauncher
255
424
  fail ArgumentError,
256
425
  "Parameter #{p.full_name} alrady defined" if\
257
426
  param_defined?(p)
258
- @parameters << p
427
+ parameters << p
259
428
  end
260
429
  alias_method :"+", :"<<"
261
430
  alias_method :add, :"<<"
@@ -275,14 +444,98 @@ module AssLauncher
275
444
  nil
276
445
  end
277
446
 
447
+ # :nodoc:
278
448
  def each(&block)
279
449
  parameters.each(&block)
280
450
  end
281
451
 
452
+ # (see Parameters#usage)
282
453
  def usage
283
454
  fail NotImplementedError
284
455
  end
285
456
  end
457
+
458
+ # List of parameters defined for all versions
459
+ # @raise (see #add)
460
+ class AllParameters
461
+ # Array of parameters.
462
+ # For add parameter into array use {#add}
463
+ def parameters
464
+ @parameters ||= []
465
+ end
466
+
467
+ # Add parameter into list
468
+ # @param (see #param_defined?)
469
+ # @raise [ArgumentError] if parameter +p.name+ alrady defined for
470
+ # +version+
471
+ def add(p, version)
472
+ fail_if_difined(p, version)
473
+ parameters << p
474
+ end
475
+
476
+ def fail_if_difined(p, version)
477
+ fail ArgumentError,
478
+ "Parameter #{p.full_name} alrady defined for version"\
479
+ " #{version}" if param_defined? p, version
480
+ end
481
+ private :fail_if_difined
482
+
483
+ # Returns +true+ if parameter +p+ for +version+ presents in list
484
+ # @param p kinde of {StringParam}
485
+ # @param version (see Parameters#match_version?)
486
+ def param_defined?(p, version)
487
+ find(p.name, p.parent).each do |p_|
488
+ return true if p_.match_version? version
489
+ end
490
+ false
491
+ end
492
+
493
+ # Return parameters list for given +binary_wrapper+ and +run_mode+
494
+ # @return [ParametersList] for given +binary_wrapper+ and +run_mode+
495
+ # @param (see Parameters#match?)
496
+ def to_parameters_list(binary_wrapper, run_mode)
497
+ r = new_list
498
+ parameters.each do |p|
499
+ r << p if p.match? binary_wrapper, run_mode
500
+ end
501
+ r
502
+ end
503
+
504
+ def new_list
505
+ ParametersList.new
506
+ end
507
+ private :new_list
508
+
509
+ # Find actual parameter for +version+
510
+ # @return kinde of {StringParam}
511
+ # @param name (see #find)
512
+ # @param parent (see #find)
513
+ # @param version [Gem::Version]
514
+ def find_for_version(name, parent, version)
515
+ r = nil
516
+ find(name, parent).each do |p|
517
+ r = oops!(r, p, version) if p.match_version? version
518
+ end
519
+ r
520
+ end
521
+
522
+ def oops!(r, p, v)
523
+ fail "Too many params #{p.full_name} spec for #{v}" unless r.nil?
524
+ p
525
+ end
526
+ private :oops!
527
+
528
+ # Find all parameter versions
529
+ # @param name (see StringParam#initialize)
530
+ # @param parent (see StringParam#initialize)
531
+ # @return [Array] of parameters
532
+ def find(name, parent)
533
+ parameters.select do |p|
534
+ p.to_sym == name.downcase.to_sym &&
535
+ p.parent == parent
536
+ end
537
+ end
538
+ end
286
539
  end
287
540
  end
288
541
  end