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,36 @@
1
+ module AssLauncher
2
+ module Enterprise
3
+ # @api private
4
+ # Mixin for {CliDef}
5
+ # Load all CLI definitions from files +cli_def/v.v.v.rb+
6
+ module CliDefsLoader
7
+ DEFS_PATH = File.expand_path('../cli_def', __FILE__)
8
+ def version_from_file_name(file)
9
+ Gem::Version.new File.basename(file, '.rb')
10
+ end
11
+ private :version_from_file_name
12
+
13
+ def defs_versions
14
+ Dir.glob(File.join(DEFS_PATH, '*.rb')).map do |l|
15
+ version_from_file_name l
16
+ end.sort
17
+ end
18
+ private :defs_versions
19
+
20
+ def load_def(v)
21
+ require File.join(DEFS_PATH, "#{v}")
22
+ @loaded_defs ||= []
23
+ @loaded_defs << v
24
+ end
25
+ private :load_def
26
+
27
+ def load_defs
28
+ defs_versions.sort.each do |v|
29
+ enterprise_version v
30
+ load_def v
31
+ end
32
+ end
33
+ private :load_defs
34
+ end
35
+ end
36
+ end
@@ -128,7 +128,7 @@ module AssLauncher
128
128
  # @note It work not correct. If old version ole object is loded in
129
129
  # memory new registred version will be ignored.
130
130
  class COMConnector < AbstractAssOleBinary
131
- require 'english'
131
+ require 'English'
132
132
  BINARY = 'comcntr.dll'
133
133
  def binary
134
134
  BINARY
@@ -203,10 +203,17 @@ module AssLauncher
203
203
  private :_binary_wrapper
204
204
 
205
205
  def reg_server
206
- run_as_enterprise ['/regserver']
206
+ run_as_enterprise reg_server_args
207
207
  end
208
208
  private :reg_server
209
209
 
210
+ def reg_server_args
211
+ r = ['/regserver']
212
+ r << '-currentuser' if version >= Gem::Version.new('8.3.9')
213
+ r
214
+ end
215
+ private :reg_server_args
216
+
210
217
  def unreg_server
211
218
  run_as_enterprise ['/unregserver']
212
219
  end
@@ -24,7 +24,7 @@ class WIN32OLE
24
24
  args[1]
25
25
  end
26
26
  else
27
- require 'win32ole'
27
+ require 'win32ole' unless AssLauncher::Platform.linux?
28
28
  @win32ole_loaded = true # for tests zonde
29
29
  end
30
30
  # :nocov:
@@ -6,6 +6,13 @@ module AssLauncher
6
6
  module Enterprise
7
7
  # 1C:Enterprise ole objects layer
8
8
  module Ole
9
+ # Wrapper for {OLE_CLIENT_TYPES}
10
+ def self.ole_client(type)
11
+ fail ArgumentError, "Invalid ole type `#{type}'. Use types:"\
12
+ " #{OLE_CLIENT_TYPES.keys}" unless OLE_CLIENT_TYPES.key? type
13
+ OLE_CLIENT_TYPES[type]
14
+ end
15
+
9
16
  # 1C Infobase External Connection
10
17
  class IbConnection
11
18
  attr_reader :__ole__
@@ -54,7 +61,7 @@ module AssLauncher
54
61
  end
55
62
 
56
63
  # Set 1C Ole server properties
57
- def __configure_com_connector__(**opts)
64
+ def __configure_com_connector__(opts)
58
65
  opts.each do |k, v|
59
66
  __ole_binary__.ole.setproperty(k, v)
60
67
  end
@@ -183,6 +190,15 @@ module AssLauncher
183
190
  end
184
191
  protected :__ole_binary__
185
192
  end
193
+
194
+ # Define type of 1C OLE clients
195
+ OLE_CLIENT_TYPES = {
196
+ external: AssLauncher::Enterprise::Ole::IbConnection,
197
+ wprocess: AssLauncher::Enterprise::Ole::WpConnection,
198
+ sagent: AssLauncher::Enterprise::Ole::AgentConnection,
199
+ thin: AssLauncher::Enterprise::Ole::ThinApplication,
200
+ thick: AssLauncher::Enterprise::Ole::ThickApplication
201
+ }
186
202
  end
187
203
  end
188
204
  end
@@ -0,0 +1,164 @@
1
+ # encoding: utf-8
2
+
3
+ module AssLauncher
4
+ module Enterprise
5
+ # Abstract 1C:Enterprise client. Provides {#location} method as URI
6
+ # generator for connection to
7
+ # 1C information base via web browser.
8
+ # @example (see #initialize)
9
+ # @example (see #location)
10
+ class WebClient
11
+ require 'uri'
12
+ require 'ass_launcher/enterprise/cli'
13
+ DEFAULT_OPTIONS = { disable_startup_messages: true }
14
+ DEFAULT_VERSION = '999'
15
+
16
+ # @return [URI] base uri location
17
+ attr_reader :uri
18
+ # Version for 1C:Enterprise platform
19
+ attr_reader :version
20
+ # @return [WebClient]
21
+ # @example
22
+ #
23
+ # # Get webclient usin connection string:
24
+ # connection_string =\
25
+ # AssLauncher::Support::ConnectionString.new(
26
+ # 'ws="http://host:port/infobase"')
27
+ # wc = AssLauncher::Enterprise::WebClient.new(cs.uri)
28
+ #
29
+ # #or without connection_string
30
+ # wc = AssLauncher::Enterprise::WebClient.new('http://host/path')
31
+ #
32
+ # @param uri [String URI] base infobase location
33
+ # @param version [String] version 1C:Enterprise platform.
34
+ # The {Enterprise::WebClient#cli_spec}
35
+ # depends on the {Enterprise::WebClient#version}.
36
+ # Default supposed max possable version.
37
+ # {Enterprise::WebClient::DEFAULT_VERSION}
38
+ #
39
+ def initialize(uri = '', version = DEFAULT_VERSION)
40
+ @version = Gem::Version.new(version || DEFAULT_VERSION)
41
+ @uri ||= URI(uri || '')
42
+ end
43
+
44
+ def uri=(uri)
45
+ @uri = URI(uri)
46
+ end
47
+
48
+ # @return [Cli::CliSpec]
49
+ def cli_spec
50
+ @cli_spec ||= AssLauncher::Enterprise::Cli::CliSpec.for(self)
51
+ end
52
+
53
+ # Defined run modes fo client
54
+ # @return (see Cli.defined_modes_for)
55
+ def self.run_modes
56
+ Cli.defined_modes_for(self)
57
+ end
58
+
59
+ # (see .run_modes)
60
+ def run_modes
61
+ self.class.run_modes
62
+ end
63
+
64
+ def build_args(&block)
65
+ args_builder.build_args(&block)
66
+ end
67
+ private :build_args
68
+
69
+ def args_builder
70
+ Cli::ArgumentsBuilder.new(cli_spec, run_modes[0])
71
+ end
72
+ private :args_builder
73
+
74
+ # Build URI location for connect to web infobase.
75
+ #
76
+ # We can use {Cli::ArgumentsBuilder} for
77
+ # build connection string with validation parameters on defined in
78
+ # {#cli_spec} specifications.
79
+ #
80
+ # Or we can pass parameters as +args+ array directly.
81
+ # @example
82
+ # wc = AssLauncher::Enterprise::WebClient.new('http://host/path')
83
+ #
84
+ # # Without ArgumentsBulder
85
+ # wc.location(['O', 'low', 'C', 'passed string',
86
+ # 'N', '1cuser',
87
+ # 'P', '1cpassw',
88
+ # 'Authoff', '']) #=> URI
89
+ #
90
+ # # With ArgumentsBulder
91
+ # wc.location do
92
+ # _O :Low
93
+ # _C 'passed string'
94
+ # _N '1cuser'
95
+ # _P '1cuser_password'
96
+ # wA :-
97
+ # oIDA :-
98
+ # authOff
99
+ # _L 'en'
100
+ # vL 'en'
101
+ # debuggerURL 'localhost'
102
+ # _UsePrivilegedMode
103
+ # end #=> URI
104
+ #
105
+ # @param args [Arry]
106
+ # @option options [bool] :disable_startup_messages adds or not
107
+ # '/DisableStartupMessages' flag parameter into +args+
108
+ #
109
+ def location(args = [], **options, &block)
110
+ options = DEFAULT_OPTIONS.merge options
111
+ args += ['DisableStartupMessages', '']\
112
+ if options[:disable_startup_messages]
113
+ args += build_args(&block) if block_given?
114
+ add_to_query uri.dup, args_to_query(args)
115
+ end
116
+
117
+ def add_to_query(uri, q)
118
+ if uri.query
119
+ uri.query += escape "&#{q}" if q
120
+ else
121
+ uri.query = escape "#{q}" if q
122
+ end
123
+ uri
124
+ end
125
+ private :add_to_query
126
+
127
+ def escape(s)
128
+ self.class.escape(s)
129
+ end
130
+ private :escape
131
+
132
+ # Fuckin 1C is bad understand of CGI.escape.
133
+ # From escaping exclude: =&
134
+ # and ' ' replaced on '%20'
135
+ def self.escape(string)
136
+ string.gsub(/([^ a-zA-Z0-9_.\-=&]+)/) do
137
+ '%' + $1.unpack('H2' * $1.bytesize).join('%').upcase
138
+ end.gsub(' ', '%20')
139
+ end
140
+
141
+ CLI_TO_WEB_PARAM_NAME = %r{^/}
142
+
143
+ def args_to_query(args)
144
+ r = to_query(args)
145
+ r.gsub!(/&$/, '')
146
+ return nil if r.empty?
147
+ r
148
+ end
149
+ private :args_to_query
150
+
151
+ def to_query(args)
152
+ r = ''
153
+ args.each_with_index do |v, i|
154
+ next if (i + 1).even?
155
+ r << "#{v.gsub(CLI_TO_WEB_PARAM_NAME, '')}"
156
+ r << "=#{args[i + 1]}" unless args[i + 1].to_s.empty?
157
+ r << '&'
158
+ end
159
+ r
160
+ end
161
+ private :to_query
162
+ end
163
+ end
164
+ end
@@ -9,7 +9,7 @@ module AssLauncher
9
9
  # 1C:Entrprise platform abstraction layer
10
10
  module Enterprise
11
11
  require 'ass_launcher/enterprise/binary_wrapper'
12
- require 'ass_launcher/enterprise/web_clients'
12
+ require 'ass_launcher/enterprise/web_client'
13
13
  require 'ass_launcher/enterprise/ole'
14
14
 
15
15
  extend AssLauncher::Support::Platforms
@@ -57,9 +57,20 @@ module AssLauncher
57
57
  end
58
58
  end
59
59
 
60
+ # Caching {BinaryWrapper} instances
61
+ # @api private
62
+ # @return [Hash]
63
+ def self.binary_wrappers_cache
64
+ @binary_wrappers_cache ||= {}
65
+ end
66
+
60
67
  def self.find_clients(klass)
61
68
  find_binaries(binaries(klass)).map do |binpath|
62
- klass.new(binpath)
69
+ if binary_wrappers_cache.key?(binpath)
70
+ binary_wrappers_cache[binpath]
71
+ else
72
+ binary_wrappers_cache[binpath] = klass.new(binpath)
73
+ end
63
74
  end
64
75
  end
65
76
  private_class_method :find_clients
@@ -91,20 +102,36 @@ module AssLauncher
91
102
  end.compact
92
103
  end
93
104
 
94
- # (see WebClients.client)
95
- def self.web_client(name)
96
- WebClients.client(name)
105
+ # @param uri (see WebClient#initialize)
106
+ # @param version (see WebClient#initialize)
107
+ # @return [AssLauncher::Enterprise::WebClient]
108
+ def self.web_client(uri = nil, version = nil)
109
+ WebClient.new(uri, version)
110
+ end
111
+
112
+ # Find binaries in Cygwin work slow.
113
+ # For rapid get binaries uses catch
114
+ # @return [Hash]
115
+ # @api private
116
+ def self.glob_cache
117
+ @glob_cache ||= {}
118
+ end
119
+
120
+ # Cliar {.glob_cache}
121
+ def self.clear_glob_cache
122
+ @glob_cache = nil
97
123
  end
98
124
 
99
125
  # Find and return all 1C:Entrprise binaries
100
126
  # @return [Array<BinaryWrapper>]
101
127
  def self.find_binaries(basename)
102
128
  return [] if basename.to_s.empty?
129
+ return glob_cache[basename] if glob_cache.key?(basename)
103
130
  r = []
104
131
  search_paths.flatten.each do |sp|
105
132
  r += platform.glob("#{sp}/**/#{basename}")
106
133
  end
107
- r
134
+ glob_cache[basename] = r
108
135
  end
109
136
  private_class_method :find_binaries
110
137
  end
@@ -18,7 +18,7 @@ module AssLauncher
18
18
  class Error < StandardError; end
19
19
  class ParseError < StandardError; end
20
20
  # Commonn connection string fields
21
- COMMON_FIELDS = %w(Usr Pwd LicDstr prmod Locale)
21
+ COMMON_FIELDS = %w(Usr Pwd LicDstr prmod Locale Zn)
22
22
  # Fields for server-infobase
23
23
  SERVER_FIELDS = %w(Srvr Ref)
24
24
  # Fields for file-infobase
@@ -121,6 +121,7 @@ module AssLauncher
121
121
  r += ['/P', pwd] if pwd
122
122
  r += ['/UsePrivilegedMode', ''] if prmod.to_s == '1'
123
123
  r += ['/L', locale] if locale
124
+ r += ['/Z', zn] if zn
124
125
  r
125
126
  end
126
127
  private :to_args_common
@@ -152,7 +153,10 @@ module AssLauncher
152
153
 
153
154
  def self.included(base)
154
155
  base.fields.each do |f|
155
- base.send(:attr_accessor, f.downcase.to_sym)
156
+ base.send(:attr_reader, f.downcase.to_sym) unless\
157
+ base.instance_methods.include? f.downcase.to_sym
158
+ base.send(:attr_writer, f.downcase.to_sym) unless\
159
+ base.instance_methods.include? "#{f.downcase}=".to_sym
156
160
  end
157
161
  end
158
162
 
@@ -231,8 +235,6 @@ module AssLauncher
231
235
  SERVER_FIELDS
232
236
  end
233
237
 
234
- include ConnectionString
235
-
236
238
  def initialize(hash)
237
239
  fail ConnectionString::Error unless required_fields_received?(hash)
238
240
  _set_properties(hash)
@@ -309,6 +311,8 @@ module AssLauncher
309
311
  ['/S', "#{srvr}/#{ref}"]
310
312
  end
311
313
  private :to_args_private
314
+
315
+ include ConnectionString
312
316
  end
313
317
 
314
318
  # Connection string for file-infobases
@@ -322,8 +326,6 @@ module AssLauncher
322
326
  required_fields | COMMON_FIELDS
323
327
  end
324
328
 
325
- include ConnectionString
326
-
327
329
  def initialize(hash)
328
330
  fail ConnectionString::Error unless required_fields_received?(hash)
329
331
  _set_properties(hash)
@@ -364,6 +366,8 @@ module AssLauncher
364
366
  ['/F', path.realpath.to_s]
365
367
  end
366
368
  private :to_args_private
369
+
370
+ include ConnectionString
367
371
  end
368
372
 
369
373
  # Connection string for infobases published on http server
@@ -377,8 +381,6 @@ module AssLauncher
377
381
  required_fields | COMMON_FIELDS | HTTP_WEB_AUTH_FIELDS | PROXY_FIELDS
378
382
  end
379
383
 
380
- include ConnectionString
381
-
382
384
  def initialize(hash)
383
385
  fail ConnectionString::Error unless required_fields_received?(hash)
384
386
  _set_properties(hash)
@@ -394,9 +396,29 @@ module AssLauncher
394
396
  uri = URI(ws)
395
397
  uri.user = wsn
396
398
  uri.password = wsp
399
+ q = uri_query
400
+ uri.query = escape q if q
397
401
  uri
398
402
  end
399
403
 
404
+ def escape(s)
405
+ AssLauncher::Enterprise::WebClient.escape s
406
+ end
407
+ private :escape
408
+
409
+ def uri_query
410
+ r = ''
411
+ r << "N=#{usr}&" if usr
412
+ r << "P=#{pwd}&" if pwd
413
+ r << "L=#{locale}&" if locale
414
+ r << "Z=#{zn}&" if zn
415
+ r << "UsePrivilegedMode&" if prmod
416
+ r.gsub!(/&$/i, '')
417
+ return nil if r.empty?
418
+ r
419
+ end
420
+ private :uri_query
421
+
400
422
  # Convert connection string to array of 1C:Enterprise parameters.
401
423
  # @return [Array] of 1C:Enterprise CLI parameters.
402
424
  def to_args_private
@@ -416,6 +438,9 @@ module AssLauncher
416
438
  r += ['-PPwd', wsppwd] if wsppwd
417
439
  r
418
440
  end
441
+ private :to_args_private_proxy
442
+
443
+ include ConnectionString
419
444
  end
420
445
  end
421
446
  end