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,88 @@
1
+ # encoding: utf-8
2
+
3
+ module AssLauncher
4
+ module Support
5
+ # Utils for Linux platform
6
+ module Linux
7
+ extend Platforms
8
+ # Rpm package manager utils
9
+ module Rpm
10
+ # Return instaled package version for +file+
11
+ # @param file [String] path to file
12
+ # @return [Gem::Version] package version
13
+ def self.version(file)
14
+ out = `rpm -q --queryformat '%{RPMTAG_VERSION}.%{RPMTAG_RELEASE}' #{pkg(file)}`
15
+ Gem::Version.new(out.strip)
16
+ end
17
+
18
+ # Return package name for +file+
19
+ # @param file (see .version)
20
+ def self.pkg(file)
21
+ `rpm -qf #{file}`.strip
22
+ end
23
+
24
+ # True if it's pakage manager
25
+ def self.manager?
26
+ `rpm --version`
27
+ return true
28
+ rescue Errno::ENOENT
29
+ return false
30
+ end
31
+ end
32
+
33
+ # Deb package manager utils
34
+ module Deb
35
+ # (see Rpm.version)
36
+ def self.version(file)
37
+ pkg = pkg(file)
38
+ out = `apt-cache policy #{pkg} | grep -i installed:`
39
+ v = out.strip.split(':')[1].strip.gsub('-', '.')
40
+ Gem::Version.new(v)
41
+ end
42
+
43
+ # (see Rpm.version)
44
+ def self.pkg(file)
45
+ `dpkg -S #{file}`.strip.split(':')[0]
46
+ end
47
+
48
+ # (see Rpm.manager?)
49
+ def self.manager?
50
+ `dpkg --version`
51
+ return true
52
+ rescue Errno::ENOENT
53
+ return false
54
+ end
55
+ end
56
+
57
+ # (see Rpm.version)
58
+ # @raise [NotImplementedError]
59
+ def get_pkg_version(file)
60
+ return pkg_manager.version(file) if pkg_manager
61
+ fail NotImplementedError
62
+ end
63
+
64
+ # Return suitable manager or +nil+
65
+ # @return (see #current_pkg_manager)
66
+ def pkg_manager
67
+ @pkg_manager ||= current_pkg_manager
68
+ end
69
+
70
+ # Clculate current package manager
71
+ # @return [Deb Rpm nil]
72
+ def current_pkg_manager
73
+ return Deb if Deb.manager?
74
+ return Rpm if Rpm.manager?
75
+ end
76
+
77
+ def rpm?
78
+ pkg_manager == Rpm
79
+ end
80
+
81
+ def deb?
82
+ pkg_manager == Deb
83
+ end
84
+
85
+ extend self
86
+ end
87
+ end
88
+ end
@@ -1,11 +1,41 @@
1
1
  # encoding: utf-8
2
2
 
3
- require 'ffi'
4
-
5
- module FFI
6
- # Monkey patch of [FFI::Platform]
3
+ module AssLauncher
4
+ # Code partly copied from sources [FFI::Platform] module
5
+ # Module provides some functional like [FFI::Platform]
6
+ # Gem +ffi+ builds binary extension and decided don't use it
7
7
  module Platform
8
- IS_CYGWIN = is_os('cygwin')
8
+ # :nocov:
9
+ OS = case RbConfig::CONFIG['host_os'].downcase
10
+ when /linux/
11
+ 'linux'
12
+ when /darwin/
13
+ 'darwin'
14
+ when /freebsd/
15
+ 'freebsd'
16
+ when /netbsd/
17
+ 'netbsd'
18
+ when /openbsd/
19
+ 'openbsd'
20
+ when /sunos|solaris/
21
+ 'solaris'
22
+ when /mingw|mswin/
23
+ 'windows'
24
+ else
25
+ RbConfig::CONFIG['host_os'].downcase
26
+ end
27
+ # :nocov:
28
+
29
+ # @param [String) os
30
+ # @return [Boolean]
31
+ # Test if current OS is +os+.
32
+ def self.os?(os)
33
+ OS == os
34
+ end
35
+
36
+ IS_CYGWIN = os?('cygwin')
37
+ IS_WINDOWS = os?('windows')
38
+ IS_LINUX = os?('linux')
9
39
 
10
40
  def self.cygwin?
11
41
  IS_CYGWIN
@@ -14,10 +44,12 @@ module FFI
14
44
  def self.linux?
15
45
  IS_LINUX
16
46
  end
47
+
48
+ def self.windows?
49
+ IS_WINDOWS
50
+ end
17
51
  end
18
- end
19
52
 
20
- module AssLauncher
21
53
  module Support
22
54
  # OS-specific things
23
55
  # Mixin module help work with things as paths and env in other plases
@@ -50,19 +82,19 @@ module AssLauncher
50
82
  module Platforms
51
83
  # True if run in Cygwin
52
84
  def cygwin?
53
- FFI::Platform.cygwin?
85
+ Platform.cygwin?
54
86
  end
55
87
  module_function :cygwin?
56
88
 
57
89
  # True if run in MinGW
58
90
  def windows?
59
- FFI::Platform.windows?
91
+ Platform.windows?
60
92
  end
61
93
  module_function :windows?
62
94
 
63
95
  # True if run in Linux
64
96
  def linux?
65
- FFI::Platform.linux?
97
+ Platform.linux?
66
98
  end
67
99
  module_function :linux?
68
100
 
@@ -31,7 +31,7 @@ module AssLauncher
31
31
 
32
32
  # Configuration for {AssLauncher}
33
33
  class Configuration
34
- attr_accessor :logger
34
+ attr_reader :logger
35
35
 
36
36
  def initialize
37
37
  @logger = Loggining.default_logger
@@ -113,17 +113,42 @@ module AssLauncher
113
113
  # @option options [Boolean]:silent_mode run 1C with
114
114
  # /DisableStartupDialogs and /DisableStartupMessages parameters.
115
115
  # Default true
116
+ # @raise [ArgumentError] when +capture_assout: true+ and +args+
117
+ # include +/OUT+ parameter
116
118
  def initialize(cmd, args = [], options = {})
117
119
  @options = DEFAULT_OPTIONS.merge(options).freeze
118
120
  @cmd = cmd
119
121
  @args = args
122
+ validate_args
120
123
  @args += _silent_mode
121
124
  @ass_out_file = _ass_out_file
122
125
  end
123
126
 
127
+ def validate_args
128
+ fail ArgumentError,
129
+ 'Duplicate of /OUT parameter.'\
130
+ ' Delete /OUT from args or set option capture_assout: false' if\
131
+ duplicate_param_out?
132
+ end
133
+ private :validate_args
134
+
135
+ def duplicate_param_out?
136
+ capture_assout? && args_include?(%r{\A\/OUT\z}i)
137
+ end
138
+ private :duplicate_param_out?
139
+
140
+ def args_include?(regex)
141
+ args.grep(regex).size > 0
142
+ end
143
+ private :args_include?
144
+
145
+ def capture_assout?
146
+ options[:capture_assout]
147
+ end
148
+
124
149
  # @return [true] if command was already running
125
150
  def running?
126
- ! process_holder.nil?
151
+ !process_holder.nil?
127
152
  end
128
153
 
129
154
  # Run command
@@ -151,7 +176,7 @@ module AssLauncher
151
176
  private :_out_ass_argument
152
177
 
153
178
  def _ass_out_file
154
- if options[:capture_assout]
179
+ if capture_assout?
155
180
  out_file = AssOutFile.new(options[:assout_encoding])
156
181
  _out_ass_argument out_file
157
182
  else
@@ -280,7 +305,7 @@ module AssLauncher
280
305
  class UnexpectedAssOut < StandardError; end
281
306
  class RunAssError < StandardError; end
282
307
  attr_reader :out, :assout, :exitstatus, :err
283
- attr_accessor :expected_assout
308
+ attr_reader :expected_assout
284
309
  def initialize(exitstatus, out, err, assout)
285
310
  @err = err
286
311
  @out = out
@@ -299,9 +324,11 @@ module AssLauncher
299
324
  self
300
325
  end
301
326
 
327
+ CUT_ASSOUT_LENGTH = 640
328
+
302
329
  def cut_assout
303
- return assout if assout.size <= 80
304
- "#{assout[0, 80]}..."
330
+ return assout if assout.size <= CUT_ASSOUT_LENGTH
331
+ "#{assout[0, CUT_ASSOUT_LENGTH].strip}..."
305
332
  end
306
333
  private :cut_assout
307
334
 
@@ -44,7 +44,9 @@ module AssLauncher
44
44
  # @param filename [String]
45
45
  # @param sections (see write)
46
46
  def self.save(filename, sections)
47
- write File.new(filename, 'w'), sections
47
+ f = File.new(filename, 'w')
48
+ write f, sections
49
+ f.close
48
50
  end
49
51
 
50
52
  private
@@ -2,67 +2,115 @@ module AssLauncher
2
2
  module Support
3
3
  # Implemet section of v8i file
4
4
  class V8iSection
5
- attr_accessor :caption
6
- attr_reader :fields
7
- def initialize(caption, fields)
8
- fail ArgumentError unless\
9
- self.class.fields_required & fields.keys == self.class.fields_required
10
- @caption = caption
11
- @fields = fields
12
- end
5
+ # Class provaides case insensitive access to {#_hash} fields of
6
+ # {V8iSection}
7
+ # @api private
8
+ class Fields
9
+ # Define required fields of v8i
10
+ REQUIRED = [:connect]
13
11
 
14
- # Define required fields of v8i
15
- # @return [Array<String>]
16
- # - Connect - connection string to infobase
17
- def self.fields_required
18
- %w( Connect )
19
- end
12
+ # @return [Hash] containe {V8iSection} fields
13
+ attr_reader :_hash
14
+
15
+ # @param hash [Hash]
16
+ # @raise [ArgumentError] if not all {REQUIRED} given
17
+ def initialize(hash)
18
+ @_hash = hash
19
+ fail ArgumentError if\
20
+ (REQUIRED - dict.keys).size > 0
21
+ end
22
+
23
+ # Dictionary for case insensitive access to {#_hash} values
24
+ # @return [Hash]
25
+ def dict
26
+ @dict ||= build_dict
27
+ end
28
+
29
+ # :nodoc:
30
+ def build_dict
31
+ r = {}
32
+ _hash.each_key do |key|
33
+ r[key.downcase.to_sym] = key
34
+ end
35
+ r
36
+ end
37
+ private :build_dict
38
+
39
+ # Translate any +key+ in to real {#_hash} key
40
+ def trans(key)
41
+ dict[key.downcase.to_sym] || dict_add(key)
42
+ end
43
+ private :trans
20
44
 
21
- # Define extra fields for v8i not defined 1C. This fields use
22
- # admin tools for automate support infodases
23
- # @return [Array<String>] of:
24
- # - AdmConnect - connection string to infobase for admin tools.
25
- # 'Srvr' or 'File' connects only
26
- # - BaseCodeName - infobase configuration code name. For example
27
- # 'Accounting', 'HRM', 'KzAccounting' etc.
28
- # - GetUpdateInfoURI - URI for configuration updateinfo file for example:
29
- # http://downloads.1c.ru/ipp/ITSREPV/V8Update/Configs/Accounting/20/82/
30
- # - BaseCurentVersion - curent configuration version
31
- # - GlobalWS - connection string for access to infobase from internet
32
- # - Vendor - configuration vendor. '1C' 'Rarys' etc.
33
- def self.fields_extras
34
- %w( AdmConnect
35
- BaseCodeName
36
- GetUpdateInfoURI
37
- BaseCurentVersion
38
- GlobalWS
39
- Vendor )
45
+ def dict_add(key)
46
+ dict[key.downcase.to_sym] = key
47
+ key
48
+ end
49
+ private :dict_add
50
+
51
+ # :nodoc:
52
+ def [](key)
53
+ _hash[trans(key)]
54
+ end
55
+
56
+ # :nodoc:
57
+ def []=(key, value)
58
+ _hash[trans(key)] = value
59
+ end
60
+
61
+ # :nodoc:
62
+ def key?(key)
63
+ dict.key? key.to_s.downcase.to_sym
64
+ end
65
+
66
+ # :nodoc:
67
+ def to_s
68
+ res = ''
69
+ _hash.each do |key, value|
70
+ res << "#{key}=#{value}\r\n"
71
+ end
72
+ res
73
+ end
40
74
  end
41
75
 
42
- # Define optional fields of v8i
43
- # @return [Array<String>]
44
- def self.fields_optional
45
- 'TODO'
76
+ # @return [String]
77
+ attr_accessor :caption
78
+ # @return [Fields]
79
+ attr_reader :fields
80
+ # @param caption [String] caption of section
81
+ # @param fields [Hash]
82
+ def initialize(caption, fields)
83
+ @caption = caption
84
+ @fields = Fields.new(fields)
85
+ yield self if block_given?
46
86
  end
47
87
 
88
+ # Return value of field +key+
89
+ # @note It case insensitive
90
+ # @param key [String, Symbol]
48
91
  def [](key)
49
92
  fields[key]
50
93
  end
51
94
 
95
+ # Set value of field +key+
96
+ # @note (see #[])
97
+ # @param key (see #[])
98
+ # @param value [String]
52
99
  def []=(key, value)
53
100
  fields[key] = value
54
101
  end
55
102
 
103
+ # @note (see #[])
104
+ # @param key (see #[])
56
105
  def key?(key)
57
106
  fields.key?(key)
58
107
  end
59
108
 
109
+ # :nodoc:
60
110
  def to_s
61
111
  res = ''
62
112
  res << "[#{caption}]\r\n"
63
- fields.each do |key, value|
64
- res << "#{key}=#{value}\r\n"
65
- end
113
+ res << fields.to_s
66
114
  res
67
115
  end
68
116
  end
@@ -5,5 +5,6 @@ module AssLauncher
5
5
  require 'ass_launcher/support/connection_string'
6
6
  require 'ass_launcher/support/platforms'
7
7
  require 'ass_launcher/support/shell'
8
+ require 'ass_launcher/support/linux'
8
9
  end
9
10
  end
@@ -1,3 +1,10 @@
1
1
  module AssLauncher
2
- VERSION = "0.1.1.alpha"
2
+ VERSION = "0.2.0"
3
+ module KNOWN_ENTERPRISE_VERSIONS
4
+ require 'ass_launcher/enterprise/cli_defs_loader'
5
+ extend AssLauncher::Enterprise::CliDefsLoader
6
+ def self.get
7
+ defs_versions
8
+ end
9
+ end
3
10
  end
data/lib/ass_launcher.rb CHANGED
@@ -3,4 +3,5 @@ require "ass_launcher/version"
3
3
  module AssLauncher
4
4
  require 'ass_launcher/support'
5
5
  require 'ass_launcher/enterprise'
6
+ require 'ass_launcher/api'
6
7
  end