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