ass_ole-app_extension 0.1.1
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.
- checksums.yaml +7 -0
- data/.gitignore +9 -0
- data/.simplecov +1 -0
- data/.travis.yml +5 -0
- data/Gemfile +6 -0
- data/README.md +109 -0
- data/Rakefile +10 -0
- data/ass_ole-app_extension.gemspec +33 -0
- data/bin/console +10 -0
- data/bin/setup +8 -0
- data/lib/ass_ole/app_extension.rb +495 -0
- data/lib/ass_ole/app_extension/version.rb +5 -0
- metadata +181 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: a1c6a67a9d81d1db124abd3a94a7ba7fe3be75d7
|
4
|
+
data.tar.gz: 4ad1a7211c3b2227f937313eef21d5742bb7c09c
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 2696afbc698d7bac05ecab348efd03fd78fa7d2943c9ec734e1a87ae28f1455faab5bde2ba80196aa9da17b34615009d044bfc8a7d47e5bb50cc4ef1626eded4
|
7
|
+
data.tar.gz: b1f536ad667c4a6ee220f7d8ec50086e40ccf564c12416b63cfd4ef2498e159a5ae0b828cbf14611b85aa529d8d7c81f93dfc8f37c32e01f7e43c305c2e90883
|
data/.gitignore
ADDED
data/.simplecov
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
SimpleCov.start if ENV['SIMPLECOV']
|
data/.travis.yml
ADDED
data/Gemfile
ADDED
data/README.md
ADDED
@@ -0,0 +1,109 @@
|
|
1
|
+
# AssOle::AppExtension
|
2
|
+
|
3
|
+
Gem for working with 1C:Enterprise `ConfigurationExtension`. Provides features
|
4
|
+
for hot plug a `ConfigurationExtension` to 1C:Enterprise application
|
5
|
+
instance (aka infobase) and some more.
|
6
|
+
|
7
|
+
## Installation
|
8
|
+
|
9
|
+
Add this line to your application's Gemfile:
|
10
|
+
|
11
|
+
```ruby
|
12
|
+
gem 'ass_ole-app_extension'
|
13
|
+
```
|
14
|
+
|
15
|
+
And then execute:
|
16
|
+
|
17
|
+
$ bundle
|
18
|
+
|
19
|
+
Or install it yourself as:
|
20
|
+
|
21
|
+
$ gem install ass_ole-app_extension
|
22
|
+
|
23
|
+
## Usage
|
24
|
+
|
25
|
+
1. Describe your extension
|
26
|
+
|
27
|
+
```ruby
|
28
|
+
require 'ass_ole/app_extension'
|
29
|
+
|
30
|
+
class FooExtension < AssOle::AppExtension::Abstract::Extension
|
31
|
+
|
32
|
+
VERSION = '1.1.1'.freeze
|
33
|
+
|
34
|
+
def path
|
35
|
+
File.expand_path '../foo_extension.cfe', __FILE__
|
36
|
+
end
|
37
|
+
|
38
|
+
# Override abstract method
|
39
|
+
# must returns WIN32OLE object(1C extension BinaryData)'
|
40
|
+
def data
|
41
|
+
newObject('BinaryData', real_win_path(path))
|
42
|
+
end
|
43
|
+
|
44
|
+
# Override abstract method
|
45
|
+
# must returns `Gem::Requirement` 1C platform version requirement
|
46
|
+
def platform_require
|
47
|
+
Gem::Requirement.new '~> 8.3.10'
|
48
|
+
end
|
49
|
+
|
50
|
+
# Override abstract method
|
51
|
+
# must returns `Hash` :1c_app_name => (Gem::Requirement|String '~> 1.2.4')
|
52
|
+
# or nil for independent extension
|
53
|
+
def app_requirements
|
54
|
+
{Accounting: '~> 3.0.56',
|
55
|
+
AccountingCorp: '~> 3.0.56'}
|
56
|
+
end
|
57
|
+
|
58
|
+
# Override abstract method
|
59
|
+
# must returns extension name
|
60
|
+
def name
|
61
|
+
'FooExtension'
|
62
|
+
end
|
63
|
+
|
64
|
+
# Override abstract method
|
65
|
+
# must returns extension version
|
66
|
+
def name
|
67
|
+
VERSION
|
68
|
+
end
|
69
|
+
end
|
70
|
+
```
|
71
|
+
|
72
|
+
2. Plug extension
|
73
|
+
|
74
|
+
```ruby
|
75
|
+
require 'ass_maintainer/info_base'
|
76
|
+
|
77
|
+
# Describe 1C application instance
|
78
|
+
ib = AssMaintainer::InfoBase.new('app_name', 'File="path"')
|
79
|
+
|
80
|
+
extension = AssOle::AppExtension.plug(ib, FooExtension, 'safe profile name')
|
81
|
+
|
82
|
+
extension.plugged? # => true
|
83
|
+
```
|
84
|
+
|
85
|
+
3. Or explore infobase extensions with `AssOle::AppExtension::Spy`
|
86
|
+
|
87
|
+
```ruby
|
88
|
+
require 'ass_maintainer/info_base'
|
89
|
+
|
90
|
+
# Describe 1C application instance
|
91
|
+
ib = AssMaintainer::InfoBase.new('app_name', 'File="path"')
|
92
|
+
|
93
|
+
# Get all extensions and check all is plugged
|
94
|
+
AssOle::AppExtension::Spy.explore(ib).each do |spy|
|
95
|
+
logger.error "#{spy.name} isn't plugged because:\n - "\
|
96
|
+
"#{spy.apply_errors.map(&:Description).join(' - ')}"\
|
97
|
+
unless spy.plugged?
|
98
|
+
end
|
99
|
+
```
|
100
|
+
|
101
|
+
## Development
|
102
|
+
|
103
|
+
After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake test` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
|
104
|
+
|
105
|
+
To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
|
106
|
+
|
107
|
+
## Contributing
|
108
|
+
|
109
|
+
Bug reports and pull requests are welcome on GitHub at https://github.com/[USERNAME]/ass_ole-app_extension.
|
data/Rakefile
ADDED
@@ -0,0 +1,33 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
lib = File.expand_path("../lib", __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
require "ass_ole/app_extension/version"
|
5
|
+
|
6
|
+
Gem::Specification.new do |spec|
|
7
|
+
spec.name = "ass_ole-app_extension"
|
8
|
+
spec.version = AssOle::AppExtension::VERSION
|
9
|
+
spec.authors = ["Leonid Vlasov"]
|
10
|
+
spec.email = ["leoniv.vlasov@gmail.com"]
|
11
|
+
|
12
|
+
spec.summary = %q{Helper for working with 1C:Enterprise ConfigurationExtension}
|
13
|
+
spec.description = %q{Features for hot plug a ConfigurationExtension to 1C:Enterprise application instance (aka infobase) and some more}
|
14
|
+
spec.homepage = "https://github.com/leoniv/ass_ole-app_extension"
|
15
|
+
|
16
|
+
spec.files = `git ls-files -z`.split("\x0").reject do |f|
|
17
|
+
f.match(%r{^(test|spec|features)/})
|
18
|
+
end
|
19
|
+
spec.bindir = "exe"
|
20
|
+
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
21
|
+
spec.require_paths = ["lib"]
|
22
|
+
|
23
|
+
spec.add_dependency 'ass_ole'
|
24
|
+
spec.add_dependency 'ass_ole-snippets-shared', '~> 0.5'
|
25
|
+
spec.add_dependency "ass_maintainer-info_base"
|
26
|
+
|
27
|
+
spec.add_development_dependency "bundler", "~> 1.15"
|
28
|
+
spec.add_development_dependency "rake", "~> 10.0"
|
29
|
+
spec.add_development_dependency "minitest", "~> 5.0"
|
30
|
+
spec.add_development_dependency "pry"
|
31
|
+
spec.add_development_dependency "simplecov"
|
32
|
+
spec.add_development_dependency "mocha"
|
33
|
+
end
|
data/bin/console
ADDED
@@ -0,0 +1,10 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require "bundler/setup"
|
4
|
+
require "ass_ole/app_extension"
|
5
|
+
|
6
|
+
# You can add fixtures and/or initialization code here to make experimenting
|
7
|
+
# with your gem easier. You can also use a different console, if you like.
|
8
|
+
|
9
|
+
require "pry"
|
10
|
+
Pry.start
|
data/bin/setup
ADDED
@@ -0,0 +1,495 @@
|
|
1
|
+
require "ass_ole/app_extension/version"
|
2
|
+
|
3
|
+
module AssOle
|
4
|
+
require 'ass_ole/snippets/shared'
|
5
|
+
# Provides features for hot plug a +ConfigurationExtension+ to 1C:Enterprise
|
6
|
+
# application instance (aka infobase) and some more.
|
7
|
+
# @example (see Abstract::Extension)
|
8
|
+
# @example (see Spy)
|
9
|
+
# @example Plug extension
|
10
|
+
# require 'ass_maintainer/info_base'
|
11
|
+
#
|
12
|
+
# # Describe 1C application instance
|
13
|
+
# ib = AssMaintainer::InfoBase.new('app_name', 'File="path"')
|
14
|
+
#
|
15
|
+
# extension = AssOle::AppExtension.plug(ib, FooExtension, 'safe profile name')
|
16
|
+
#
|
17
|
+
# extension.plugged? # => true
|
18
|
+
module AppExtension
|
19
|
+
require 'ass_ole'
|
20
|
+
|
21
|
+
class ApplyError < StandardError; end
|
22
|
+
class IncompatibleError < StandardError; end
|
23
|
+
|
24
|
+
# Namespace for abstract things
|
25
|
+
module Abstract
|
26
|
+
# @note Docs for
|
27
|
+
# mixin
|
28
|
+
# {http://www.rubydoc.info/gems/ass_ole-snippets-shared/AssOle/Snippets/Shared/AppCompatibility AssOle::Snippets::Shared::AppCompatibility}
|
29
|
+
#
|
30
|
+
# Class parent for all extensions. Define your own class and
|
31
|
+
# override methods from {Abstract::Extension::AbstractMethods}
|
32
|
+
# @example Define own extension class
|
33
|
+
# class FooExtension < AssOle::AppExtension::Abstract::Extension
|
34
|
+
#
|
35
|
+
# VERSION = '1.1.1'.freeze
|
36
|
+
#
|
37
|
+
# def path
|
38
|
+
# File.expand_path '../foo_extension.cfe', __FILE__
|
39
|
+
# end
|
40
|
+
#
|
41
|
+
# # Override abstract method
|
42
|
+
# # must returns WIN32OLE object(1C extension BinaryData)'
|
43
|
+
# def data
|
44
|
+
# newObject('BinaryData', real_win_path(path))
|
45
|
+
# end
|
46
|
+
#
|
47
|
+
# # Override abstract method
|
48
|
+
# # must returns `Gem::Requirement` 1C platform version requirement
|
49
|
+
# def platform_require
|
50
|
+
# Gem::Requirement.new '~> 8.3.10'
|
51
|
+
# end
|
52
|
+
#
|
53
|
+
# # Override abstract method
|
54
|
+
# # must returns `Hash` :1c_app_name => (Gem::Requirement|String '~> 1.2.4')
|
55
|
+
# # or nil for independent extension
|
56
|
+
# def app_requirements
|
57
|
+
# {Accounting: '~> 3.0.56',
|
58
|
+
# AccountingCorp: '~> 3.0.56'}
|
59
|
+
# end
|
60
|
+
#
|
61
|
+
# # Override abstract method
|
62
|
+
# # must returns extension name
|
63
|
+
# def name
|
64
|
+
# 'FooExtension'
|
65
|
+
# end
|
66
|
+
#
|
67
|
+
# # Override abstract method
|
68
|
+
# # must returns extension version
|
69
|
+
# def name
|
70
|
+
# VERSION
|
71
|
+
# end
|
72
|
+
# end
|
73
|
+
# @abstract
|
74
|
+
class Extension
|
75
|
+
include AssOle::Snippets::Shared::AppCompatibility
|
76
|
+
|
77
|
+
# @abstract
|
78
|
+
module AbstractMethods
|
79
|
+
# Define extension binary data.
|
80
|
+
# @example
|
81
|
+
# def path
|
82
|
+
# File.expand_path '../extension.cfe', __FILE__
|
83
|
+
# end
|
84
|
+
#
|
85
|
+
# def data
|
86
|
+
# newObject('BinaryData', real_win_path(path))
|
87
|
+
# end
|
88
|
+
# @abstract
|
89
|
+
# @return [WIN32OLE] object(1C extension BinaryData)
|
90
|
+
def data
|
91
|
+
fail NotImplementedError,
|
92
|
+
'Abstract method must returns WIN32OLE object(1C extension BinaryData)'
|
93
|
+
end
|
94
|
+
|
95
|
+
# Define platform version requirement
|
96
|
+
# @example
|
97
|
+
# def platform_require
|
98
|
+
# Gem::Requirement.new '~> 8.3.8'
|
99
|
+
# end
|
100
|
+
# @abstract
|
101
|
+
# @return [Gem::Requirement]
|
102
|
+
def platform_require
|
103
|
+
fail NotImplementedError,
|
104
|
+
'Abstract method must returns `Gem::Requirement`'
|
105
|
+
end
|
106
|
+
|
107
|
+
# Define infobase configuration requirement
|
108
|
+
# @example
|
109
|
+
# def app_requirements
|
110
|
+
# {Accounting: '~> 3.0.56', AccountingCorp: '~> 3.0.56'}
|
111
|
+
# end
|
112
|
+
# @abstract
|
113
|
+
# @return [Hash{:1c_app_name => Gem::Requirement,String} nil]
|
114
|
+
# +nil+ for independent extension
|
115
|
+
def app_requirements
|
116
|
+
fail NotImplementedError,
|
117
|
+
"Abstract method must returns `Hash`"\
|
118
|
+
" :1c_app_name => (`Gem::Requirement`|String '~> 1.2.4')"\
|
119
|
+
" or nil for independent extension"
|
120
|
+
end
|
121
|
+
|
122
|
+
# Define extension name. Must match with extension metadata name!
|
123
|
+
# @abstract
|
124
|
+
# @return [String] extension name
|
125
|
+
def name
|
126
|
+
fail NotImplementedError,
|
127
|
+
'Abstract method must returns extension name'
|
128
|
+
end
|
129
|
+
|
130
|
+
# Define extension version. Must match with extension metadata version!
|
131
|
+
# @abstract
|
132
|
+
# @return [String] extension version
|
133
|
+
def version
|
134
|
+
fail NotImplementedError,
|
135
|
+
'Abstract method must returns extension version'
|
136
|
+
end
|
137
|
+
end
|
138
|
+
|
139
|
+
include AbstractMethods
|
140
|
+
|
141
|
+
# see +ole_runtime+ of {#initialize}
|
142
|
+
attr_reader :ole_runtime
|
143
|
+
|
144
|
+
# see +safe_mode+ of {#initialize}
|
145
|
+
attr_reader :safe_mode
|
146
|
+
|
147
|
+
# @param ole_runtime [AssOle::Runtimes::App] 1C ole runtime
|
148
|
+
# @param safe_mode [true false nil String] define of safe mode for
|
149
|
+
# an extension. For more info see 1C docomentation for +SafeMode+
|
150
|
+
# property of +ConfigurationExtension+ object
|
151
|
+
def initialize(ole_runtime, safe_mode = nil)
|
152
|
+
@ole_runtime = ole_runtime
|
153
|
+
@safe_mode = safe_mode
|
154
|
+
end
|
155
|
+
|
156
|
+
# Plug extension. Do nothing if extension already plugged!
|
157
|
+
# @return [self]
|
158
|
+
# @raise (see can_apply?)
|
159
|
+
# @raise (see #verify!)
|
160
|
+
def plug
|
161
|
+
return self if plugged?
|
162
|
+
verify!
|
163
|
+
can_apply? && unsafe_mode_set.Write(data)
|
164
|
+
self
|
165
|
+
end
|
166
|
+
alias_method :write, :plug
|
167
|
+
|
168
|
+
# Force plug without check {#plugged?}, {#verify!} and {#can_apply?}
|
169
|
+
# @return [self]
|
170
|
+
def plug!
|
171
|
+
unsafe_mode_set.Write(data)
|
172
|
+
self
|
173
|
+
end
|
174
|
+
alias_method :write!, :plug!
|
175
|
+
|
176
|
+
# Unplug extension. Do nothing unless extension plugged.
|
177
|
+
# @return [self]
|
178
|
+
def unplug!
|
179
|
+
return self unless exist?
|
180
|
+
ole.Delete
|
181
|
+
self
|
182
|
+
end
|
183
|
+
alias_method :delete!, :unplug!
|
184
|
+
|
185
|
+
def unsafe_mode_get
|
186
|
+
r = newObject('UnsafeOperationProtectionDescription')
|
187
|
+
r.UnsafeOperationWarnings = false
|
188
|
+
r
|
189
|
+
end
|
190
|
+
private :unsafe_mode_get
|
191
|
+
|
192
|
+
def unsafe_mode_set
|
193
|
+
if ole.ole_respond_to? :UnsafeActionProtection
|
194
|
+
ole.UnsafeActionProtection = unsafe_mode_get
|
195
|
+
end
|
196
|
+
|
197
|
+
if ole.ole_respond_to? :SafeMode
|
198
|
+
ole.SafeMode = safe_mode unless safe_mode.nil?
|
199
|
+
end
|
200
|
+
ole
|
201
|
+
end
|
202
|
+
private :unsafe_mode_set
|
203
|
+
|
204
|
+
# Critical +ConfigurationExtensionApplicationIssueInformation+.
|
205
|
+
# If you have such problems, extension will not be connected.
|
206
|
+
# @return [Array<WIN32OLE>]
|
207
|
+
# +ConfigurationExtensionApplicationIssueInformation+
|
208
|
+
def apply_errors
|
209
|
+
apply_errors_get(data)
|
210
|
+
end
|
211
|
+
|
212
|
+
# Not critical +ConfigurationExtensionApplicationIssueInformation+.
|
213
|
+
# If you have such problems, extension will be connected.
|
214
|
+
# @return (see #apply_errors)
|
215
|
+
def apply_warnings
|
216
|
+
apply_problems_get(data).select do |problem|
|
217
|
+
(sTring(problem.Severity) =~ %r{(Критичная|Critical)}).nil?
|
218
|
+
end
|
219
|
+
end
|
220
|
+
|
221
|
+
def apply_problems_get(ext_data)
|
222
|
+
r = []
|
223
|
+
ole.CheckCanApply(ext_data, false).each do |problem|
|
224
|
+
r << problem
|
225
|
+
end
|
226
|
+
r
|
227
|
+
end
|
228
|
+
private :apply_problems_get
|
229
|
+
|
230
|
+
def apply_errors_get(ext_data)
|
231
|
+
apply_problems_get(ext_data).select do |problem|
|
232
|
+
sTring(problem.Severity) =~ %r{(Критичная|Critical)}
|
233
|
+
end
|
234
|
+
end
|
235
|
+
private :apply_problems_get
|
236
|
+
|
237
|
+
# Checks the possibility plugging extension
|
238
|
+
# @raise [ApplyError] if {#apply_errors} isn't empty
|
239
|
+
def can_apply?
|
240
|
+
errors = apply_errors
|
241
|
+
fail ApplyError, "Extension can't be applied:\n"\
|
242
|
+
" - #{errors.map(&:Description).join("\n - ")} " if\
|
243
|
+
errors.size > 0
|
244
|
+
true
|
245
|
+
end
|
246
|
+
|
247
|
+
# Return +true+ if extension stored in infobase
|
248
|
+
def exist?
|
249
|
+
!find_exists.nil?
|
250
|
+
end
|
251
|
+
|
252
|
+
# Return +true+ if extension {#exist?} and stored data can be applyed
|
253
|
+
# without errors
|
254
|
+
def plugged?
|
255
|
+
exist? && apply_errors_get(ole.GetData).size == 0
|
256
|
+
end
|
257
|
+
|
258
|
+
def find_exists
|
259
|
+
r = all_extensions.select {|ext| ext.Name =~ /^#{name}$/i}
|
260
|
+
fail "Too many #{r.size} extension `#{name}` found" if r.size > 1
|
261
|
+
r[0]
|
262
|
+
end
|
263
|
+
private :find_exists
|
264
|
+
|
265
|
+
def manager
|
266
|
+
configurationExtensions
|
267
|
+
end
|
268
|
+
private :manager
|
269
|
+
|
270
|
+
# Array of all application extensions.
|
271
|
+
# @return [Array<WIN32OLE>] +ConfigurationExtension+
|
272
|
+
def all_extensions
|
273
|
+
r = []
|
274
|
+
manager.Get.each do |ext|
|
275
|
+
r << ext
|
276
|
+
end
|
277
|
+
r
|
278
|
+
end
|
279
|
+
|
280
|
+
def ole_get
|
281
|
+
return find_exists if exist?
|
282
|
+
manager.Create
|
283
|
+
end
|
284
|
+
private :ole_get
|
285
|
+
|
286
|
+
# Extension ole object.
|
287
|
+
# @return [WIN32OLE] +ConfigurationExtension+
|
288
|
+
def ole
|
289
|
+
@ole ||= ole_get
|
290
|
+
end
|
291
|
+
|
292
|
+
# @return 1C ole connector
|
293
|
+
def ole_connector
|
294
|
+
ole_runtime.ole_connector
|
295
|
+
end
|
296
|
+
|
297
|
+
# @raise [IncompatibleError] if extension is incompatible
|
298
|
+
def verify!
|
299
|
+
verify_version_compatibility!
|
300
|
+
verify_application!
|
301
|
+
end
|
302
|
+
|
303
|
+
# @return [String] application configuration name +metaData.Name+
|
304
|
+
def app_name
|
305
|
+
metaData.Name
|
306
|
+
end
|
307
|
+
|
308
|
+
# @return [Gem::Version]
|
309
|
+
# application configuration version +metaData.Version+
|
310
|
+
def app_version
|
311
|
+
Gem::Version.new(metaData.Version)
|
312
|
+
end
|
313
|
+
|
314
|
+
# @api private
|
315
|
+
def verify_version_compatibility!
|
316
|
+
fail IncompatibleError, "Require application compatibility "\
|
317
|
+
"`#{platform_require}`. Got application compatibility version"\
|
318
|
+
" `#{app_compatibility_version}`" unless\
|
319
|
+
platform_require.satisfied_by? app_compatibility_version
|
320
|
+
end
|
321
|
+
|
322
|
+
# @api private
|
323
|
+
def verify_application!
|
324
|
+
return unless app_requirements
|
325
|
+
|
326
|
+
req = app_requirements[app_name.to_sym]
|
327
|
+
|
328
|
+
fail IncompatibleError, "Unsupported application `#{app_name}`."\
|
329
|
+
" Supported:\n - #{app_requirements.keys.join("\n - ")}" unless req
|
330
|
+
|
331
|
+
fail IncompatibleError, 'Unsupported application version'\
|
332
|
+
" `#{app_version}`. Require version #{req}" unless\
|
333
|
+
Gem::Requirement.new(req).satisfied_by? app_version
|
334
|
+
end
|
335
|
+
|
336
|
+
# Save actual stored extension data to file
|
337
|
+
# @param dir [String] directory where file will be writed
|
338
|
+
# @return [String] file name
|
339
|
+
def save_stored_data(dir)
|
340
|
+
return unless exist?
|
341
|
+
file = File.join(dir, "#{name}.#{Gem::Version.new(ole.Version)}.cfe")
|
342
|
+
ole.GetData.Write(real_win_path(file))
|
343
|
+
file
|
344
|
+
end
|
345
|
+
end
|
346
|
+
end
|
347
|
+
|
348
|
+
# Class for explore exists infobase extensions.
|
349
|
+
# @example Explore infobase extensions
|
350
|
+
# require 'ass_maintainer/info_base'
|
351
|
+
#
|
352
|
+
# # Describe 1C application instance
|
353
|
+
# ib = AssMaintainer::InfoBase.new('app_name', 'File="path"')
|
354
|
+
#
|
355
|
+
# # Get all extensions and check all is plugged
|
356
|
+
# AssOle::AppExtension::Spy.explore(ib).each do |spy|
|
357
|
+
# logger.error "#{spy.name} isn't plugged because:\n - "\
|
358
|
+
# "#{spy.apply_errors.map(&:Description).join(' - ')}"\
|
359
|
+
# unless spy.plugged?
|
360
|
+
# end
|
361
|
+
class Spy < Abstract::Extension
|
362
|
+
# @param ole_runtime (see Abstract::Extension#initialize)
|
363
|
+
# @param ole [WIN32OLE] +ConfigurationExtension+ object
|
364
|
+
# @api private
|
365
|
+
def initialize(ole_runtime, ole)
|
366
|
+
@ole_runtime = ole_runtime
|
367
|
+
@ole = ole
|
368
|
+
end
|
369
|
+
|
370
|
+
def ole_get
|
371
|
+
@ole
|
372
|
+
end
|
373
|
+
private :ole_get
|
374
|
+
|
375
|
+
# (see Abstract::Extension#ole)
|
376
|
+
def ole
|
377
|
+
@ole
|
378
|
+
end
|
379
|
+
|
380
|
+
# Do nothing.
|
381
|
+
# @return [self]
|
382
|
+
def plug!
|
383
|
+
self
|
384
|
+
end
|
385
|
+
|
386
|
+
# Do nothing
|
387
|
+
# @return [self]
|
388
|
+
def unplug!
|
389
|
+
self
|
390
|
+
end
|
391
|
+
|
392
|
+
# Do nothing
|
393
|
+
# @return [self]
|
394
|
+
def verify!
|
395
|
+
self
|
396
|
+
end
|
397
|
+
|
398
|
+
# Return {#ole} +Name+ property
|
399
|
+
# @return [String]
|
400
|
+
def name
|
401
|
+
ole.Name
|
402
|
+
end
|
403
|
+
|
404
|
+
# Return {#ole} +GetData+
|
405
|
+
# @return [WIN32OLE] stored +BinaryData+
|
406
|
+
def data
|
407
|
+
ole.GetData
|
408
|
+
end
|
409
|
+
|
410
|
+
# @return ['~> 0'] permanent
|
411
|
+
def platform_require
|
412
|
+
Gem::Requirement.new '~> 0'
|
413
|
+
end
|
414
|
+
|
415
|
+
# @return [nil] permanent
|
416
|
+
def app_requirements
|
417
|
+
nil
|
418
|
+
end
|
419
|
+
|
420
|
+
# Do nothing.
|
421
|
+
# @return {#ole}
|
422
|
+
def unsafe_mode_set
|
423
|
+
ole
|
424
|
+
end
|
425
|
+
private :unsafe_mode_set
|
426
|
+
|
427
|
+
# Returns all extensions stored in +info_base+
|
428
|
+
# @return [Array<Spy>]
|
429
|
+
def self.explore(info_base)
|
430
|
+
spy = Plug.new(info_base).new_ext(Spy, nil)
|
431
|
+
spy.all_extensions.map do |ole|
|
432
|
+
Spy.new(spy.ole_runtime, ole)
|
433
|
+
end
|
434
|
+
end
|
435
|
+
end
|
436
|
+
|
437
|
+
# @api private
|
438
|
+
module Plug
|
439
|
+
attr_reader :info_base
|
440
|
+
|
441
|
+
# @api private
|
442
|
+
# @param info_base [AssMaintainer::InfoBase] instance
|
443
|
+
def initialize(info_base)
|
444
|
+
@info_base = info_base
|
445
|
+
ole_runtime_get.run info_base
|
446
|
+
end
|
447
|
+
|
448
|
+
# Make new +ext_klass+ plugged instance
|
449
|
+
# @api private
|
450
|
+
# @param safe_mode (see #new_ext)
|
451
|
+
# @param ext_klass (see #new_ext)
|
452
|
+
# @return (see Abstract::Extension#plug)
|
453
|
+
def exec(ext_klass, safe_mode)
|
454
|
+
new_ext(ext_klass, safe_mode).plug
|
455
|
+
end
|
456
|
+
|
457
|
+
# Make new +ext_klass+ instance
|
458
|
+
# @api private
|
459
|
+
# @param safe_mode
|
460
|
+
# (see AssOle::AppExtension::Abstract::Extension#initialize)
|
461
|
+
# @param ext_klass [Class] childe of
|
462
|
+
# {AssOle::AppExtension::Abstract::Extension}
|
463
|
+
# @return [ext_klass] instance
|
464
|
+
def new_ext(ext_klass, safe_mode)
|
465
|
+
ext_klass.new(self, safe_mode)
|
466
|
+
end
|
467
|
+
|
468
|
+
# @api private
|
469
|
+
def self.external_runtime_get
|
470
|
+
Module.new do
|
471
|
+
is_ole_runtime :external
|
472
|
+
end
|
473
|
+
end
|
474
|
+
|
475
|
+
# @param info_base (see Plug#initialize)
|
476
|
+
def self.new(info_base)
|
477
|
+
inst = Class.new do
|
478
|
+
like_ole_runtime Plug.external_runtime_get
|
479
|
+
include Plug
|
480
|
+
end.new(info_base)
|
481
|
+
yield inst if block_given?
|
482
|
+
inst
|
483
|
+
end
|
484
|
+
end
|
485
|
+
|
486
|
+
# Plug extension to +info_base+
|
487
|
+
# @param info_base (see Plug#initialize)
|
488
|
+
# @param ext_klass (see Plug#exec)
|
489
|
+
# @param safe_mode (see Plug#exec)
|
490
|
+
# @return (see Plug#exec)
|
491
|
+
def self.plug(info_base, ext_klass, safe_mode = true)
|
492
|
+
Plug.new(info_base).exec(ext_klass, safe_mode)
|
493
|
+
end
|
494
|
+
end
|
495
|
+
end
|
metadata
ADDED
@@ -0,0 +1,181 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: ass_ole-app_extension
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Leonid Vlasov
|
8
|
+
autorequire:
|
9
|
+
bindir: exe
|
10
|
+
cert_chain: []
|
11
|
+
date: 2017-12-29 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: ass_ole
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ">="
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '0'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ">="
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: ass_ole-snippets-shared
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0.5'
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0.5'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: ass_maintainer-info_base
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - ">="
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0'
|
48
|
+
type: :runtime
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ">="
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: bundler
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - "~>"
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '1.15'
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - "~>"
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '1.15'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: rake
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - "~>"
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '10.0'
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - "~>"
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '10.0'
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: minitest
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - "~>"
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: '5.0'
|
90
|
+
type: :development
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - "~>"
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: '5.0'
|
97
|
+
- !ruby/object:Gem::Dependency
|
98
|
+
name: pry
|
99
|
+
requirement: !ruby/object:Gem::Requirement
|
100
|
+
requirements:
|
101
|
+
- - ">="
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
version: '0'
|
104
|
+
type: :development
|
105
|
+
prerelease: false
|
106
|
+
version_requirements: !ruby/object:Gem::Requirement
|
107
|
+
requirements:
|
108
|
+
- - ">="
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: '0'
|
111
|
+
- !ruby/object:Gem::Dependency
|
112
|
+
name: simplecov
|
113
|
+
requirement: !ruby/object:Gem::Requirement
|
114
|
+
requirements:
|
115
|
+
- - ">="
|
116
|
+
- !ruby/object:Gem::Version
|
117
|
+
version: '0'
|
118
|
+
type: :development
|
119
|
+
prerelease: false
|
120
|
+
version_requirements: !ruby/object:Gem::Requirement
|
121
|
+
requirements:
|
122
|
+
- - ">="
|
123
|
+
- !ruby/object:Gem::Version
|
124
|
+
version: '0'
|
125
|
+
- !ruby/object:Gem::Dependency
|
126
|
+
name: mocha
|
127
|
+
requirement: !ruby/object:Gem::Requirement
|
128
|
+
requirements:
|
129
|
+
- - ">="
|
130
|
+
- !ruby/object:Gem::Version
|
131
|
+
version: '0'
|
132
|
+
type: :development
|
133
|
+
prerelease: false
|
134
|
+
version_requirements: !ruby/object:Gem::Requirement
|
135
|
+
requirements:
|
136
|
+
- - ">="
|
137
|
+
- !ruby/object:Gem::Version
|
138
|
+
version: '0'
|
139
|
+
description: Features for hot plug a ConfigurationExtension to 1C:Enterprise application
|
140
|
+
instance (aka infobase) and some more
|
141
|
+
email:
|
142
|
+
- leoniv.vlasov@gmail.com
|
143
|
+
executables: []
|
144
|
+
extensions: []
|
145
|
+
extra_rdoc_files: []
|
146
|
+
files:
|
147
|
+
- ".gitignore"
|
148
|
+
- ".simplecov"
|
149
|
+
- ".travis.yml"
|
150
|
+
- Gemfile
|
151
|
+
- README.md
|
152
|
+
- Rakefile
|
153
|
+
- ass_ole-app_extension.gemspec
|
154
|
+
- bin/console
|
155
|
+
- bin/setup
|
156
|
+
- lib/ass_ole/app_extension.rb
|
157
|
+
- lib/ass_ole/app_extension/version.rb
|
158
|
+
homepage: https://github.com/leoniv/ass_ole-app_extension
|
159
|
+
licenses: []
|
160
|
+
metadata: {}
|
161
|
+
post_install_message:
|
162
|
+
rdoc_options: []
|
163
|
+
require_paths:
|
164
|
+
- lib
|
165
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
166
|
+
requirements:
|
167
|
+
- - ">="
|
168
|
+
- !ruby/object:Gem::Version
|
169
|
+
version: '0'
|
170
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
171
|
+
requirements:
|
172
|
+
- - ">="
|
173
|
+
- !ruby/object:Gem::Version
|
174
|
+
version: '0'
|
175
|
+
requirements: []
|
176
|
+
rubyforge_project:
|
177
|
+
rubygems_version: 2.6.13
|
178
|
+
signing_key:
|
179
|
+
specification_version: 4
|
180
|
+
summary: Helper for working with 1C:Enterprise ConfigurationExtension
|
181
|
+
test_files: []
|