Advertisement
Guest User

Untitled

a guest
Aug 10th, 2019
149
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Perl 6 3.96 KB | None | 0 0
  1. unit role Pluggable;
  2.  
  3. use JSON::Fast;
  4. use File::Find;
  5.  
  6. method plugin-base( $base ) { "{$base.defined ?? $base !! ::?CLASS.^name}" }
  7.  
  8. # Public Interface
  9. method plugins( :$base = Nil, :$plugins-namespace = 'Plugins', :$name-matcher = Nil ) {
  10.   say "plugins";
  11.   say self.plugin-base($base);
  12.   pluginz( self.plugin-base($base), $plugins-namespace, $name-matcher );
  13. }
  14.  
  15. method available-plugins(:$base = Nil, :$plugins-namespace = 'Plugins', :$name-matcher = Nil) {
  16.   list-modules(self.plugin-base($base), $plugins-namespace, $name-matcher);
  17. }
  18.  
  19.  
  20. multi sub available-plugins($base = Nil, :$plugins-namespace = 'Plugins', :$name-matcher = Nil) is export {
  21.   list-modules($base, $plugins-namespace, $name-matcher);
  22. }
  23.  
  24. multi sub available-plugins($base = Nil, $search-list = [],  :$plugins-namespace = 'Plugins', :$name-matcher = Nil ) is export {
  25.   ( list-modules($base, $plugins-namespace, $name-matcher).Bag
  26.     $search-list.map({ "{$base}::{$plugins-namespace}::$_" }).Bag
  27.   ).keys.Array ;
  28. }
  29.  
  30. my sub pluginz( :$base = Nil, :$plugins-namespace = 'Plugins', :$name-matcher = Nil ) is export {
  31.   say "pluginz";
  32.   #load-modules($base, $plugins-namespace, $name-matcher);
  33. }
  34.  
  35.  
  36. my sub load-modules($base, $namespace, $name-matcher) {
  37.   say "load-modules";
  38.   list-modules($base, $namespace, $name-matcher)
  39.     .map({ require-module( $_ ) })
  40.     .grep({ !.isa(Nil) })                   # Filter out modules that failed to load
  41.     .unique                                 # Potentially, there could be the same module installed and in lib at the same time
  42.     .Array;
  43. }
  44.  
  45. my sub require-module($module-name) {
  46.   try {
  47.     require ::($module-name);
  48.     return ::($module-name);
  49.   }
  50.  
  51.   given $! {
  52.     .say if ($*DEBUG-PLUGINS//False);
  53.     say .WHAT.perl, do given .backtrace[0] { .file, .line, .subname }
  54.     return;
  55.   }
  56. }
  57.  
  58. my sub list-modules($base, $namespace, $name-matcher) {
  59.   ( |installed-modules($base, $namespace, $name-matcher),
  60.     |filesystem-modules($base, $namespace, $name-matcher)
  61.   ).unique.Array;
  62. }
  63.  
  64. my sub filesystem-modules($base, $namespace, $name-matcher) {
  65.   matching-modules( all-filesystem-modules(), $base, $namespace, $name-matcher );
  66. }
  67.  
  68. my sub installed-modules($base, $namespace, $name-matcher) {
  69.   matching-modules( all-installed-modules(), $base, $namespace, $name-matcher );
  70. }
  71.  
  72. my sub matching-modules($modules, $base, $namespace, $name-matcher) {
  73.   $modules.grep(-> $module-name {
  74.     match-module( $module-name, $base, $namespace, $name-matcher);
  75.   });
  76. }
  77.  
  78. my sub match-module($module-name, $base, $namespace, $name-matcher) {
  79.   ($module-name.chars > "{$base}::{$namespace}".chars) &&
  80.   ($module-name.starts-with("{$base}::{$namespace}")) &&
  81.   ((!defined $name-matcher) || ($module-name ~~ $name-matcher));
  82. }
  83.  
  84. my sub all-filesystem-modules() {
  85.   $*REPO.repo-chain
  86.     .grep({ .isa(CompUnit::Repository::FileSystem) })
  87.     .map({ |modules-in-directory( .prefix ) });
  88. }
  89.  
  90. my sub modules-in-directory( $directory ) {
  91.   my @files = find(dir => $directory, name => /\.pm6?$/);
  92.   return map(-> $module-file { cleanup-module-name($module-file, $directory) }, @files);
  93. }
  94.  
  95. my sub cleanup-module-name ($module-name is copy, $prefix) {
  96.   $module-name = $module-name.substr($prefix.chars + 1);
  97.   $module-name = $module-name.substr(0, $module-name.rindex('.'));
  98.   $module-name = $module-name.subst(/\//, '::', :g);
  99.   $module-name = $module-name.subst(/\\/, '::', :g);
  100. }
  101.  
  102. my sub all-installed-modules() {
  103.   # XXX perhaps $r.installed() could be leveraged here, but it
  104.   # seems broken at the moment
  105.   $*REPO.repo-chain
  106.     .grep({ .isa(CompUnit::Repository::Installation) })
  107.     .map({ |modules-in-dist( .prefix ) });
  108. }
  109.  
  110. my sub modules-in-dist( $directory ) {
  111.   my $dist_dir = $directory.child('dist');
  112.  
  113.   gather {
  114.     if ($dist_dir.?e) {
  115.       for $dist_dir.IO.dir.grep(*.IO.f) -> $idx_file {
  116.         my $data = from-json($idx_file.IO.slurp);
  117.         for $data{'provides'}.keys -> $f {
  118.           take $f;
  119.         }
  120.       }
  121.     }
  122.   }
  123. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement