legionio 0.3.2 → 0.3.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (90) hide show
  1. checksums.yaml +4 -4
  2. metadata +4 -94
  3. data/.circleci/config.yml +0 -119
  4. data/.gitignore +0 -14
  5. data/.rspec +0 -2
  6. data/.rubocop.yml +0 -89
  7. data/CHANGELOG.md +0 -16
  8. data/Gemfile +0 -3
  9. data/LICENSE.txt +0 -21
  10. data/README.md +0 -49
  11. data/Rakefile +0 -38
  12. data/bin/console +0 -16
  13. data/bin/legion +0 -49
  14. data/bin/setup +0 -8
  15. data/bin/test +0 -32
  16. data/bitbucket-pipelines.yml +0 -55
  17. data/docs/Makefile +0 -20
  18. data/docs/_build/doctrees/environment.pickle +0 -0
  19. data/docs/_build/doctrees/index.doctree +0 -0
  20. data/docs/_build/doctrees/overview.doctree +0 -0
  21. data/docs/_build/html/.buildinfo +0 -4
  22. data/docs/_build/html/_sources/index.rst.txt +0 -28
  23. data/docs/_build/html/_sources/overview.rst.txt +0 -0
  24. data/docs/_build/html/_static/alabaster.css +0 -701
  25. data/docs/_build/html/_static/basic.css +0 -855
  26. data/docs/_build/html/_static/custom.css +0 -1
  27. data/docs/_build/html/_static/doctools.js +0 -315
  28. data/docs/_build/html/_static/documentation_options.js +0 -12
  29. data/docs/_build/html/_static/file.png +0 -0
  30. data/docs/_build/html/_static/jquery-3.5.1.js +0 -10872
  31. data/docs/_build/html/_static/jquery.js +0 -2
  32. data/docs/_build/html/_static/language_data.js +0 -297
  33. data/docs/_build/html/_static/minus.png +0 -0
  34. data/docs/_build/html/_static/plus.png +0 -0
  35. data/docs/_build/html/_static/pygments.css +0 -82
  36. data/docs/_build/html/_static/searchtools.js +0 -514
  37. data/docs/_build/html/_static/underscore-1.3.1.js +0 -999
  38. data/docs/_build/html/_static/underscore.js +0 -31
  39. data/docs/_build/html/genindex.html +0 -101
  40. data/docs/_build/html/index.html +0 -117
  41. data/docs/_build/html/objects.inv +0 -6
  42. data/docs/_build/html/overview.html +0 -98
  43. data/docs/_build/html/search.html +0 -110
  44. data/docs/_build/html/searchindex.js +0 -1
  45. data/docs/conf.py +0 -54
  46. data/docs/index.rst +0 -28
  47. data/docs/make.bat +0 -35
  48. data/exe/legion +0 -52
  49. data/legion.gemspec +0 -59
  50. data/lib/legion.rb +0 -21
  51. data/lib/legion/exceptions/handled_task.rb +0 -6
  52. data/lib/legion/exceptions/invalidjson.rb +0 -5
  53. data/lib/legion/exceptions/missingargument.rb +0 -6
  54. data/lib/legion/exceptions/wrongtype.rb +0 -10
  55. data/lib/legion/exceptions/wrongtypes/array.rb +0 -8
  56. data/lib/legion/exceptions/wrongtypes/hash.rb +0 -8
  57. data/lib/legion/exceptions/wrongtypes/integer.rb +0 -8
  58. data/lib/legion/exceptions/wrongtypes/string.rb +0 -8
  59. data/lib/legion/extensions.rb +0 -185
  60. data/lib/legion/extensions/actors/base.rb +0 -49
  61. data/lib/legion/extensions/actors/every.rb +0 -48
  62. data/lib/legion/extensions/actors/loop.rb +0 -32
  63. data/lib/legion/extensions/actors/nothing.rb +0 -15
  64. data/lib/legion/extensions/actors/once.rb +0 -40
  65. data/lib/legion/extensions/actors/poll.rb +0 -88
  66. data/lib/legion/extensions/actors/subscription.rb +0 -138
  67. data/lib/legion/extensions/builders/actors.rb +0 -61
  68. data/lib/legion/extensions/builders/base.rb +0 -36
  69. data/lib/legion/extensions/builders/helpers.rb +0 -24
  70. data/lib/legion/extensions/builders/runners.rb +0 -58
  71. data/lib/legion/extensions/core.rb +0 -126
  72. data/lib/legion/extensions/data.rb +0 -58
  73. data/lib/legion/extensions/data/migrator.rb +0 -28
  74. data/lib/legion/extensions/data/model.rb +0 -8
  75. data/lib/legion/extensions/helpers/base.rb +0 -82
  76. data/lib/legion/extensions/helpers/cache.rb +0 -23
  77. data/lib/legion/extensions/helpers/core.rb +0 -41
  78. data/lib/legion/extensions/helpers/data.rb +0 -23
  79. data/lib/legion/extensions/helpers/lex.rb +0 -48
  80. data/lib/legion/extensions/helpers/logger.rb +0 -47
  81. data/lib/legion/extensions/helpers/task.rb +0 -60
  82. data/lib/legion/extensions/helpers/transport.rb +0 -44
  83. data/lib/legion/extensions/transport.rb +0 -159
  84. data/lib/legion/process.rb +0 -124
  85. data/lib/legion/runner.rb +0 -55
  86. data/lib/legion/runner/log.rb +0 -10
  87. data/lib/legion/runner/status.rb +0 -69
  88. data/lib/legion/service.rb +0 -99
  89. data/lib/legion/supervision.rb +0 -15
  90. data/lib/legion/version.rb +0 -3
@@ -1 +0,0 @@
1
- Search.setIndex({docnames:["index","overview"],envversion:{"sphinx.domains.c":2,"sphinx.domains.changeset":1,"sphinx.domains.citation":1,"sphinx.domains.cpp":3,"sphinx.domains.index":1,"sphinx.domains.javascript":2,"sphinx.domains.math":2,"sphinx.domains.python":2,"sphinx.domains.rst":2,"sphinx.domains.std":1,sphinx:56},filenames:["index.rst","overview.rst"],objects:{},objnames:{},objtypes:{},terms:{"class":0,"function":0,These:0,acknowledg:0,action:0,add:0,ani:0,call:0,can:0,chain:0,cluster:0,complex:0,connect:0,contain:0,content:[],creat:0,delet:0,design:0,exampl:0,extens:0,foobar:[],get:0,incid:0,index:[],input:0,instal:0,legion:0,lex:0,list:0,make:0,merg:0,modul:[],more:0,out:0,output:0,page:[],pagerduti:0,platform:0,project:0,relationship:0,resolv:0,runner:0,search:[],second:[],servic:0,them:0,thi:[],thing:0,think:0,trigger:0,updat:0,user:0,whatev:0,which:0,within:0,without:0,work:0,workflow:0,yaml:0,you:0,your:0},titles:["LegionIO Overview","<no title>"],titleterms:{about:0,document:[],indic:[],legionio:0,overview:0,tabl:[],test3:[],test:[],welcom:[]}})
@@ -1,54 +0,0 @@
1
- # Configuration file for the Sphinx documentation builder.
2
- #
3
- # This file only contains a selection of the most common options. For a full
4
- # list see the documentation:
5
- # https://www.sphinx-doc.org/en/master/usage/configuration.html
6
-
7
- # -- Path setup --------------------------------------------------------------
8
-
9
- # If extensions (or modules to document with autodoc) are in another directory,
10
- # add these directories to sys.path here. If the directory is relative to the
11
- # documentation root, use os.path.abspath to make it absolute, like shown here.
12
- #
13
- # import os
14
- # import sys
15
- # sys.path.insert(0, os.path.abspath('.'))
16
-
17
-
18
- # -- Project information -----------------------------------------------------
19
-
20
- project = 'LegionIO'
21
- copyright = '2020, Esity'
22
- author = 'Esity'
23
-
24
- # The full version, including alpha/beta/rc tags
25
- release = '0.3.1'
26
-
27
-
28
- # -- General configuration ---------------------------------------------------
29
-
30
- # Add any Sphinx extension module names here, as strings. They can be
31
- # extensions coming with Sphinx (named 'sphinx.ext.*') or your custom
32
- # ones.
33
- extensions = ['recommonmark']
34
-
35
- # Add any paths that contain templates here, relative to this directory.
36
- templates_path = ['_templates']
37
-
38
- # List of patterns, relative to source directory, that match files and
39
- # directories to ignore when looking for source files.
40
- # This pattern also affects html_static_path and html_extra_path.
41
- exclude_patterns = ['_build', 'Thumbs.db', '.DS_Store']
42
-
43
-
44
- # -- Options for HTML output -------------------------------------------------
45
-
46
- # The theme to use for HTML and HTML Help pages. See the documentation for
47
- # a list of builtin themes.
48
- #
49
- html_theme = 'alabaster'
50
-
51
- # Add any paths that contain custom static files (such as style sheets) here,
52
- # relative to this directory. They are copied after the builtin static files,
53
- # so a file named "default.css" will overwrite the builtin "default.css".
54
- html_static_path = ['_static']
@@ -1,28 +0,0 @@
1
- .. LegionIO documentation master file, created by
2
- sphinx-quickstart on Thu Oct 15 08:16:27 2020.
3
- You can adapt this file completely to your liking, but it should at least
4
- contain the root `toctree` directive.
5
-
6
- LegionIO Overview
7
- ==============================
8
-
9
- About
10
- ------------
11
- LegionIO is a platform designed for connecting things. You install a LEX(Legion Extension)
12
- which adds functionality to your Legion service?project?cluster? Whatever it's called.
13
-
14
- A LEX contains 1 or more runners. Think of them as classes
15
- A runner contains 1 or more functions. These are the things you can call and make relationships out of
16
- Example
17
-
18
- * Lex: pagerduty
19
-
20
- * Runners: incident, user, service
21
-
22
- * Functions within the incident runner: trigger, acknowledge, resolve, merge
23
-
24
- * Functions within the services runner: create, delete, update, list, get
25
-
26
- Any function can be a trigger or an action(the input or output in the relationship).
27
-
28
- Legion works by creating chains of relationships to make make a complex workflow without complex yaml
@@ -1,35 +0,0 @@
1
- @ECHO OFF
2
-
3
- pushd %~dp0
4
-
5
- REM Command file for Sphinx documentation
6
-
7
- if "%SPHINXBUILD%" == "" (
8
- set SPHINXBUILD=sphinx-build
9
- )
10
- set SOURCEDIR=.
11
- set BUILDDIR=_build
12
-
13
- if "%1" == "" goto help
14
-
15
- %SPHINXBUILD% >NUL 2>NUL
16
- if errorlevel 9009 (
17
- echo.
18
- echo.The 'sphinx-build' command was not found. Make sure you have Sphinx
19
- echo.installed, then set the SPHINXBUILD environment variable to point
20
- echo.to the full path of the 'sphinx-build' executable. Alternatively you
21
- echo.may add the Sphinx directory to PATH.
22
- echo.
23
- echo.If you don't have Sphinx installed, grab it from
24
- echo.http://sphinx-doc.org/
25
- exit /b 1
26
- )
27
-
28
- %SPHINXBUILD% -M %1 %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O%
29
- goto end
30
-
31
- :help
32
- %SPHINXBUILD% -M help %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O%
33
-
34
- :end
35
- popd
data/exe/legion DELETED
@@ -1,52 +0,0 @@
1
- #!/usr/bin/env ruby
2
- # frozen_string_literal: true
3
-
4
- require 'optparse'
5
-
6
- options = { action: :run }
7
-
8
- daemonize_help = 'run daemonized in the background (default: false)'
9
- pidfile_help = 'the pid filename'
10
- logfile_help = 'the log filename'
11
- include_help = 'an additional $LOAD_PATH (may be used more than once)'
12
- debug_help = 'set $DEBUG to true'
13
- warn_help = 'enable warnings'
14
- time_help = 'only run legion for X seconds'
15
-
16
- op = OptionParser.new
17
- op.banner = 'An example of how to daemonize a long running Ruby process.'
18
- op.separator ''
19
- op.separator 'Usage: server [options]'
20
- op.separator ''
21
-
22
- op.separator ''
23
- op.separator 'Process options:'
24
- op.on('-d', '--daemonize', daemonize_help) { options[:daemonize] = true }
25
- op.on('-p', '--pid PIDFILE', pidfile_help) { |value| options[:pidfile] = value }
26
- op.on('-l', '--log LOGFILE', logfile_help) { |value| options[:logfile] = value }
27
- op.on('-t', '--time 10', time_help) { |value| options[:time_limit] = value }
28
-
29
- op.separator ''
30
- op.separator 'Ruby options:'
31
- op.on('-I', '--include PATH', include_help) do |value|
32
- $LOAD_PATH.unshift(*value.split(':').map do |v|
33
- File.expand_path(v)
34
- end)
35
- end
36
- op.on('--debug', debug_help) { $DEBUG = true }
37
- op.on('--warn', warn_help) { $-w = true }
38
-
39
- op.separator ''
40
- op.separator 'Common options:'
41
- op.on('-h', '--help') { options[:action] = :help }
42
- op.on('-v', '--version') { options[:action] = :version }
43
-
44
- op.separator ''
45
- op.parse!(ARGV)
46
-
47
- unless options[:action] == :help
48
- require 'legion'
49
- Legion.start
50
- require 'legion/process'
51
- Legion::Process.new(options).run!
52
- end
@@ -1,59 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- lib = File.expand_path('lib', __dir__)
4
- $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
5
- require 'legion/version'
6
-
7
- Gem::Specification.new do |spec|
8
- spec.name = (RUBY_ENGINE == 'jruby' ? 'legionio-java' : 'legionio')
9
- spec.version = Legion::VERSION
10
- spec.authors = ['Esity']
11
- spec.email = ['matthewdiverson@gmail.com']
12
-
13
- spec.summary = 'Legion Core Software to string it all together'
14
- spec.description = 'Legion Core runs Legion Framwork'
15
- spec.homepage = 'https://bitbucket.org/legion-io/legion/'
16
- spec.license = 'MIT'
17
- spec.required_ruby_version = '>= 2.5.0'
18
-
19
- spec.files = `git ls-files -z`.split("\x0").reject do |f|
20
- f.match(%r{^(test|spec|features)/})
21
- end
22
- spec.bindir = 'exe'
23
- spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
24
- spec.require_paths = ['lib']
25
-
26
- if RUBY_ENGINE == 'jruby'
27
- spec.add_dependency 'jrjackson'
28
- spec.add_dependency 'legion-data-java'
29
- spec.add_dependency 'legion-transport-java'
30
- spec.add_dependency 'march_hare'
31
- else
32
- spec.add_dependency 'concurrent-ruby-ext'
33
- spec.add_dependency 'legion-data'
34
- spec.add_dependency 'legion-transport'
35
- spec.add_dependency 'oj'
36
- end
37
-
38
- spec.add_dependency 'concurrent-ruby'
39
- spec.add_dependency 'daemons'
40
- spec.add_dependency 'hashdiff'
41
-
42
- spec.add_dependency 'bunny'
43
- spec.add_dependency 'legion-cache'
44
- spec.add_dependency 'legion-crypt'
45
- spec.add_dependency 'legion-exceptions'
46
- spec.add_dependency 'legion-json'
47
- spec.add_dependency 'legion-logging'
48
- spec.add_dependency 'legion-settings'
49
-
50
- spec.add_dependency 'lex-node'
51
-
52
- spec.add_development_dependency 'bundler'
53
- spec.add_development_dependency 'codecov'
54
- spec.add_development_dependency 'rake'
55
- spec.add_development_dependency 'rspec'
56
- spec.add_development_dependency 'rspec_junit_formatter'
57
- spec.add_development_dependency 'rubocop'
58
- spec.add_development_dependency 'simplecov'
59
- end
@@ -1,21 +0,0 @@
1
- Process.setproctitle('Legion')
2
- require 'concurrent'
3
- require 'securerandom'
4
- require 'legion/exceptions'
5
- require 'legion/version'
6
- require 'legion/process'
7
- require 'legion/service'
8
- require 'legion/extensions'
9
-
10
- module Legion
11
- attr_reader :service
12
-
13
- def self.start
14
- @service = Legion::Service.new
15
- Legion::Logging.info("Started Legion v#{Legion::VERSION}")
16
- end
17
-
18
- def self.shutdown
19
- @service.shutdown
20
- end
21
- end
@@ -1,6 +0,0 @@
1
- module Legion
2
- module Exception
3
- class HandledTask < StandardError
4
- end
5
- end
6
- end
@@ -1,5 +0,0 @@
1
- module Legion
2
- module Exception
3
- class InvalidJson < StandardError; end
4
- end
5
- end
@@ -1,6 +0,0 @@
1
- module Legion
2
- module Exception
3
- class MissingArgument < StandardError
4
- end
5
- end
6
- end
@@ -1,10 +0,0 @@
1
- require_relative 'wrongtypes/array'
2
- require_relative 'wrongtypes/hash'
3
- require_relative 'wrongtypes/integer'
4
- require_relative 'wrongtypes/string'
5
-
6
- module Legion
7
- module Exception
8
- class WrongType < StandardError; end
9
- end
10
- end
@@ -1,8 +0,0 @@
1
- module Legion
2
- module Exception
3
- module WrongType
4
- class Array < TypeError
5
- end
6
- end
7
- end
8
- end
@@ -1,8 +0,0 @@
1
- module Legion
2
- module Exception
3
- module WrongType
4
- class Hash < TypeError
5
- end
6
- end
7
- end
8
- end
@@ -1,8 +0,0 @@
1
- module Legion
2
- module Exception
3
- module WrongType
4
- class Integer < TypeError
5
- end
6
- end
7
- end
8
- end
@@ -1,8 +0,0 @@
1
- module Legion
2
- module Exception
3
- module WrongType
4
- class String < TypeError
5
- end
6
- end
7
- end
8
- end
@@ -1,185 +0,0 @@
1
- require 'legion/extensions/core'
2
- require 'legion/runner'
3
-
4
- module Legion
5
- module Extensions
6
- class << self
7
- def setup
8
- hook_extensions
9
- end
10
-
11
- def hook_extensions
12
- @timer_tasks = []
13
- @loop_tasks = []
14
- @once_tasks = []
15
- @poll_tasks = []
16
- @subscription_tasks = []
17
- @actors = []
18
-
19
- find_extensions
20
- load_extensions
21
- end
22
-
23
- def shutdown
24
- return nil if @loaded_extensions.nil?
25
-
26
- @subscription_tasks.each do |task|
27
- task[:threadpool].shutdown
28
- task[:threadpool].kill unless task[:threadpool].wait_for_termination(5)
29
- end
30
-
31
- @loop_tasks.each { |task| task[:running_class].cancel if task[:running_class].respond_to?(:cancel) }
32
- @once_tasks.each { |task| task[:running_class].cancel if task[:running_class].respond_to?(:cancel) }
33
- @timer_tasks.each { |task| task[:running_class].cancel if task[:running_class].respond_to?(:cancel) }
34
- @poll_tasks.each { |task| task[:running_class].cancel if task[:running_class].respond_to?(:cancel) }
35
-
36
- Legion::Logging.info 'Successfully shut down all actors'
37
- end
38
-
39
- def load_extensions
40
- @extensions ||= {}
41
- @loaded_extensions ||= []
42
- @extensions.each do |extension, values|
43
- if values.key(:enabled) && !values[:enabled]
44
- Legion::Logging.info "Skipping #{extension} because it's disabled"
45
- next
46
- end
47
-
48
- if Legion::Settings[:extensions].key?(extension.to_sym) && Legion::Settings[:extensions][extension.to_sym].key?(:enabled) && !Legion::Settings[:extensions][extension.to_sym][:enabled] # rubocop:disable Layout/LineLength
49
- next
50
- end
51
-
52
- unless load_extension(extension, values)
53
- Legion::Logging.warn("#{extension} failed to load")
54
- next
55
- end
56
- @loaded_extensions.push(extension)
57
- end
58
- Legion::Logging.info "#{@extensions.count} extensions loaded with subscription:#{@subscription_tasks.count},every:#{@timer_tasks.count},poll:#{@poll_tasks.count},once:#{@once_tasks.count},loop:#{@loop_tasks.count}"
59
- end
60
-
61
- def load_extension(extension, values)
62
- return unless gem_load(values[:gem_name], extension)
63
-
64
- extension = Kernel.const_get(values[:extension_class])
65
- has_logger = extension.respond_to?(:log)
66
- extension.autobuild
67
-
68
- require 'legion/transport/messages/lex_register'
69
- Legion::Transport::Messages::LexRegister.new(function: 'save', opts: extension.runners).publish
70
-
71
- if extension.respond_to?(:meta_actors) && extension.meta_actors.is_a?(Array)
72
- extension.meta_actors.each do |_key, actor|
73
- extension.log.debug("hooking meta actor: #{actor}") if has_logger
74
- hook_actor(**actor)
75
- end
76
- end
77
-
78
- extension.actors.each do |_key, actor|
79
- extension.log.debug("hooking literal actor: #{actor}") if has_logger
80
- hook_actor(**actor)
81
- end
82
- extension.log.info "Loaded v#{extension::VERSION}"
83
- rescue StandardError => e
84
- Legion::Logging.error e.message
85
- Legion::Logging.error e.backtrace
86
- false
87
- end
88
-
89
- def hook_actor(extension:, extension_name:, actor_class:, size: 1, **opts)
90
- size = if Legion::Settings[:extensions].key?(extension_name.to_sym) && Legion::Settings[:extensions][extension_name.to_sym].key?(:workers)
91
- Legion::Settings[:extensions][extension_name.to_sym][:workers]
92
- elsif size.is_a? Integer
93
- size
94
- else
95
- 1
96
- end
97
-
98
- extension_hash = {
99
- extension: extension,
100
- extension_name: extension_name,
101
- actor_class: actor_class,
102
- size: size,
103
- fallback_policy: :abort,
104
- **opts
105
- }
106
- extension_hash[:running_class] = if actor_class.ancestors.include? Legion::Extensions::Actors::Subscription
107
- actor_class
108
- else
109
- actor_class.new
110
- end
111
-
112
- if actor_class.ancestors.include? Legion::Extensions::Actors::Every
113
- @timer_tasks.push(extension_hash)
114
- elsif actor_class.ancestors.include? Legion::Extensions::Actors::Once
115
- @once_tasks.push(extension_hash)
116
- elsif actor_class.ancestors.include? Legion::Extensions::Actors::Loop
117
- @loop_tasks.push(extension_hash)
118
- elsif actor_class.ancestors.include? Legion::Extensions::Actors::Poll
119
- @poll_tasks.push(extension_hash)
120
- elsif actor_class.ancestors.include? Legion::Extensions::Actors::Subscription
121
- extension_hash[:threadpool] = Concurrent::FixedThreadPool.new(size)
122
- size.times do
123
- extension_hash[:threadpool].post do
124
- klass = actor_class.new
125
- if klass.respond_to?(:async)
126
- klass.async.subscribe
127
- else
128
- klass.subscribe
129
- end
130
- end
131
- end
132
- @subscription_tasks.push(extension_hash)
133
- else
134
- Legion::Logging.fatal 'did not match any actor classes'
135
- end
136
- end
137
-
138
- def gem_load(gem_name, name)
139
- require "#{Gem::Specification.find_by_name(gem_name).gem_dir}/lib/legion/extensions/#{name}"
140
- true
141
- rescue LoadError => e
142
- Legion::Logging.error e.message
143
- Legion::Logging.error e.backtrace
144
- Legion::Logging.error "gem_path: #{gem_path}" unless gem_path.nil?
145
- false
146
- end
147
-
148
- def find_extensions
149
- @extensions ||= {}
150
- Gem::Specification.all_names.each do |gem|
151
- next unless gem[0..3] == 'lex-'
152
-
153
- lex = gem.split('-')
154
- @extensions[lex[1]] = { full_gem_name: gem,
155
- gem_name: "lex-#{lex[1]}",
156
- extension_name: lex[1],
157
- version: lex[2],
158
- extension_class: "Legion::Extensions::#{lex[1].split('_').collect(&:capitalize).join}" }
159
- end
160
-
161
- Legion::Settings[:extensions].each do |extension, values|
162
- next if @extensions.key? extension.to_s
163
- next if values[:enabled] == false
164
- next if values[:auto_install] == false
165
-
166
- Legion::Logging.warn "#{extension} is missing, attempting to install automatically.."
167
- install = Gem.install("lex-#{extension}")
168
- Legion::Logging.debug(install)
169
- lex = Gem::Specification.find_by_name("lex-#{extension}")
170
-
171
- @extensions[extension.to_s] = {
172
- full_gem_name: "lex-#{extension}-#{lex.version}",
173
- gem_name: "lex-#{extension}",
174
- extension_name: extension.to_s,
175
- version: lex.version,
176
- extension_class: "Legion::Extensions::#{extension.to_s.split('_').collect(&:capitalize).join}"
177
- }
178
-
179
- rescue StandardError, Gem::MissingSpecError => e
180
- Legion::Logging.error "Failed to auto install #{extension}, e: #{e.message}"
181
- end
182
- end
183
- end
184
- end
185
- end