ass_launcher 0.1.1.alpha → 0.2.0

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