File Coverage

lib/Net/API/CPAN/Mock.pm
Criterion Covered Total %
statement 2110 2357 89.5
branch 279 518 53.8
condition 463 1028 45.0
subroutine 225 227 99.1
pod 16 16 100.0
total 3093 4146 74.6


line stmt bran cond sub pod time code
1             ##----------------------------------------------------------------------------
2             ## Meta CPAN API - ~/lib/Net/API/CPAN/Mock.pm
3             ## Version v0.1.0
4             ## Copyright(c) 2023 DEGUEST Pte. Ltd.
5             ## Author: Jacques Deguest <jack@deguest.jp>
6             ## Created 2023/08/12
7             ## Modified 2023/08/12
8             ## All rights reserved
9             ##
10             ##
11             ## This program is free software; you can redistribute it and/or modify it
12             ## under the same terms as Perl itself.
13             ##----------------------------------------------------------------------------
14             package Net::API::CPAN::Mock;
15             BEGIN
16             {
17 3     3   5549698 use strict;
  3         32  
  3         103  
18 3     3   16 use warnings;
  3         6  
  3         75  
19 3     3   13 use warnings::register;
  3         6  
  3         438  
20 3     3   22 use parent qw( Module::Generic );
  3         6  
  3         20  
21 3     3   198 use vars qw( $VERSION $DATA $TEST_DATA @STANDARD_HEADERS $DIFF_RAW_TEMPLATE $DIFF_JSON_TEMPLATE );
  3         15  
  3         282  
22 3     3   1578 use curry;
  3         675  
  3         92  
23 3     3   648 use Changes::Version;
  3         1829009  
  3         33  
24 3     3   3141 use DateTime;
  3         1095436  
  3         136  
25 3     3   1543 use DateTime::Format::Strptime;
  3         429896  
  3         21  
26 3     3   227 use Encode ();
  3         7  
  3         67  
27 3     3   1751 use HTTP::Promise::Parser;
  3         473003  
  3         36  
28 3     3   2109 use HTTP::Promise::Response;
  3         81987  
  3         42  
29 3     3   935 use HTTP::Promise::Status;
  3         5  
  3         31  
30 3     3   152 use IO::Handle;
  3         6  
  3         151  
31 3     3   18 use Socket;
  3         7  
  3         1658  
32 3     3   27 use URI;
  3         6  
  3         104  
33 3     3   16 use constant DEFAULT_LANG => 'en_GB';
  3         4  
  3         310  
34 3     3   11 our $VERSION = 'v0.1.0';
35 3         74 our @STANDARD_HEADERS = (
36             Server => "CPAN-Mock/$VERSION",
37             );
38             };
39              
40 3     3   19 use strict;
  3         6  
  3         103  
41 3     3   14 use warnings;
  3         5  
  3         119  
42 3     3   16 use utf8;
  3         5  
  3         33  
43              
44             sub init
45             {
46 2     2 1 540 my $self = shift( @_ );
47             # OpenAPI specifications file checksum for caching
48 2 50       180 $self->{checksum} = undef unless( exists( $self->{checksum} ) );
49             # OpenAPI resulting endpoints we derived from the specs
50 2 50       16 $self->{endpoints} = undef unless( exists( $self->{endpoints} ) );
51 2 50       14 $self->{host} = undef unless( exists( $self->{host} ) );
52             # OpenAPI specifications file
53 2 50       10 $self->{openapi} = undef unless( exists( $self->{openapi} ) );
54 2 50       10 $self->{port} = undef unless( exists( $self->{port} ) );
55 2 50       10 $self->{pretty} = 0 unless( exists( $self->{pretty} ) );
56             # OpenAPI JSON specifications as perl data
57 2 50       12 $self->{specs} = undef unless( exists( $self->{specs} ) );
58 2         8 $self->{_init_strict_use_sub} = 1;
59 2 50       18 $self->SUPER::init( @_ ) || return( $self->pass_error );
60 2 50       342 if( $self->{specs} )
61             {
62 0 0       0 $self->load_specs( $self->{specs} ) || return( $self->pass_error );
63             }
64 2         34 $self->{json} = $self->new_json;
65 2 50       18610 $self->{json}->pretty(1)->canonical(1) if( $self->pretty );
66 2 50       1686 unless( $TEST_DATA )
67             {
68 2 50       14 $DATA = Encode::decode_utf8( $DATA ) if( !Encode::is_utf8( $DATA ) );
69 2         57210 $TEST_DATA = eval( $DATA );
70 2 50       258 if( $@ )
71             {
72 0         0 die( $@ );
73             }
74             }
75 2         14 return( $self );
76             }
77              
78             # See perlipc/"Sockets: Client/Server Communication"
79             sub bind
80             {
81 8     8 1 6737 my $self = shift( @_ );
82 8         23 my $socket;
83 8 100       45 unless( $socket = $self->socket )
84             {
85 2   50     3056 my $proto = getprotobyname('tcp') ||
86             return( $self->error( "Unable to get TCP proto: $!" ) );
87 2         10 my $s;
88 2 50       164 socket( $s, PF_INET, SOCK_STREAM, $proto ) ||
89             return( $self->error( "Unable to get socket: $!" ) );
90 2   50     50 my $host = $self->{host} || '127.0.0.1';
91 2   50     68 my $bin = Socket::inet_aton( $host ) ||
92             return( $self->error( "Unable to resolve $host: $!" ) );
93 2         8 my $port;
94 2         8 while(1)
95             {
96 2   33     96 $port = $self->{port} || int( rand( 5000 ) ) + 10000;
97             # To prevent next cycle to use it again
98 2         12 $self->{port} = undef;
99 2         18 my $addr = Socket::pack_sockaddr_in( $port, $bin );
100 2 50       54 bind( $s, $addr ) || next;
101 2 50       40 listen( $s, 10 ) || return( $self->error( "Unable to listen on host $host with port $port: $!" ) );
102 2         12 last;
103             }
104 2         18 $self->host( $host );
105 2         12 $self->port( $port );
106 2         8 $self->socket( $s );
107             }
108 8         6256 return( $self );
109             }
110              
111 2     2 1 152 sub checksum { return( shift->_set_get_scalar( 'checksum', @_ ) ); }
112              
113 194     194 1 161289 sub data { return( $TEST_DATA ); }
114              
115 2     2 1 7924 sub endpoints { return( shift->_set_get_hash_as_mix_object( 'endpoints', @_ ) ); }
116              
117             sub host
118             {
119 5     5 1 1027 my $self = shift( @_ );
120 5 100       36 if( @_ )
121             {
122 2         8 $self->{host} = shift( @_ );
123             }
124             else
125             {
126 3 50       32 $self->bind || return( $self->pass_error );
127             }
128 5         69 return( $self->{host} );
129             }
130              
131 187     187 1 1235956 sub json { return( shift->_set_get_object( 'json', 'JSON', @_ ) ); }
132              
133             sub load_specs
134             {
135 2     2 1 994442 my $self = shift( @_ );
136 2   50     48 my $file = shift( @_ ) || return( $self->error( "No openapi specifications file was provided." ) );
137 2         116 $file = $self->new_file( $file );
138 2 50       264292 if( !$file->exists )
    50          
    50          
139             {
140 0         0 return( $self->error( "OpenAPI specifications file provided $file does not exist." ) );
141             }
142             elsif( !$file->is_file )
143             {
144 0         0 return( $self->error( "OpenAPI specifications file provided $file is not a regular file." ) );
145             }
146             elsif( $file->is_empty )
147             {
148 0         0 return( $self->error( "OpenAPI specifications file provided $file is empty." ) );
149             }
150 2         75306 my $checksum = $file->checksum_md5;
151 2 0 33     26316 if( $self->{checksum} &&
      33        
      0        
      0        
152             $self->{checksum} eq $checksum &&
153             $self->{specs} &&
154             ref( $self->{specs} ) eq 'HASH' &&
155 0         0 scalar( keys( %{$self->{specs}} ) ) )
156             {
157 0 0       0 warn( "Called to reprocess the OpenAPI specification, but we already have a cache, so re-using the cache instead.\n" ) if( $self->_is_warnings_enabled );
158 0         0 return( $self );
159             }
160 2   50     66 my $specs = $file->load_json( boolean_values => [0,1] ) || return( $self->pass_error( $file->error ) );
161 2   50     47864 my $paths = $specs->{paths} || return( $self->error( "No 'paths' property found in the openapi specifications provided." ) );
162 2 50 33     58 return( $self->error( "The 'paths' property found is not an hash reference." ) ) if( !defined( $paths ) || ref( $paths ) ne 'HASH' );
163 2         12 $self->{specs} = $specs;
164 2         32 $self->{checksum} = $file->checksum_md5;
165 2         5194 my $def = {};
166            
167 2         18 my $seen = {};
168 2         20 my $processed = {};
169              
170             # NOTE: resolve_ref()
171             my $resolve_ref = sub
172             {
173 782     782   1396 my $schema = shift( @_ );
174 782         1564 my $opts = $self->_get_args_as_hash( @_ );
175 782         89804 my $ctx = $opts->{context};
176             # Already processed previously
177 782 50 33     1622 if( ref( $schema ) eq 'HASH' &&
178             exists( $processed->{ $self->_refaddr( $schema ) } ) )
179             {
180 0         0 return( $schema );
181             }
182            
183 782 50       1164 return( $self->error( "Found a schema reference (\$ref) for path $ctx->{path} and method $ctx->{method}, but its value is not a plain string (", overload::StrVal( $schema ), ")" ) ) if( ref( $schema ) );
184             # This is valid, but unsupported by us.
185             # <https://spec.openapis.org/oas/v3.0.0#reference-object>
186             # <https://spec.openapis.org/oas/v3.0.0#example-object-example>
187 782 50 50     2302 if( lc( substr( $schema, 0, 4 ) // '' ) eq 'http' )
188             {
189 0         0 return( $self->error( "External http schema reference is not supported by this tool for path $ctx->{path} and method $ctx->{method}" ) );
190             }
191 782 50       1530 return( $self->error( "Schema reference set for path $ctx->{path} and method $ctx->{method} should start with '#/', but it does not ($schema)." ) ) unless( substr( $schema, 0, 2 ) eq '#/' );
192             # Prevent infinite recursion
193 782 50       1440 if( exists( $seen->{ $schema } ) )
194             {
195 0         0 return( $seen->{ $schema } );
196             }
197 782         1136 $schema = substr( $schema, 2 );
198 782         2476 my $frags = [split( /\//, $schema )];
199 782 50       1704 scalar( @$frags ) ||
200             return( $self->error( "The schema reference for path $ctx->{path} and method $ctx->{method} does not have any schema value." ) );
201 782         2996 $self->message( 4, "Checking the path fragments '", join( "', '", @$frags ), "'" );
202 782         14842 my $tmp = $specs;
203 782         1328 my $breadcrumbs = ['/'];
204 782         1762 for( my $i = 0; $i < scalar( @$frags ); $i++ )
205             {
206 2346         4914 $self->message( 4, "Checking path fragment '", $frags->[$i], "'" );
207 2346 50       36176 if( exists( $tmp->{ $frags->[$i] } ) )
208             {
209 2346         3074 $tmp = $tmp->{ $frags->[$i] };
210 2346         5540 push( @$breadcrumbs, $frags->[$i] );
211             }
212             else
213             {
214 0         0 return( $self->error( "Unable to find path fragment '", $frags->[$i], "' in OpenAPI specifications in ", join( '/', @$breadcrumbs ), " for path $ctx->{path} and method $ctx->{method}" ) );
215             }
216             }
217 782         1368 $seen->{ $schema } = $tmp;
218 782         1654 $processed->{ $self->_refaddr( $tmp ) } = $tmp;
219 782         4756 return( $tmp );
220 2         56 };
221              
222             # NOTE: been_there()
223 2         8 my $crawl;
224 2         4 my $been_there = {};
225             $crawl = sub
226             {
227 1924     1924   3144 my $ref = shift( @_ );
228 1924         3524 my $opts = $self->_get_args_as_hash( @_ );
229 1924         220972 my $ctx = $opts->{context};
230 1924   50     4802 my $type = lc( ref( $ref ) // '' );
231 1924 100       3154 if( $type eq 'hash' )
    50          
232             {
233 1918         6172 foreach my $prop ( keys( %$ref ) )
234             {
235 4018 100       8804 if( $prop eq '$ref' )
    100          
236             {
237 70         146 my $schema = $ref->{ $prop };
238 70   50     146 my $tmp = $resolve_ref->( $schema, context => $ctx ) || return( $self->pass_error );
239 70         170 $ref->{ $prop } = $tmp;
240             }
241             elsif( ref( $ref->{ $prop } ) )
242             {
243 2636 100       5682 if( ++$been_there->{ $self->_refaddr( $ref->{ $prop } ) } > 1 )
244             {
245 1586         6978 next;
246             }
247 1050 50       7430 $crawl->( $ref->{ $prop }, context => $ctx ) || return( $self->pass_error );
248             }
249             }
250             }
251             elsif( $type eq 'array' )
252             {
253 6         14 for( my $i = 0; $i < scalar( @$ref ); $i++ )
254             {
255 26 100       64 if( ref( $ref->[$i] ) )
256             {
257 14 50       54 if( ++$been_there->{ $self->_refaddr( $ref->[$i] ) } > 1 )
258             {
259 0         0 next;
260             }
261 14 50       122 $crawl->( $ref->[$i], context => $ctx ) || return( $self->pass_error );
262             }
263             }
264             }
265 1924         5108 return(1);
266 2         32 };
267              
268             # NOTE: load_properties()
269 2         8 my $circular_props = {};
270 2         4 my $load_properties;
271             $load_properties = sub
272             {
273 860   50 860   1836 my $hash = shift( @_ ) || return( $self->error( "No schema specification hash reference was provided." ) );
274 860 50       1470 return( $self->error( "Data provided to parse is not an hash reference." ) ) if( ref( $hash ) ne 'HASH' );
275 860         1750 my $opts = $self->_get_args_as_hash( @_ );
276 860         105342 my $ctx = $opts->{context};
277 860 50       1688 $opts->{prefix} = [] if( !exists( $opts->{prefix} ) );
278 860         980 my $prefix = join( '', @{$opts->{prefix}} );
  860         1760  
279            
280 860         1132 my $props;
281 860 100 33     2122 if( exists( $hash->{ '$ref' } ) )
    100 33        
    50          
    50          
282             {
283 712         2464 $self->message( 4, "${prefix} Found schema reference \$ref -> '", $hash->{ '$ref' }, "'." );
284 712   50     14268 my $schema_def = $resolve_ref->( $hash->{ '$ref' }, context => $ctx ) || return( $self->pass_error );
285 712         4344 $self->message( 4, "${prefix} \$ref '", $hash->{ '$ref' }, "' resolved to ${schema_def} with keys -> '", sub{ join( "', '", sort( keys( %$schema_def ) ) ) }, "'" );
  0         0  
286            
287             # e.g.: <https://gist.github.com/xygon/82cd827dd8979167bc6287bafc9eaf84>
288 712 100       13054 if( exists( $schema_def->{allOf} ) )
    50          
289             {
290 28         152 $self->message( 4, "${prefix} Found allOf." );
291 28 50       474 if( ref( $schema_def->{allOf} ) ne 'ARRAY' )
292             {
293 0         0 return( $self->error( "Found property 'allOf' in this schema for path $ctx->{path} and method $ctx->{method}, but this is not an array reference." ) );
294             }
295 28         46 my $tmp = {};
296 28         42 foreach my $elem ( @{$schema_def->{allOf}} )
  28         56  
297             {
298 56         168 $self->message( 4, "${prefix}[allOf] Processing $elem" );
299 56 50       888 if( ref( $elem ) ne 'HASH' )
300             {
301 0         0 return( $self->error( "I was expecting an hash reference, but instead I got '$elem' for ${prefix}" ) );
302             }
303            
304 56 100       104 if( ++$circular_props->{ $self->_refaddr( $elem ) } > 1 )
305             {
306 52         302 next;
307             }
308             my $tmp_props = $load_properties->( $elem,
309             context => $ctx,
310 4   50     28 prefix => [@{$opts->{prefix}}, '[allOf]'],
311             ) || return( $self->pass_error );
312 4         36 $self->message( 4, "${prefix}[allOf] Found properties with keys '", sub{ join( "', '", sort( keys( %$tmp_props ) ) ) }, "'" );
  0         0  
313 4         102 my @tmp_keys = keys( %$tmp_props );
314 4         30 @$tmp{ @tmp_keys } = @$tmp_props{ @tmp_keys };
315             }
316 28         58 $props = $tmp;
317 28   50     124 $self->message( 4, "${prefix} \$props is '", ( $props // 'undef' ), "'" );
318             }
319             elsif( !exists( $schema_def->{properties} ) )
320             {
321 0         0 $self->message( 4, "${prefix} \$ref error: no 'properties' found." );
322 0         0 return( $self->error( "Unable to find the property 'properties' in this schema definition for path $ctx->{path} and method $ctx->{method}" ) );
323             }
324             else
325             {
326 684         1114 $props = $schema_def->{properties};
327             }
328             }
329             elsif( exists( $hash->{properties} ) )
330             {
331 80         480 $self->message( 4, "${prefix} Found schema properties with keys '", sub{ join( "', '", sort( keys( %{$hash->{properties}} ) ) ) }, "'" );
  0         0  
  0         0  
332 80 50 33     1868 if( !exists( $hash->{type} ) ||
333             $hash->{type} ne 'object' )
334             {
335 0 0       0 warn( "Warning only: no 'type' property set to 'object' could be found with the property 'properties' for path $ctx->{path} and method $ctx->{method}.\n" ) if( $self->_is_warnings_enabled );
336             }
337 80         158 $props = $hash->{properties};
338             }
339             # <https://spec.openapis.org/oas/v3.0.0#path-item-object-example>
340             # <https://spec.openapis.org/oas/v3.0.0#paths-object-example>
341             # <https://stackoverflow.com/questions/47656791/openapi-multiple-types-inside-an-array>
342             # "schema": {
343             # "type": "array",
344             # "items": {
345             # "$ref": "#/components/schemas/Pet"
346             # }
347             # }
348             # or:
349             # "schema": {
350             # "type": "array",
351             # "items": {
352             # "type": "string"
353             # }
354             # }
355             # or:
356             # "schema": {
357             # "type": "array",
358             # "items": {
359             # "anyOf": [
360             # { "$ref": "#/components/schemas/Pet" },
361             # { "$ref": "#/components/schemas/Cat" },
362             # { "$ref": "#/components/schemas/Dog" }
363             # ]
364             # }
365             # }
366             # or:
367             # "schema": {
368             # "type": "array",
369             # "items": {
370             # "type": "object",
371             # "properties": {
372             # "name": {
373             # "type": "string"
374             # },
375             # "status": {
376             # "type": "boolean"
377             # }
378             # }
379             # }
380             # }
381             elsif( exists( $hash->{type} ) &&
382             defined( $hash->{type} ) &&
383             $hash->{type} eq 'array' )
384             {
385 0         0 $self->message( 4, "${prefix} Found array." );
386 0 0 0     0 if( !exists( $hash->{items} ) ||
      0        
387             !defined( $hash->{items} ) ||
388             ref( $hash->{items} ) ne 'HASH' )
389             {
390 0         0 return( $self->error( "Found an array for schema in path $ctx->{path} and method $ctx->{method}, but either there is no 'items' property, or it is not an hash reference." ) );
391             }
392 0         0 my $items = $hash->{items};
393 0         0 my $subprops;
394             # allOf, anyOf, oneOf
395 0 0 0     0 if( exists( $items->{allOf} ) ||
      0        
396             exists( $items->{anyOf} ) ||
397             exists( $items->{oneOf} ) )
398             {
399 0         0 foreach my $t ( qw( allOf anyOf oneOf ) )
400             {
401 0 0       0 next unless( exists( $items->{ $t } ) );
402             $subprops = $load_properties->( $items->{ $t },
403             context => $ctx,
404 0   0     0 prefix => [@{$opts->{prefix}}, '{items}', $t],
405             ) || return( $self->pass_error );
406 0         0 my @keys = scalar( keys( %$subprops ) );
407 0         0 @{$items->{ $t }}{ @keys } = @$subprops{ @keys };
  0         0  
408 0         0 last;
409             }
410             }
411             else
412             {
413             $subprops = $load_properties->( $items,
414             context => $ctx,
415 0   0     0 prefix => [@{$opts->{prefix}}, '{items}']
416             ) || return( $self->pass_error );
417 0         0 my @keys = scalar( keys( %$subprops ) );
418 0         0 @$items{ @keys } = @$subprops{ @keys };
419             }
420 0         0 $props = $items;
421             }
422             elsif( exists( $hash->{type} ) )
423             {
424 68         272 $self->message( 4, "${prefix} Found simple type definition -> '",$hash->{type}, "' ." );
425 68         1290 $props = $hash;
426             }
427             else
428             {
429 0         0 $self->message( 4, "${prefix} Error. Clueless as to what to do." );
430 0         0 return( $self->error( "I was expecting either the property '\$ref' or 'properties' or some 'type', but could not find either in this schema definition for path $ctx->{path} and method $ctx->{method}" ) );
431             }
432            
433 860   50     3390 $self->message( 4, "${prefix} Returning \$props -> '", ( $props // 'undef' ), "'" );
434              
435 860 50 33     14658 if( !defined( $props ) ||
436             ref( $props ) ne 'HASH' )
437             {
438 0         0 return( $self->error( "The property 'properties' found for schema definition for path $ctx->{path} and method $ctx->{method} is not an hash reference!" ) );
439             }
440            
441             # Make sure to resolve all references
442 860 50       1410 $crawl->( $props, context => $ctx ) || return( $self->pass_error );
443 860         2314 return( $props );
444 2         30 };
445            
446             # Path and method by ID
447 2         8 my $ids = {};
448             # NOTE: Processing each path
449 2         68 foreach my $path ( keys( %$paths ) )
450             {
451 202         518 my $p = { path => $path };
452 202 50       734 return( $self->error( "Path definition for $path is not an hash reference." ) ) if( ref( $paths->{ $path } ) ne 'HASH' );
453             # my $path_re = $path;
454             # This does not work when the last variable is a path such as lib/Some/Module.pm
455             # $path_re =~ s/\{([^\}]+)\}/\(\?<$1>\[^\\\/\\\?\]+\)/gs;
456 202         1000 my @parts = split( /\{([^\}]+)\}/, $path );
457 202         324 my @elems = ();
458 202         480 for( my $i = 0; $i < scalar( @parts ); $i++ )
459             {
460             # Odd entries are the endpoint variables
461 386 100       600 if( $i % 2 )
462             {
463 140 100       216 if( $i == $#parts )
464             {
465 96         256 push( @elems, '(?<' . $parts[$i] . '>.*?)$' );
466             }
467             else
468             {
469 44         114 push( @elems, '(?<' . $parts[$i] . '>[^\/\?]+)' );
470             }
471             }
472             else
473             {
474 246         586 push( @elems, $parts[$i] );
475             }
476             }
477 202         410 my $path_re = join( '', @elems );
478 202         350 foreach my $meth ( qw( delete get post put ) )
479             {
480 808 100       2272 next unless( exists( $paths->{ $path }->{ $meth } ) );
481 408 100       1112 $def->{ $path } = {} if( !exists( $def->{ $path } ) );
482 408         1166 $def->{ $path }->{ $meth } = { path => $path, method => $meth };
483 408         744 my $this = $paths->{ $path }->{ $meth };
484 408 50       752 return( $self->error( "Method definition for path $path and method $meth is not an hash reference." ) ) if( ref( $this ) ne 'HASH' );
485 408         1536 $def->{ $path }->{ $meth }->{id} = $this->{operationId};
486 408 50       914 if( exists( $ids->{ $this->{operationId} } ) )
487             {
488 0         0 return( $self->error( "Found the operation ID '$this->{operationId}' for method $meth in path $path, but there is already this ID for path ", $ids->{ $this->{operationId} }->{path}, " and method ", $ids->{ $this->{operationId} }->{method} ) );
489             }
490 408         1102 $ids->{ $this->{operationId} } = $def->{ $path }->{ $meth };
491 408         814 my $params = $this->{parameters};
492 408         556 my $ep_params = [];
493 408         472 my $query = {};
494 408         780 foreach my $elem ( @$params )
495             {
496 730 50 33     2300 next unless( defined( $elem ) && ref( $elem ) eq 'HASH' );
497 730 100       1938 if( $elem->{in} eq 'query' )
    50          
498             {
499 450 50       1792 $query->{ $elem->{name} } = exists( $elem->{schema} ) ? $elem->{schema}->{type} : 'string';
500             }
501             elsif( $elem->{in} eq 'path' )
502             {
503 280         860 push( @$ep_params, { name => $elem->{name}, type => $elem->{type} } );
504             }
505             }
506 408         782 $def->{ $path }->{ $meth }->{params} = $ep_params;
507 408         616 $def->{ $path }->{ $meth }->{query} = $query;
508 408         4956 $def->{ $path }->{ $meth }->{endpoint_re} = qr/$path_re/;
509 408         740 my $ok_content_types = [];
510 408 100 100     1194 unless( $meth eq 'get' || $meth eq 'delete' )
511             {
512 192 50 33     1788 if( !exists( $this->{requestBody} ) )
    50 33        
    50 33        
513             {
514 0         0 return( $self->error( "The path $path with method $meth is missing the 'requestBody' property'." ) );
515             }
516             elsif( !defined( $this->{requestBody} ) || ref( $this->{requestBody} ) ne 'HASH' )
517             {
518 0         0 return( $self->error( "Property 'requestBody' in path $path for method $meth is not an hash reference." ) );
519             }
520             elsif( !exists( $this->{requestBody}->{content} ) ||
521             !defined( $this->{requestBody}->{content} ) ||
522             ref( $this->{requestBody}->{content} ) ne 'HASH' )
523             {
524 0         0 return( $self->error( "Missing property 'content' or not an hash reference for path $path and method $meth" ) );
525             }
526 192         228 my $cts = $this->{requestBody}->{content};
527 192 50       578 if( !scalar( keys( %$cts ) ) )
528             {
529 0         0 push( @$ok_content_types, 'application/x-www-form-urlencoded' );
530             }
531             else
532             {
533 192         564 push( @$ok_content_types, sort( keys( %$cts ) ) );
534             }
535             # TODO: Need to add the possible request parameters for later validation
536             }
537 408         750 $def->{ $path }->{ $meth }->{content_types} = $ok_content_types;
538             # Response
539 408 50 33     1784 if( !exists( $this->{responses} ) )
    50          
    50          
540             {
541 0         0 return( $self->error( "The path $path with method $meth is missing the 'responses' property'." ) );
542             }
543             elsif( !defined( $this->{responses} ) ||
544             ref( $this->{responses} ) ne 'HASH' )
545             {
546 0         0 return( $self->error( "The path $path with method $meth has a property 'responses' that is not an hash reference." ) );
547             }
548 408         1790 elsif( !scalar( keys( %{$this->{responses}} ) ) )
549             {
550 0         0 return( $self->error( "There is no possible responses set for the path $path and method $meth!" ) );
551             }
552 408         574 my $resps = {};
553 408         524 foreach my $code ( keys( %{$this->{responses}} ) )
  408         986  
554             {
555 816         1470 $resps->{ $code } = {};
556 816 50 33     6326 if( !defined( $this->{responses}->{ $code } ) ||
    50 33        
    50          
557             ref( $this->{responses}->{ $code } ) ne 'HASH' )
558             {
559 0         0 return( $self->error( "The response code $code for path $path and method $meth is either not defined or not an hash reference." ) );
560             }
561             elsif( !exists( $this->{responses}->{ $code }->{content} ) )
562             {
563 0         0 return( $self->error( "There is no 'content' property for response code $code for path $path and method $meth" ) );
564             }
565             elsif( !defined( $this->{responses}->{ $code }->{content} ) ||
566             ref( $this->{responses}->{ $code }->{content} ) ne 'HASH' )
567             {
568 0         0 return( $self->error( "The 'content' property for the response code $code in path $path and method $meth is not an hash reference." ) );
569             }
570             # $ct could also be '*/*'
571             # <https://spec.openapis.org/oas/v3.0.0#path-item-object-example>
572 816         1072 foreach my $ct ( sort( keys( %{$this->{responses}->{ $code }->{content}} ) ) )
  816         3228  
573             {
574 856 50 33     4024 if( !exists( $this->{responses}->{ $code }->{content}->{ $ct }->{schema} ) )
    50          
575             {
576 0         0 return( $self->error( "Missing property 'schema' in this response for content-type $ct for the response code $code in path $path and method $meth" ) );
577             }
578             elsif( !defined( $this->{responses}->{ $code }->{content}->{ $ct }->{schema} ) ||
579             ref( $this->{responses}->{ $code }->{content}->{ $ct }->{schema} ) ne 'HASH' )
580             {
581 0         0 return( $self->error( "Property 'schema' found is not an hash reference in this response for content-type $ct for the response code $code in path $path and method $meth" ) );
582             }
583             # schema can either be a '$ref', or an object of 'properties', or some 'array', or some 'string', possibly with the format parameter
584 856         3514 $self->message( 4, "\U${meth}\E ${path} Loading response properties..." );
585             my $props = $load_properties->( $this->{responses}->{ $code }->{content}->{ $ct }->{schema},
586 856   50     18404 context => $def->{ $path }->{ $meth },
587             prefix => ["\U${meth}\E ${path}"],
588             ) || return( $self->pass_error );
589 856         2484 $resps->{ $code }->{ $ct } = $props;
590             }
591             }
592 408         1700 $def->{ $path }->{ $meth }->{response} = $resps;
593             }
594             }
595 2         52 $self->{endpoints} = $def;
596 2         204 return( $self );
597             }
598              
599 3     3 1 2836 sub pid { return( shift->_set_get_scalar( 'pid', @_ ) ); }
600              
601             sub port
602             {
603 5     5 1 11 my $self = shift( @_ );
604 5 100       25 if( @_ )
605             {
606 2         6 $self->{port} = shift( @_ );
607             }
608             else
609             {
610 3 50       24 $self->bind || return( $self->pass_error );
611             }
612 5         33 return( $self->{port} );
613             }
614              
615 4     4 1 1384 sub pretty { return( shift->_set_get_boolean( 'pretty', @_ ) ); }
616              
617 13     13 1 121 sub socket { return( shift->_set_get_scalar( 'socket', @_ ) ); }
618              
619 3     3 1 363767 sub specs { return( shift->_set_get_hash( 'specs', @_ ) ); }
620              
621             sub start
622             {
623 2     2 1 1990 my $self = shift( @_ );
624             # my $cb = shift( @_ ) || return( $self->error( "No callback code reference was provided." ) );
625             # return( $self->error( "Callback provided is not a code reference." ) ) if( ref( $cb ) ne 'CODE' );
626 2 50       10 return( $self->error( "Another mock API server is already running." ) ) if( $self->{pid} );
627 2         11886 $self->{pid} = fork;
628             # Parent
629 2 100       195 if( $self->{pid} )
630             {
631 1         91 return( $self );
632             }
633             # Child
634             else
635             {
636             # for $DB::signal
637 3     3   11942 no warnings 'once';
  3         9  
  3         6612  
638 1         68 $DB::signal = 1;
639 1     1   194 $SIG{INT} = sub { exit(1); };
  1         159  
640 1     0   56 $SIG{TERM} = sub { exit(1); };
  0         0  
641             # $self->curry::loop( $cb );
642 1   50     71 my $socket = $self->socket || return( $self->error( "Socket lost somehow" ) );
643             # Load the fake data stored under __END__
644 1         1639 my $data = $self->data;
645 1         12 my $alias = $data->{alias};
646            
647 1         12 while(1)
648             {
649 1 50       10904 accept( my $client, $socket ) ||
650             return( $self->error( "Failed to accept new connections: $!" ) );
651 0         0 my $parser = HTTP::Promise::Parser->new( debug => $self->debug );
652             my $req = $parser->parse_fh( $socket, request => 1 ) || do
653 0   0     0 {
654             warn( "Error parsing request with error code ", $parser->error->code, " and message ", $parser->error->message ) if( $self->_is_warnings_enabled );
655             last;
656             };
657            
658 0         0 my $stat = HTTP::Promise::Status->new;
659 0         0 my $uri = $req->uri;
660 0         0 my $meth = $req->method->lower;
661 0         0 my $req_path = $uri->path;
662 0         0 $req_path =~ s/\/{2,}$/\//g;
663 0         0 my $lang = 'en_GB';
664 0 0       0 if( $req->headers->exists( 'Accept-Language' ) )
665             {
666 0         0 my $al = $req->headers->new_field( 'Accept-Language', $req->headers->accept_language );
667 0         0 my $supported = $stat->supported_languages;
668             # en_GB -> en-GB
669 0         0 for( @$supported )
670             {
671 0         0 $_ =~ tr/_/-/;
672             }
673 0         0 my $best = $al->match( $supported->list )->first;
674 0 0       0 $lang = $best if( $best );
675             }
676            
677             my $endpoints = $self->endpoints || do
678 0   0     0 {
679             my $msg = { code => 500, message => "No OpenAPI specifications were loaded." };
680             my $payload = $self->json->encode( $msg );
681             # my $resp = HTTP::Promise::Response->new( $msg->{code}, 'Internal Server Edrror', [
682             my $resp = HTTP::Promise::Response->new( $msg->{code}, $stat->status_message( 500 => $lang ), [
683             @STANDARD_HEADERS,
684             Content_Type => 'application/json',
685             Content_Length => length( $payload ),
686             Date => $self->_date_now,
687             ], $payload,
688             );
689             $client->print( 'HTTP/1.1 ' . $resp->as_string( "\015\012" ) );
690             last;
691             };
692            
693             # Find out the appropriate endpoint handler for this request.
694 0         0 my( $def, $ep_vars );
695             # From the most specific to the least
696 0         0 foreach my $path ( reverse( sort( keys( %$endpoints ) ) ) )
697             {
698 0         0 my $this = $endpoints->{ $path };
699 0         0 my $re = $this->{endpoint_re};
700 0         0 my @matches = ( $req_path =~ /^$re$/ );
701 0         0 my $vars = { %+ };
702 0 0       0 if( scalar( @matches ) )
703             {
704 0         0 $def = $this;
705 0         0 $ep_vars = $vars;
706 0         0 last;
707             }
708             }
709            
710             # No match was found for this request
711 0 0       0 if( !defined( $def ) )
    0          
712             {
713 0         0 my $msg = { code => 404, message => "No endpoint found for $req_path" };
714 0         0 my $payload = $self->json->encode( $msg );
715 0         0 my $resp = HTTP::Promise::Response->new( 405, $stat->status_message( 404 => $lang ), [
716             @STANDARD_HEADERS,
717             Content_Type => 'application/json',
718             Content_Length => length( $payload ),
719             Date => $self->_date_now,
720             ], $payload,
721             );
722 0         0 $client->print( 'HTTP/1.1 ' . $resp->as_string( "\015\012" ) );
723 0         0 last;
724             }
725             # No match was found for this request
726             elsif( !exists( $def->{ $meth } ) )
727             {
728 0         0 my $msg = { code => 405, message => "Method used ${meth} is not supported for this endpoint." };
729 0         0 my $payload = $self->json->encode( $msg );
730 0         0 my $resp = HTTP::Promise::Response->new( 405, $stat->status_message( 405 => $lang ), [
731             @STANDARD_HEADERS,
732             Content_Type => 'application/json',
733             Content_Length => length( $payload ),
734             Date => $self->_date_now,
735             ], $payload,
736             );
737 0         0 $client->print( 'HTTP/1.1 ' . $resp->as_string( "\015\012" ) );
738 0         0 last;
739             }
740 0         0 $def = $def->{ $meth };
741            
742 0         0 my $query;
743             # Check request Content-Type against what the endpoint says we can accept
744             # May be empty if this is a GET, HEAD or DELETE method, but otherwise required
745 0         0 my $ct = $req->headers->type;
746             # NOTE: Get query parameters
747 0 0 0     0 if( $meth eq 'delete' || $meth eq 'get' || $meth eq 'head' )
      0        
748             {
749 0         0 $query = $uri->query_form_hash;
750             }
751             else
752             {
753 0 0 0     0 if( !defined( $ct ) || !length( $ct // '' ) )
      0        
754             {
755 0         0 my $msg = { code => 415, message => "No content type was provided in your ${meth} request." };
756 0         0 my $payload = $self->json->encode( $msg );
757 0         0 my $resp = HTTP::Promise::Response->new( 415, $stat->status_message( 415 => $lang ), [
758             @STANDARD_HEADERS,
759             Content_Type => 'application/json',
760             Content_Length => length( $payload ),
761             Date => $self->_date_now,
762             ], $payload,
763             );
764 0         0 $client->print( 'HTTP/1.1 ' . $resp->as_string( "\015\012" ) );
765 0         0 last;
766             }
767            
768 0         0 my $ok_types = $def->{content_types};
769 0 0       0 if( !scalar( grep( /^$ct$/i, @$ok_types ) ) )
770             {
771 0         0 my $msg = { code => 415, message => "Content type provided ($ct) is not supported by this endpoint." };
772 0         0 my $payload = $self->json->encode( $msg );
773 0         0 my $resp = HTTP::Promise::Response->new( 415, $stat->status_message( 415 => $lang ), [
774             @STANDARD_HEADERS,
775             Content_Type => 'application/json',
776             Content_Length => length( $payload ),
777             Date => $self->_date_now,
778             ], $payload,
779             );
780 0         0 $client->print( 'HTTP/1.1 ' . $resp->as_string( "\015\012" ) );
781 0         0 last;
782             }
783            
784             # Decode payload.
785 0 0       0 if( $ct eq 'application/json' )
786             {
787 0         0 my $payload = $req->decoded_content_utf8;
788 0         0 local $@;
789             # try-catch
790             eval
791 0         0 {
792 0         0 $query = $self->json->decode( $payload );
793             };
794 0 0       0 if( $@ )
795             {
796 0         0 my $msg = { code => 400, message => "JSON payload is malformed: $@" };
797 0         0 my $payload = $self->json->encode( $msg );
798 0         0 my $resp = HTTP::Promise::Response->new( 400, $stat->status_message( 400 => $lang ), [
799             @STANDARD_HEADERS,
800             Content_Type => 'application/json',
801             Content_Length => length( $payload ),
802             ], $payload,
803             );
804 0         0 $client->print( 'HTTP/1.1 ' . $resp->as_string( "\015\012" ) );
805 0         0 last;
806             }
807             }
808            
809             # TODO: validate request parameters sent
810             }
811            
812             # NOTE: process query
813 0         0 my $op_id = $def->{id};
814 0         0 my $resp;
815             # Maybe there is a special handler for this operation ID
816 0 0 0     0 if( my $handler = $self->can( "_${op_id}" ) )
    0          
817             {
818             $resp = $handler->( $self,
819             def => $def,
820             lang => $lang,
821             request => $req,
822             vars => $ep_vars,
823             ) || do
824 0   0     0 {
825             my $code = $self->error->code || 500;
826             my $msg = { code => $code, message => $self->error->message };
827             my $payload = $self->json->encode( $msg );
828             my $resp = HTTP::Promise::Response->new( $code, $stat->status_message( $code => $lang ), [
829             @STANDARD_HEADERS,
830             Content_Type => 'application/json',
831             Content_Length => length( $payload ),
832             Date => $self->_date_now,
833             ], $payload,
834             );
835             $client->print( 'HTTP/1.1 ' . $resp->as_string( "\015\012" ) );
836             last;
837             };
838             }
839             elsif( exists( $data->{ $op_id } ) ||
840             exists( $alias->{ $op_id } ) )
841             {
842 0 0       0 my $resp_data = exists( $alias->{ $op_id } ) ? $data->{ $alias->{ $op_id } } : $data->{ $op_id };
843             # otherwise, we build the response and return the data
844 0         0 my $resp_cts = $def->{response}->{200};
845 0         0 my $resp_cts_ok = [keys( %$resp_cts )];
846 0         0 my $resp_ct;
847 0 0       0 if( scalar( @$resp_cts_ok ) == 1 )
848             {
849 0         0 $resp_ct = $resp_cts_ok->[0];
850             }
851             else
852             {
853 0         0 my $accept = 'application/json';
854 0 0       0 if( $req->headers->exists( 'Accept' ) )
855             {
856 0         0 $accept = $req->headers->acceptables->match( $resp_cts_ok );
857             }
858            
859 0 0       0 if( exists( $resp_cts->{ $accept } ) )
860             {
861 0         0 $resp_ct = $accept;
862             }
863             else
864             {
865 0         0 my $msg = { code => 406, message => "Could not find a suitable response content-type for operation ID ${op_id} for endpoint ${req_path} and method ${meth}" };
866 0         0 my $payload = $self->json->encode( $msg );
867 0         0 my $resp = HTTP::Promise::Response->new( 406, $stat->status_message( 406 => $lang ), [
868             @STANDARD_HEADERS,
869             Content_Type => 'application/json',
870             Content_Length => length( $payload ),
871             Date => $self->_date_now,
872             ], $payload,
873             );
874 0         0 $client->print( 'HTTP/1.1 ' . $resp->as_string( "\015\012" ) );
875 0         0 last;
876             }
877             }
878            
879 0         0 my $payload;
880 0 0       0 if( $resp_ct eq 'application/json' )
881             {
882 0         0 $payload = $self->json->encode( $resp_data );
883             }
884             # As-is data. More complex response should be handled by a dedicated handler
885             else
886             {
887 0         0 $payload = $resp_data;
888             }
889 0         0 $resp = HTTP::Promise::Response->new( 200, $stat->status_message( 200 => $lang ), [
890             @STANDARD_HEADERS,
891             Content_Type => $resp_ct,
892             Content_Length => length( $payload ),
893             Date => $self->_date_now,
894             ], $payload,
895             );
896             }
897             else
898             {
899 0         0 my $msg = { code => 500, message => "Could not find a handler or any data entry for operation ID ${op_id} for endpoint ${req_path} and method ${meth}" };
900 0         0 my $payload = $self->json->encode( $msg );
901 0         0 $resp = HTTP::Promise::Response->new( 500, $stat->status_message( 500 => $lang ), [
902             @STANDARD_HEADERS,
903             Content_Type => 'application/json',
904             Content_Length => length( $payload ),
905             Date => $self->_date_now,
906             ], $payload,
907             );
908 0         0 $client->print( 'HTTP/1.1 ' . $resp->as_string( "\015\012" ) );
909 0         0 last;
910             }
911            
912 0         0 $client->print( 'HTTP/1.1 ' . $resp->as_string( "\015\012" ) );
913             # we don't support keep-alive
914 0         0 close( $client );
915             }
916             # exit child
917 0         0 exit(0);
918             }
919             }
920              
921             sub stop
922             {
923 1     1 1 6792 my $self = shift( @_ );
924 1 50       22 return( $self->error( "Mock server not started" ) ) unless( $self->{pid} );
925 1         82 kill( 2, $self->{pid} );
926 1         2804342 waitpid( $self->{pid}, 0 );
927 1         36 delete( $self->{pid} );
928             }
929              
930             sub url_base
931             {
932 1     1 1 1342 my $self = shift( @_ );
933 1         22 my $host = $self->host;
934 1         37 my $port = $self->port;
935 1         108 return( URI->new( "http://${host}:${port}" ) );
936             }
937              
938             # NOTE: GET /v1/activity
939             sub _GetActivity
940             {
941 2     2   797294 my $self = shift( @_ );
942 2         19 my $opts = $self->_get_args_as_hash( @_ );
943 2         414 my $def = $opts->{def};
944 2   50     19 my $data = $self->data ||
945             return( $self->error( "No mock data could be found." ) );
946 2   50     31 my $lang = $opts->{lang} || DEFAULT_LANG;
947 2   50     15 my $req = $opts->{request} || return( $self->error( "No request object was provided." ) );
948 2         39 my $form = $req->as_form_data;
949 2         12556 my $activity = [];
950 2         45 for( 0..23 )
951             {
952 48         95 push( @$activity, int( rand(30 ) ) + 1 );
953             }
954 2         26 my $payload = $self->json->encode( { activity => $activity } );
955 2         229 my $resp = HTTP::Promise::Response->new( 200, HTTP::Promise::Status->status_message( 200 => $lang ), [
956             @STANDARD_HEADERS,
957             Content_Type => 'application/json',
958             Content_Length => length( $payload ),
959             Date => $self->_date_now,
960             ], $payload,
961             );
962 2         3202 return( $resp );
963             }
964              
965             {
966 3     3   51 no warnings 'once';
  3         10  
  3         474  
967             # NOTE: POST /v1/activity
968             # NOTE: sub _PostActivity
969             *_PostActivity = \&_GetActivity;
970             }
971              
972             # NOTE: GET /v1/author
973             sub _GetAuthor
974             {
975 6     6   95931 my $self = shift( @_ );
976 6         35 my $opts = $self->_get_args_as_hash( @_ );
977             return( $self->_search( %$opts, type => 'author', total => 14410, callback => sub
978             {
979 6     6   12 my $this = shift( @_ );
980             return({
981             _id => $this->{user},
982 6         57 _index => 'cpan_v1_01',
983             _score => 1,
984             _source => $this,
985             _type => 'author',
986             });
987 6         1035 }) );
988             }
989              
990             {
991 3     3   29 no warnings 'once';
  3         37  
  3         1506  
992             # NOTE: POST /v1/author
993             # NOTE: sub _PostAuthor
994             *_PostAuthor = \&_GetAuthor;
995             }
996              
997             # NOTE: GET /v1/author/by_ids
998             # /author/by_ids?id=PAUSE_ID1&id=PAUSE_ID2...
999             sub _GetAuthorByPauseID
1000             {
1001 2     2   48497 my $self = shift( @_ );
1002 2         8 my $opts = $self->_get_args_as_hash( @_ );
1003 2         321 my $def = $opts->{def};
1004 2   50     13 my $data = $self->data ||
1005             return( $self->error( "No mock data could be found." ) );
1006 2   50     85 my $lang = $opts->{lang} || DEFAULT_LANG;
1007 2   50     10 my $req = $opts->{request} || return( $self->error( "No request object was provided." ) );
1008 2         9 my $form = $req->as_form_data;
1009 2 50       9658 if( !exists( $form->{id} ) )
1010             {
1011 0         0 return( $self->error({ code => 400, message => "Missing param: id" }) );
1012             }
1013 2 50       64 my $ids = ref( $form->{id} ) eq 'ARRAY' ? $form->{id} : [$form->{id}];
1014 2         123 my $authors = [];
1015 2         12 foreach my $id ( @$ids )
1016             {
1017 2 50       16 next if( !exists( $data->{users}->{ $id } ) );
1018 2 50       11 $data->{users}->{ $id }->{is_pause_custodial_account} = \0 unless( exists( $data->{users}->{ $id }->{is_pause_custodial_account} ) );
1019 2         7 push( @$authors, $data->{users}->{ $id } );
1020             }
1021 2         10 my $res =
1022             {
1023             took => 2,
1024             total => scalar( @$authors ),
1025             authors => $authors,
1026             };
1027 2         15 my $payload = $self->json->encode( $res );
1028 2         417 my $resp = HTTP::Promise::Response->new( 200, HTTP::Promise::Status->status_message( 200 => $lang ), [
1029             @STANDARD_HEADERS,
1030             Content_Type => 'application/json',
1031             Content_Length => length( $payload ),
1032             Date => $self->_date_now,
1033             ], $payload,
1034             );
1035 2         2654 return( $resp );
1036             }
1037              
1038             {
1039 3     3   25 no warnings 'once';
  3         6  
  3         1113  
1040             # NOTE: POST /v1/author/by_ids
1041             # NOTE: sub _PostAuthorByPauseID
1042             *_PostAuthorByPauseID = \&_GetAuthorByPauseID;
1043             }
1044              
1045             # NOTE: GET /v1/author/by_prefix/{prefix}
1046             sub _GetAuthorByPrefix
1047             {
1048 2     2   88479 my $self = shift( @_ );
1049 2         20 my $opts = $self->_get_args_as_hash( @_ );
1050 2         341 my $def = $opts->{def};
1051 2   50     12 my $data = $self->data ||
1052             return( $self->error( "No mock data could be found." ) );
1053 2   50     24 my $lang = $opts->{lang} || DEFAULT_LANG;
1054 2   50     9 my $req = $opts->{request} || return( $self->error( "No request object was provided." ) );
1055 2         10 my $form = $req->as_form_data;
1056 2         6850 my $vars = $opts->{vars};
1057             my $prefix = $vars->{prefix} ||
1058 2   50     12 return( $self->error({ code => 404, message => 'The requested info could not be found' }) );
1059 2         4 my $authors = [];
1060 2   50     9 my $from = $form->{from} // 0;
1061 2   50     64 my $size = $form->{size} // 10;
1062 2         74 my $n = -1;
1063 2         10 foreach my $user ( sort( keys( %{$data->{users}} ) ) )
  2         43  
1064             {
1065 4 100       18 last unless( index( $user, $prefix ) == 0 );
1066 2         4 $n++;
1067 2 50       6 next unless( $from == $n );
1068 2         21 push( @$authors, $data->{users}->{ $user } );
1069 2 50       9 last if( scalar( @$authors ) == $size );
1070             }
1071 2         29 my $res =
1072             {
1073             took => 2,
1074             total => scalar( @$authors ),
1075             authors => $authors,
1076             };
1077 2         7 my $payload = $self->json->encode( $res );
1078 2         449 my $resp = HTTP::Promise::Response->new( 200, HTTP::Promise::Status->status_message( 200 => $lang ), [
1079             @STANDARD_HEADERS,
1080             Content_Type => 'application/json',
1081             Content_Length => length( $payload ),
1082             Date => $self->_date_now,
1083             ], $payload,
1084             );
1085 2         2748 return( $resp );
1086             }
1087              
1088             {
1089 3     3   23 no warnings 'once';
  3         8  
  3         1269  
1090             # NOTE: POST /v1/author/by_prefix/{prefix}
1091             # NOTE: sub _PostAuthorByPrefix
1092             *_PostAuthorByPrefix = \&_GetAuthorByPrefix;
1093             }
1094              
1095             # NOTE: GET /v1/author/by_user
1096             sub _GetAuthorByUserIDQuery
1097             {
1098 2     2   48033 my $self = shift( @_ );
1099 2         13 my $opts = $self->_get_args_as_hash( @_ );
1100 2         350 my $def = $opts->{def};
1101 2   50     15 my $data = $self->data ||
1102             return( $self->error( "No mock data could be found." ) );
1103 2   50     46 my $lang = $opts->{lang} || DEFAULT_LANG;
1104 2   50     17 my $req = $opts->{request} || return( $self->error( "No request object was provided." ) );
1105 2         10 my $form = $req->as_form_data;
1106 2 50 33     10060 return( $self->error({ code => 400, message => 'Missing param: user' } ) ) if( !exists( $form->{user} ) || !length( $form->{user} ) );
1107 2 50       114 my $user_id = ref( $form->{user} ) eq 'ARRAY' ? $form->{user} : [$form->{user}];
1108 2         100 my $need = {};
1109 2         22 @$need{ @$user_id } = (1) x scalar( @$user_id );
1110            
1111 2         9 my $authors = [];
1112            
1113 2         6 foreach my $user ( keys( %{$data->{users}} ) )
  2         26  
1114             {
1115 60 50       211 if( exists( $need->{ $data->{users}->{ $user }->{user} } ) )
1116             {
1117 0         0 push( @$authors, $data->{users}->{ $user } );
1118             }
1119             }
1120              
1121 2         21 my $res =
1122             {
1123             took => 2,
1124             total => scalar( @$authors ),
1125             authors => $authors,
1126             };
1127 2         13 my $payload = $self->json->encode( $res );
1128 2         95 my $resp = HTTP::Promise::Response->new( 200, HTTP::Promise::Status->status_message( 200 => $lang ), [
1129             @STANDARD_HEADERS,
1130             Content_Type => 'application/json',
1131             Content_Length => length( $payload ),
1132             Date => $self->_date_now,
1133             ], $payload,
1134             );
1135 2         2628 return( $resp );
1136             }
1137              
1138             {
1139 3     3   24 no warnings 'once';
  3         6  
  3         1663  
1140             # NOTE: POST /v1/author/by_user
1141             # NOTE: sub _PostAuthorByUserIDQuery
1142             *_PostAuthorByUserIDQuery = \&_GetAuthorByUserIDQuery;
1143             }
1144              
1145             # NOTE: GET /v1/author/by_user/{user}
1146             sub _GetAuthorByUserID
1147             {
1148 2     2   88949 my $self = shift( @_ );
1149 2         9 my $opts = $self->_get_args_as_hash( @_ );
1150 2         323 my $def = $opts->{def};
1151 2   50     9 my $data = $self->data ||
1152             return( $self->error( "No mock data could be found." ) );
1153 2   50     25 my $lang = $opts->{lang} || DEFAULT_LANG;
1154 2   50     9 my $req = $opts->{request} || return( $self->error( "No request object was provided." ) );
1155 2         9 my $form = $req->as_form_data;
1156 2         6748 my $vars = $opts->{vars};
1157             my $user = $vars->{user} ||
1158 2   50     19 return( $self->error({ code => 404, message => 'The requested info could not be found' }) );
1159 2         8 my $authors = [];
1160 2 50       8 push( @$authors, $data->{users}->{ $user } ) if( exists( $data->{users}->{ $user } ) );
1161 2         16 my $res =
1162             {
1163             took => 2,
1164             total => scalar( @$authors ),
1165             authors => $authors,
1166             };
1167 2         7 my $payload = $self->json->encode( $res );
1168 2         85 my $resp = HTTP::Promise::Response->new( 200, HTTP::Promise::Status->status_message( 200 => $lang ), [
1169             @STANDARD_HEADERS,
1170             Content_Type => 'application/json',
1171             Content_Length => length( $payload ),
1172             Date => $self->_date_now,
1173             ], $payload,
1174             );
1175 2         2565 return( $resp );
1176             }
1177              
1178             {
1179 3     3   286 no warnings 'once';
  3         19  
  3         860  
1180             # NOTE: POST /v1/author/by_user/{user}
1181             # NOTE: sub _PostAuthorByUserID
1182             *_PostAuthorByUserID = \&_GetAuthorByUserID;
1183             }
1184              
1185             # NOTE: GET /v1/author/{author}
1186             sub _GetAuthorProfile
1187             {
1188 2     2   88249 my $self = shift( @_ );
1189 2         12 my $opts = $self->_get_args_as_hash( @_ );
1190 2         337 my $def = $opts->{def};
1191 2   50     7 my $data = $self->data ||
1192             return( $self->error( "No mock data could be found." ) );
1193 2   50     22 my $lang = $opts->{lang} || DEFAULT_LANG;
1194 2   50     9 my $req = $opts->{request} || return( $self->error( "No request object was provided." ) );
1195 2         10 my $form = $req->as_form_data;
1196 2         6977 my $vars = $opts->{vars};
1197             my $author = $vars->{author} ||
1198 2   50     9 return( $self->_GetAuthor( %$opts ) );
1199 2 50       9 unless( exists( $data->{users}->{ $author } ) )
1200             {
1201 0         0 return( $self->error({ code => 404, message => 'The requested info could not be found' }) );
1202             }
1203 2         6 my $payload = $self->json->encode( $data->{users}->{ $author } );
1204 2         443 my $resp = HTTP::Promise::Response->new( 200, HTTP::Promise::Status->status_message( 200 => $lang ), [
1205             @STANDARD_HEADERS,
1206             Content_Type => 'application/json',
1207             Content_Length => length( $payload ),
1208             Date => $self->_date_now,
1209             ], $payload,
1210             );
1211 2         2599 return( $resp );
1212             }
1213              
1214             {
1215 3     3   22 no warnings 'once';
  3         5  
  3         1044  
1216             # NOTE: POST /v1/author/{author}
1217             # NOTE: sub _PostAuthorProfile
1218             *_PostAuthorProfile = \&_GetAuthorProfile;
1219            
1220             # NOTE: GET /v1/author/_mapping
1221             # GetAuthorMapping is accessed directly in the data
1222              
1223             # NOTE: POST /v1/author/_mapping
1224             # PostAuthorMapping is accessed directly in the data
1225              
1226             # NOTE: GET /v1/author/_search
1227             # NOTE: POST /v1/author/_search
1228             # NOTE: sub _GetAuthorSearch
1229             # NOTE: sub _PostAuthorSearch
1230             *_GetAuthorSearch = \&_GetAuthor;
1231             *_PostAuthorSearch = \&_GetAuthor;
1232             }
1233              
1234             # NOTE: DELETE /v1/author/_search/scroll
1235             # TODO: Need to find out exactly what this endpoint returns
1236             sub _DeleteAuthorSearchScroll
1237             {
1238 1     1   45412 my $self = shift( @_ );
1239 1         4 my $opts = $self->_get_args_as_hash( @_ );
1240 1         172 my $def = $opts->{def};
1241 1   50     6 my $data = $self->data ||
1242             return( $self->error( "No mock data could be found." ) );
1243 1   50     22 my $lang = $opts->{lang} || DEFAULT_LANG;
1244 1   50     14 my $req = $opts->{request} || return( $self->error( "No request object was provided." ) );
1245 1         8 my $form = $req->as_form_data;
1246 1         3889 my $msg = { code => 501, message => 'Not implemented' };
1247 1         5 my $payload = $self->json->encode( $msg );
1248 1         43 my $resp = HTTP::Promise::Response->new( $msg->{code}, HTTP::Promise::Status->status_message( $msg->{code} => $lang ), [
1249             @STANDARD_HEADERS,
1250             Content_Type => 'application/json',
1251             Content_Length => length( $payload ),
1252             Date => $self->_date_now,
1253             ], $payload,
1254             );
1255 1         1267 return( $resp );
1256             }
1257              
1258             # NOTE: GET /v1/author/_search/scroll
1259             sub _GetAuthorSearchScroll
1260             {
1261 2     2   46235 my $self = shift( @_ );
1262 2         20 my $opts = $self->_get_args_as_hash( @_ );
1263 2         315 $opts->{scroll} = 1;
1264 2         13 return( $self->_GetAuthorSearch( %$opts ) );
1265             }
1266              
1267             {
1268 3     3   22 no warnings 'once';
  3         6  
  3         1638  
1269             # NOTE: POST /v1/author/_search/scroll
1270             # NOTE: sub _PostAuthorSearchScroll
1271             *_PostAuthorSearchScroll = \&_GetAuthorSearchScroll;
1272             }
1273              
1274             # NOTE: GET /v1/changes/by_releases
1275             sub _GetChangesFileByRelease
1276             {
1277 2     2   47526 my $self = shift( @_ );
1278 2         12 my $opts = $self->_get_args_as_hash( @_ );
1279 2         293 my $def = $opts->{def};
1280 2   50     8 my $data = $self->data ||
1281             return( $self->error( "No mock data could be found." ) );
1282 2   50     15 my $lang = $opts->{lang} || DEFAULT_LANG;
1283 2   50     7 my $req = $opts->{request} || return( $self->error( "No request object was provided." ) );
1284 2         9 my $form = $req->as_form_data;
1285             # e.g.: /v1/changes/by_releases/?release=OALDERS/HTTP-Message-6.37 or /v1/changes/by_releases/?release=OALDERS/HTTP-Message-6.37&release=JDEGUEST/Module-Generic-v0.30.1
1286 2 50 33     9715 if( !exists( $form->{release} ) ||
1287             !length( $form->{release} ) )
1288             {
1289 0         0 return( $self->error({ code => 400, message => 'Missing param: release' }) );
1290             }
1291 2 50       123 my $releases = ref( $form->{release} ) eq 'ARRAY' ? $form->{release} : [$form->{release}];
1292 2         86 my $changes = [];
1293            
1294 2         13 foreach my $release ( @$releases )
1295             {
1296 2         23 my( $author, $distrib ) = split( /\//, $release, 2 );
1297 2         17 my @parts = split( /-/, $distrib );
1298 2         5 my $version = pop( @parts );
1299 2         6 my $module = join( '::', @parts );
1300 2 50 33     17 if( exists( $data->{users}->{ $author } ) &&
1301             exists( $data->{users}->{ $author }->{modules}->{ $module } ) )
1302             {
1303 2         9 my $this = $data->{users}->{ $author }->{modules}->{ $module };
1304 2         18 push( @$changes,
1305             {
1306             author => $author,
1307             changes_file => 'Changes',
1308             changes_text => qq{Changes file for $module\n\n${version} 2023-08-15T09:12:17\n\n - New stuff},
1309             release => $distrib,
1310             });
1311             }
1312             }
1313            
1314 2         6 my $result =
1315             {
1316             changes => $changes,
1317             };
1318 2         6 my $payload = $self->json->encode( $result );
1319 2         87 my $resp = HTTP::Promise::Response->new( 200, HTTP::Promise::Status->status_message( 200 => $lang ), [
1320             @STANDARD_HEADERS,
1321             Content_Type => 'application/json',
1322             Content_Length => length( $payload ),
1323             Date => $self->_date_now,
1324             ], $payload,
1325             );
1326 2         2551 return( $resp );
1327             }
1328              
1329             {
1330             # NOTE: POST /v1/changes/by_releases
1331 3     3   23 no warnings 'once';
  3         6  
  3         1289  
1332             *_PostChangesFileByRelease = \&_GetChangesFileByRelease;
1333             }
1334              
1335             # NOTE: GET /v1/changes/{distribution}
1336             sub _GetChangesFile
1337             {
1338 2     2   86408 my $self = shift( @_ );
1339 2         10 my $opts = $self->_get_args_as_hash( @_ );
1340 2         283 my $def = $opts->{def};
1341 2   50     8 my $data = $self->data ||
1342             return( $self->error( "No mock data could be found." ) );
1343 2   50     13 my $lang = $opts->{lang} || DEFAULT_LANG;
1344 2   50     6 my $req = $opts->{request} || return( $self->error( "No request object was provided." ) );
1345 2         7 my $form = $req->as_form_data;
1346 2         6494 my $vars = $opts->{vars};
1347             my $dist = $vars->{distribution} ||
1348 2   50     12 return( $self->error({ code => 404, message => 'Not found' }) );
1349 2         18 ( my $package = $dist ) =~ s/-/::/g;
1350 2         21 $self->message( 4, "Searching for package '$package' ($dist)" );
1351 2         60 my $info;
1352 2         3 foreach my $user ( keys( %{$data->{users}} ) )
  2         17  
1353             {
1354 52 100 66     263 if( exists( $data->{users}->{ $user }->{modules} ) &&
      100        
1355             ref( $data->{users}->{ $user }->{modules} ) eq 'HASH' &&
1356             exists( $data->{users}->{ $user }->{modules}->{ $package } ) )
1357             {
1358 2         10 $info = $self->_make_changes_from_module( $data->{users}->{ $user }->{modules}->{ $package } );
1359 2         4 last;
1360             }
1361             }
1362            
1363 2 50       10 unless( defined( $info ) )
1364             {
1365 0         0 return( $self->error({ code => 404, message => 'Not found' }) );
1366             }
1367 2         6 my $payload = $self->json->encode( $info );
1368 2         97 my $resp = HTTP::Promise::Response->new( 200, HTTP::Promise::Status->status_message( 200 => $lang ), [
1369             @STANDARD_HEADERS,
1370             Content_Type => 'application/json',
1371             Content_Length => length( $payload ),
1372             Date => $self->_date_now,
1373             ], $payload,
1374             );
1375 2         2606 return( $resp );
1376             }
1377              
1378             {
1379             # NOTE: POST /v1/changes/{module}
1380 3     3   26 no warnings 'once';
  3         5  
  3         1276  
1381             *_PostChangesFile = \&_GetChangesFile;
1382             }
1383              
1384             # NOTE: GET /v1/changes/{author}/{release}
1385             sub _GetChangesFileAuthor
1386             {
1387 2     2   89409 my $self = shift( @_ );
1388 2         16 my $opts = $self->_get_args_as_hash( @_ );
1389 2         478 my $def = $opts->{def};
1390 2   50     9 my $data = $self->data ||
1391             return( $self->error( "No mock data could be found." ) );
1392 2   50     20 my $lang = $opts->{lang} || DEFAULT_LANG;
1393 2   50     12 my $req = $opts->{request} || return( $self->error( "No request object was provided." ) );
1394 2         117 my $form = $req->as_form_data;
1395 2         8098 my $vars = $opts->{vars};
1396             my $author = $vars->{author} ||
1397 2   50     11 return( $self->error({ code => 400, message => 'Missing param: author' }) );
1398             my $release = $vars->{release} ||
1399 2   50     263 return( $self->error({ code => 400, message => 'Missing param: release' }) );
1400 2         15 my @parts = split( /-/, $release );
1401 2         6 my $version = pop( @parts );
1402 2         8 my $module = join( '::', @parts );
1403 2         4 my $details;
1404 2 50 33     23 if( exists( $data->{users}->{ $author } ) &&
1405             exists( $data->{users}->{ $author }->{modules}->{ $module } ) )
1406             {
1407 2         15 $details = $self->_make_changes_from_module( $data->{users}->{ $author }->{modules}->{ $module } );
1408             }
1409             else
1410             {
1411 0         0 return( $self->error({ code => 404, message => 'Not found' }) );
1412             }
1413            
1414 2         7 my $payload = $self->json->encode( $details );
1415 2         98 my $resp = HTTP::Promise::Response->new( 200, HTTP::Promise::Status->status_message( 200 => $lang ), [
1416             @STANDARD_HEADERS,
1417             Content_Type => 'application/json',
1418             Content_Length => length( $payload ),
1419             Date => $self->_date_now,
1420             ], $payload,
1421             );
1422 2         2630 return( $resp );
1423             }
1424              
1425             {
1426 3     3   34 no warnings 'once';
  3         8  
  3         1005  
1427             # NOTE: POST /v1/changes/{author}/{release}
1428             # NOTE: sub _PostChangesFileAuthor
1429             *_PostChangesFileAuthor = \&_GetChangesFileAuthor;
1430             }
1431              
1432             # NOTE: GET /v1/contributor/_mapping
1433             # GetContributorMapping is accessed directly in the data
1434              
1435             # NOTE: POST /v1/contributor/_mapping
1436             # PostContributorMapping is accessed directly in the data
1437              
1438             # NOTE: GET /v1/contributor/by_pauseid/{author}
1439             sub _GetModuleContributedByPauseID
1440             {
1441 2     2   87909 my $self = shift( @_ );
1442 2         12 my $opts = $self->_get_args_as_hash( @_ );
1443 2         332 my $def = $opts->{def};
1444 2   50     16 my $data = $self->data ||
1445             return( $self->error( "No mock data could be found." ) );
1446 2   50     29 my $lang = $opts->{lang} || DEFAULT_LANG;
1447 2   50     21 my $req = $opts->{request} || return( $self->error( "No request object was provided." ) );
1448 2         11 my $form = $req->as_form_data;
1449 2         6874 my $vars = $opts->{vars};
1450             my $author = $vars->{author} ||
1451 2   50     12 return( $self->error({ code => 400, message => 'Missing param: author' }) );
1452             # The requested number of module this author would be contributing to.
1453             # The list of module would be randomly generated and cached.
1454 2   50     8 my $total = $form->{total} || 3;
1455             # By default MetaCPAN API returns an empty hash reference if nothing was found.
1456 2         88 my $res = {};
1457 2 50 33     27 if( exists( $data->{users}->{ $author } ) &&
1458             exists( $data->{users}->{ $author }->{contributions} ) )
1459             {
1460 2         27 $res->{contributors} = $data->{users}->{ $author }->{contributions};
1461             }
1462              
1463 2         11 my $payload = $self->json->encode( $res );
1464 2         101 my $resp = HTTP::Promise::Response->new( 200, HTTP::Promise::Status->status_message( 200 => $lang ), [
1465             @STANDARD_HEADERS,
1466             Content_Type => 'application/json',
1467             Content_Length => length( $payload ),
1468             Date => $self->_date_now,
1469             ], $payload,
1470             );
1471 2         2670 return( $resp );
1472             }
1473              
1474             {
1475 3     3   38 no warnings 'once';
  3         5  
  3         1522  
1476             # NOTE: POST /v1/contributor/by_pauseid/{author}
1477             # NOTE: sub _PostModuleContributedByPauseID
1478             *_PostModuleContributedByPauseID = \&_GetModuleContributedByPauseID;
1479             }
1480              
1481             # NOTE: GET /v1/contributor/{author}/{release}
1482             sub _GetModuleContributors
1483             {
1484 2     2   86488 my $self = shift( @_ );
1485 2         10 my $opts = $self->_get_args_as_hash( @_ );
1486 2         297 my $def = $opts->{def};
1487 2   50     8 my $data = $self->data ||
1488             return( $self->error( "No mock data could be found." ) );
1489 2   50     24 my $lang = $opts->{lang} || DEFAULT_LANG;
1490 2   50     10 my $req = $opts->{request} || return( $self->error( "No request object was provided." ) );
1491 2         9 my $form = $req->as_form_data;
1492 2         6517 my $vars = $opts->{vars};
1493             my $author = $vars->{author} ||
1494 2   50     10 return( $self->error({ code => 400, message => 'Missing param: author' }) );
1495             my $release = $vars->{release} ||
1496 2   50     8 return( $self->error({ code => 400, message => 'Missing param: release' }) );
1497 2         14 my @parts = split( /-/, $release );
1498 2         7 my $version = pop( @parts );
1499 2         10 my $dist = join( '-', @parts );
1500 2         8 my $package = join( '::', @parts );
1501 2         10 my $res = { contributors => [] };
1502 2 0 33     14 if( exists( $data->{users}->{modules} ) &&
      33        
      0        
      0        
      0        
1503             ref( $data->{users}->{modules} ) eq 'HASH' &&
1504             exists( $data->{users}->{modules}->{ $package } ) &&
1505             ref( $data->{users}->{modules}->{ $package } ) eq 'HASH' &&
1506             exists( $data->{users}->{modules}->{ $package }->{contributors} ) &&
1507             ref( $data->{users}->{modules}->{ $package }->{contributors} ) eq 'ARRAY' )
1508             {
1509 0         0 foreach my $user ( @{$data->{users}->{ $author }->{modules}->{ $package }->{contributors}} )
  0         0  
1510             {
1511 0         0 push( @{$res->{contributors}},
  0         0  
1512             {
1513             distribution => $dist,
1514             pauseid => $user,
1515             release_author => $author,
1516             release_name => $release,
1517             });
1518             }
1519             }
1520            
1521 2         6 my $payload = $self->json->encode( $res );
1522 2         75 my $resp = HTTP::Promise::Response->new( 200, HTTP::Promise::Status->status_message( 200 => $lang ), [
1523             @STANDARD_HEADERS,
1524             Content_Type => 'application/json',
1525             Content_Length => length( $payload ),
1526             Date => $self->_date_now,
1527             ], $payload,
1528             );
1529 2         2561 return( $resp );
1530             }
1531              
1532             {
1533 3     3   21 no warnings 'once';
  3         6  
  3         1251  
1534             # NOTE: POST /v1/contributor/{author}/{release}
1535             # NOTE: sub _PostModuleContributors
1536             *_PostModuleContributors = \&_GetModuleContributors;
1537             }
1538              
1539             # NOTE: GET /v1/cover/{release}
1540             sub _GetModuleCover
1541             {
1542 2     2   87150 my $self = shift( @_ );
1543 2         11 my $opts = $self->_get_args_as_hash( @_ );
1544 2         303 my $def = $opts->{def};
1545 2   50     7 my $data = $self->data ||
1546             return( $self->error( "No mock data could be found." ) );
1547 2   50     14 my $lang = $opts->{lang} || DEFAULT_LANG;
1548 2   50     7 my $req = $opts->{request} || return( $self->error( "No request object was provided." ) );
1549 2         9 my $form = $req->as_form_data;
1550 2         6618 my $vars = $opts->{vars};
1551             my $release = $vars->{release} ||
1552 2   50     11 return( $self->error({ code => 400, message => 'Missing param: release' }) );
1553 2         19 my @parts = split( /-/, $release );
1554 2         9 my $version = pop( @parts );
1555 2         7 my $dist = join( '-', @parts );
1556 2         5 my $package = join( '::', @parts );
1557 2         6 my $res = {};
1558 2         4 foreach my $user ( keys( %{$data->{users}} ) )
  2         23  
1559             {
1560 52 100       158 if( exists( $data->{users}->{ $user }->{modules}->{ $package } ) )
1561             {
1562 2         47 $res =
1563             {
1564             criteria =>
1565             {
1566             branch => 54.68,
1567             total => 67.65,
1568             condition => 57.56,
1569             statement => 78.14,
1570             },
1571             version => $version,
1572             distribution => $dist,
1573             url => "http://cpancover.com/latest/${release}/index.html",
1574             release => $release,
1575             };
1576 2         5 last;
1577             }
1578             }
1579 2         9 my $payload = $self->json->encode( $res );
1580 2         99 my $resp = HTTP::Promise::Response->new( 200, HTTP::Promise::Status->status_message( 200 => $lang ), [
1581             @STANDARD_HEADERS,
1582             Content_Type => 'application/json',
1583             Content_Length => length( $payload ),
1584             Date => $self->_date_now,
1585             ], $payload,
1586             );
1587 2         2630 return( $resp );
1588             }
1589              
1590             {
1591 3     3   21 no warnings 'once';
  3         8  
  3         171  
1592             # NOTE: POST /v1/cover/{release}
1593             # NOTE: sub _PostModuleCover
1594             *_PostModuleCover = \&_GetModuleCover;
1595             }
1596              
1597             {
1598 3     3   20 no warnings 'once';
  3         7  
  3         2349  
1599             # NOTE: sub _GetCVE for endpoint /v1/cve is skipped because I could not find any data returned for Common Vulnerabilities & Exposures
1600            
1601             # NOTE: sub _PostCVE for endpoint /v1/cve is skipped because I could not find any data returned for Common Vulnerabilities & Exposures
1602              
1603             # NOTE: sub _GetCVEByDistribution for endpoint /v1/cve/dist/{distribution} is skipped because I could not find any data returned for Common Vulnerabilities & Exposures
1604            
1605             # NOTE: sub _PostCVEByDistribution for endpoint /v1/cve/dist/{distribution} is skipped because I could not find any data returned for Common Vulnerabilities & Exposures
1606              
1607             # NOTE: sub _GetCVEByAuthorRelease for endpoint /v1/cve/release/{author}/{release} is skipped because I could not find any data returned for Common Vulnerabilities & Exposures
1608              
1609             # NOTE: sub _PostCVEByAuthorRelease for endpoint /v1/cve/release/{author}/{release} is skipped because I could not find any data returned for Common Vulnerabilities & Exposures
1610              
1611             # NOTE: sub _GetCVEByCpanID for endpoint /v1/cve/{cpanid} is skipped because I could not find any data returned for Common Vulnerabilities & Exposures
1612              
1613             # NOTE: sub _PostCVEByCpanID for endpoint /v1/cve/{cpanid} is skipped because I could not find any data returned for Common Vulnerabilities & Exposures
1614             }
1615              
1616             # NOTE: GET /v1/diff/release/{distribution}
1617             sub _GetReleaseDiff
1618             {
1619 2     2   87534 my $self = shift( @_ );
1620 2         12 my $opts = $self->_get_args_as_hash( @_ );
1621 2         349 my $def = $opts->{def};
1622 2   50     15 my $data = $self->data ||
1623             return( $self->error( "No mock data could be found." ) );
1624 2   50     20 my $lang = $opts->{lang} || DEFAULT_LANG;
1625 2   50     9 my $req = $opts->{request} || return( $self->error( "No request object was provided." ) );
1626 2         13 my $form = $req->as_form_data;
1627 2         6785 my $vars = $opts->{vars};
1628             my $dist = $vars->{distribution} ||
1629 2   50     10 return( $self->error({ code => 400, message => 'Missing param: distribution' }) );
1630 2         20 ( my $package = $dist ) =~ s/-/::/g;
1631 2         9 my $res;
1632              
1633 2         6 foreach my $user ( keys( %{$data->{users}} ) )
  2         19  
1634             {
1635 52 50       120 next unless( exists( $data->{users}->{ $user }->{modules} ) );
1636 52 100       121 if( exists( $data->{users}->{ $user }->{modules}->{ $package } ) )
1637             {
1638 2         8 my $this = $data->{users}->{ $user }->{modules}->{ $package };
1639 2         21 my $vers = Changes::Version->parse( $this->{version} );
1640 2         155131 my $prev = $vers - 1;
1641 2         177558 my $rel = $this->{release};
1642 2         14 my $prev_rel = "${dist}-${prev}";
1643 2         9775 my $now = DateTime->now;
1644 2         1030 my $today = $now->strftime( '%Y-%m-%d' );
1645 2         174 my $before = $now->clone->subtract( days => 10 )->strftime( '%Y-%m-%d' );
1646 2         2974 ( my $path = $package ) =~ s,::,/,g;
1647 2         8 $path .= '.pm';
1648             my $tags =
1649             {
1650             before => $before,
1651             next_rel => $rel,
1652             path1 => $path,
1653             path2 => $path,
1654             prev => $prev,
1655             prev_rel => $prev_rel,
1656             rel => $rel,
1657             today => $today,
1658             vers => $vers,
1659             distribution => $dist,
1660             author => $this->{author},
1661 2         33 };
1662 2         18 my $type = $req->headers->type;
1663 2         247 my $acceptables = $req->headers->acceptables;
1664 2         7410 my $accept = $acceptables->match( [qw( application/json text/plain )] );
1665 2         77207 my $return_type;
1666 2 50 66     33 if( ( defined( $type ) && $type eq 'text/plain' ) ||
      33        
      33        
1667             ( !$accept->is_empty && $accept->first eq 'text/plain' ) )
1668             {
1669 0         0 $return_type = 'text/plain';
1670             }
1671             else
1672             {
1673 2         292 $return_type = 'application/json';
1674             }
1675            
1676 2 50       13 if( $return_type eq 'text/plain' )
1677             {
1678 0         0 $res = $DIFF_RAW_TEMPLATE;
1679             }
1680             else
1681             {
1682 2         7 $res = $DIFF_JSON_TEMPLATE;
1683             }
1684             # $res =~ s/\$\{([^\}]+)\}/$tags->{ $1 }/gs;
1685 2         57 $res =~ s
1686             {
1687             \$\{([^\}]+)\}
1688             }
1689 168 50       754 {
1690 168         551 warn( "No tag '$1' found." ) if( !exists( $tags->{ $1 } ) );
1691             $tags->{ $1 }
1692 2         20 }gexs;
1693             last;
1694             }
1695             }
1696 2 50       1711
1697             if( defined( $res ) )
1698 2         22 {
1699             my $resp = HTTP::Promise::Response->new( 200, HTTP::Promise::Status->status_message( 200 => $lang ), [
1700             @STANDARD_HEADERS,
1701             Content_Type => 'text/plain; charset=UTF-8',
1702             Content_Length => length( $res ),
1703             Date => $self->_date_now,
1704             ], $res,
1705 2         3378 );
1706             return( $resp );
1707             }
1708             else
1709 0         0 {
1710 0         0 my $payload = $self->json->encode({ message => $dist, code => 404 });
1711             my $resp = HTTP::Promise::Response->new( 404, HTTP::Promise::Status->status_message( 404 => $lang ), [
1712             @STANDARD_HEADERS,
1713             Content_Type => 'application/json',
1714             Content_Length => length( $payload ),
1715             Date => $self->_date_now,
1716             ], $payload,
1717 0         0 );
1718             return( $resp );
1719             }
1720             }
1721              
1722 3     3   30 {
  3         5  
  3         2469  
1723             no warnings 'once';
1724             # NOTE: POST /v1/diff/release/{distribution}
1725             # NOTE: sub _PostReleaseDiff
1726             *_PostReleaseDiff = \&_GetReleaseDiff
1727             }
1728              
1729             # NOTE: GET /v1/diff/release/{author1}/{release1}/{author2}/{release2}
1730             sub _Get2ReleasesDiff
1731 2     2   87558 {
1732 2         8 my $self = shift( @_ );
1733 2         315 my $opts = $self->_get_args_as_hash( @_ );
1734 2   50     8 my $def = $opts->{def};
1735             my $data = $self->data ||
1736 2   50     25 return( $self->error( "No mock data could be found." ) );
1737 2   50     13 my $lang = $opts->{lang} || DEFAULT_LANG;
1738 2         10 my $req = $opts->{request} || return( $self->error( "No request object was provided." ) );
1739 2         6689 my $form = $req->as_form_data;
1740             my $vars = $opts->{vars};
1741 2   50     9 my $author1 = $vars->{author1} ||
1742             return( $self->error({ code => 400, message => 'Missing parameter: author1' }) );
1743 2   50     14 my $author2 = $vars->{author2} ||
1744             return( $self->error({ code => 400, message => 'Missing parameter: author2' }) );
1745 2   50     12 my $rel1 = $vars->{release1} ||
1746             return( $self->error({ code => 400, message => 'Missing parameter: release1' }) );
1747 2   50     7 my $rel2 = $vars->{release2} ||
1748 2         20 return( $self->error({ code => 400, message => 'Missing parameter: release2' }) );
1749 2         6 my @parts = split( /-/, $rel1 );
1750 2         16 my $vers1 = pop( @parts );
1751 2         9 my $package1 = join( '::', @parts );
1752 2         5 @parts = split( /-/, $rel2 );
1753 2         4 my $vers2 = pop( @parts );
1754 2         5 my $package2 = join( '::', @parts );
1755             my $res;
1756 2 50 33     71  
      33        
      33        
      33        
      33        
      33        
      33        
1757             if( exists( $data->{users}->{ $author1 } ) &&
1758             exists( $data->{users}->{ $author2 } ) &&
1759             exists( $data->{users}->{ $author1 }->{modules} ) &&
1760             exists( $data->{users}->{ $author2 }->{modules} ) &&
1761             ref( $data->{users}->{ $author1 }->{modules} ) eq 'HASH' &&
1762             ref( $data->{users}->{ $author2 }->{modules} ) eq 'HASH' &&
1763             exists( $data->{users}->{ $author1 }->{modules}->{ $package1 } ) &&
1764             exists( $data->{users}->{ $author2 }->{modules}->{ $package2 } ) )
1765             # $data->{users}->{ $author1 }->{modules}->{ $package1 }->{release} eq $rel1 &&
1766             # $data->{users}->{ $author2 }->{modules}->{ $package2 }->{release} eq $rel2 )
1767 2         14 {
1768 2         613 my $now = DateTime->now;
1769 2         132 my $today = $now->strftime( '%Y-%m-%d' );
1770 2         2482 my $before = $now->clone->subtract( days => 10 )->strftime( '%Y-%m-%d' );
1771 2         9 ( my $path1 = $package1 ) =~ s,::,/,g;
1772 2         12 $path1 .= '.pm';
1773 2         5 ( my $path2 = $package2 ) =~ s,::,/,g;
1774 2         23 $path2 .= '.pm';
1775             my $tags =
1776             {
1777             before => $before,
1778             next_rel => $rel2,
1779             path1 => $path1,
1780             path2 => $path2,
1781             prev => $vers1,
1782             prev_rel => $rel1,
1783             rel => $rel2,
1784             today => $today,
1785             vers => $vers2,
1786             author => $author1,
1787             author1 => $author1,
1788             author2 => $author2,
1789             release1 => $rel1,
1790             release2 => $rel2,
1791 2         8 };
1792 2         194 my $type = $req->headers->type;
1793 2         6969 my $acceptables = $req->headers->acceptables;
1794 2         76423 my $accept = $acceptables->match( [qw( application/json text/plain )] );
1795 2 50 66     38 my $return_type;
      33        
      33        
1796             if( ( defined( $type ) && $type eq 'text/plain' ) ||
1797             ( !$accept->is_empty && $accept->first eq 'text/plain' ) )
1798 0         0 {
1799             $return_type = 'text/plain';
1800             }
1801             else
1802 2         219 {
1803             $return_type = 'application/json';
1804             }
1805 2 50       9
1806             if( $return_type eq 'text/plain' )
1807 0         0 {
1808             $res = $DIFF_RAW_TEMPLATE;
1809             }
1810             else
1811 2         6 {
1812             $res = $DIFF_JSON_TEMPLATE;
1813             }
1814 2         60 # $res =~ s/\$\{([^\}]+)\}/$tags->{ $1 }/gs;
1815             $res =~ s
1816             {
1817             \$\{([^\}]+)\}
1818 168 50       373 }
1819 168         581 {
1820             warn( "No tag '$1' found." ) if( !exists( $tags->{ $1 } ) );
1821             $tags->{ $1 }
1822             }gexs;
1823 2 50       79 }
1824            
1825 2         15 if( defined( $res ) )
1826             {
1827             my $resp = HTTP::Promise::Response->new( 200, HTTP::Promise::Status->status_message( 200 => $lang ), [
1828             @STANDARD_HEADERS,
1829             Content_Type => 'text/plain; charset=UTF-8',
1830             Content_Length => length( $res ),
1831             Date => $self->_date_now,
1832 2         2661 ], $res,
1833             );
1834             return( $resp );
1835             }
1836 0         0 else
1837             {
1838             my $resp = HTTP::Promise::Response->new( 404, HTTP::Promise::Status->status_message( 404 => $lang ), [
1839             @STANDARD_HEADERS,
1840             Content_Type => 'application/json',
1841             Date => $self->_date_now,
1842 0         0 ],
1843             );
1844             return( $resp );
1845             }
1846             }
1847 3     3   25  
  3         5  
  3         2489  
1848             {
1849             no warnings 'once';
1850             # NOTE: POST /v1/diff/release/{author1}/{release1}/{author2}/{release2}
1851             # NOTE: sub _Post2ReleasesDiff
1852             *_Post2ReleasesDiff = \&_Get2ReleasesDiff;
1853             }
1854              
1855             # NOTE: GET /v1/diff/file/{file1}/{file2}
1856             # e.g.: /v1/diff/file/AcREzFgg3ExIrFTURa0QJfn8nto/Ies7Ysw0GjCxUU6Wj_WzI9s8ysU
1857 2     2   96954 sub _Get2FilesDiff
1858 2         9 {
1859 2         312 my $self = shift( @_ );
1860 2   50     9 my $opts = $self->_get_args_as_hash( @_ );
1861             my $def = $opts->{def};
1862 2   50     21 my $data = $self->data ||
1863 2   50     7 return( $self->error( "No mock data could be found." ) );
1864 2         10 my $lang = $opts->{lang} || DEFAULT_LANG;
1865 2         6584 my $req = $opts->{request} || return( $self->error( "No request object was provided." ) );
1866             my $form = $req->as_form_data;
1867             my $vars = $opts->{vars};
1868 2   50     16 # file ID
1869             my $file1 = $vars->{file1} ||
1870 2   50     10 return( $self->error({ code => 404, message => 'Not found' }) );
1871             my $file2 = $vars->{file2} ||
1872 2         7 return( $self->error({ code => 404, message => 'Not found' }) );
1873            
1874 2         5 my( $ref1, $ref2, $res );
  2         19  
1875              
1876 52 50       135 USERS: foreach my $user ( keys( %{$data->{users}} ) )
1877 52         54 {
  52         359  
1878             next unless( exists( $data->{users}->{ $user }->{modules} ) );
1879 168 100 66     819 foreach my $package ( keys( %{$data->{users}->{ $user }->{modules}} ) )
1880             {
1881             if( !defined( $ref1 ) &&
1882 2         6 $data->{users}->{ $user }->{modules}->{ $package }->{id} eq $file1 )
1883             {
1884 168 100 100     445 $ref1 = $data->{users}->{ $user }->{modules}->{ $package };
1885             }
1886             if( !defined( $ref2 ) &&
1887 2         7 $data->{users}->{ $user }->{modules}->{ $package }->{id} eq $file2 )
1888             {
1889 168 100 66     302 $ref2 = $data->{users}->{ $user }->{modules}->{ $package };
1890             }
1891             last USERS if( defined( $ref1 ) && defined( $ref2 ) );
1892             }
1893 2 50 33     21 }
1894            
1895 2         13 if( defined( $ref1 ) && defined( $ref2 ) )
1896 2         634 {
1897 2         229 my $now = DateTime->now;
1898 2         3955 my $today = $now->strftime( '%Y-%m-%d' );
1899 2         9 my $before = $now->clone->subtract( days => 10 )->strftime( '%Y-%m-%d' );
1900 2         16 my $rel1 = $ref1->{release};
1901 2         7 my $rel2 = $ref2->{release};
1902 2         12 ( my $path1 = $ref1->{package} ) =~ s,::,/,g;
1903 2         6 $path1 .= '.pm';
1904 2         17 ( my $path2 = $ref2->{package} ) =~ s,::,/,g;
1905 2         10 $path2 .= '.pm';
1906             my $vers1 = $ref1->{version};
1907             my $vers2 = $ref2->{version};
1908             my $tags =
1909             {
1910             before => $before,
1911             next_rel => $rel2,
1912             path1 => $path1,
1913             path2 => $path2,
1914             prev => $vers1,
1915             prev_rel => $rel1,
1916             rel => $rel2,
1917             today => $today,
1918             vers => $vers2,
1919             file1 => $file1,
1920 2         40 file2 => $file2,
1921 2   100     13 author => $ref1->{author},
1922 2         213 };
1923 2         17752 my $type = $req->headers->type // 'application/json';
1924 2         75861 my $acceptables = $req->headers->acceptables;
1925 2 50 33     15 my $accept = $acceptables->match( [qw( application/json text/plain )] );
      33        
1926             my $return_type;
1927 0         0 if( $type eq 'text/plain' || ( !$accept->is_empty && $accept->first eq 'text/plain' ) )
1928             {
1929             $return_type = 'text/plain';
1930             }
1931 2         209 else
1932             {
1933             $return_type = 'application/json';
1934 2 50       7 }
1935            
1936 0         0 if( $return_type eq 'text/plain' )
1937             {
1938             $res = $DIFF_RAW_TEMPLATE;
1939             }
1940 2         8 else
1941             {
1942             $res = $DIFF_JSON_TEMPLATE;
1943 2         57 }
1944             # $res =~ s/\$\{([^\}]+)\}/$tags->{ $1 }/gs;
1945             $res =~ s
1946             {
1947 168 50       393 \$\{([^\}]+)\}
1948 168         618 }
1949             {
1950 2         29 warn( "No tag '$1' found." ) if( !exists( $tags->{ $1 } ) );
1951             $tags->{ $1 }
1952             }gexs;
1953             my $resp = HTTP::Promise::Response->new( 200, HTTP::Promise::Status->status_message( 200 => $lang ), [
1954             @STANDARD_HEADERS,
1955             Content_Type => 'text/plain; charset=UTF-8',
1956             Content_Length => length( $res ),
1957 2         2765 Date => $self->_date_now,
1958             ], $res,
1959             );
1960             return( $resp );
1961 0         0 }
1962             else
1963             {
1964             my $resp = HTTP::Promise::Response->new( 404, HTTP::Promise::Status->status_message( 404 => $lang ), [
1965             @STANDARD_HEADERS,
1966             Content_Type => 'application/json',
1967 0         0 Date => $self->_date_now,
1968             ],
1969             );
1970             return( $resp );
1971             }
1972 3     3   28 }
  3         8  
  3         549  
1973              
1974             {
1975             no warnings 'once';
1976             # NOTE: POST /v1/diff/file/{file1}/{file2}
1977             # NOTE: sub _Post2FilesDiff
1978             *_Post2FilesDiff = \&_Get2FilesDiff;
1979             }
1980              
1981 6     6   136078 # NOTE: GET /v1/distribution
1982 6         26 sub _GetDistribution
1983             {
1984             my $self = shift( @_ );
1985 42     42   78 my $opts = $self->_get_args_as_hash( @_ );
1986             return( $self->_search( %$opts, type => 'distribution', total => 44382, callback => sub
1987             {
1988             my $this = shift( @_ );
1989             return({
1990             _id => $this->{name},
1991 42         306 _index => 'cpan_v1_01',
1992             _score => 1,
1993 6         981 _source => { name => $this->{name} },
1994             _type => 'distribution',
1995             });
1996             }) );
1997 3     3   27 }
  3         5  
  3         1477  
1998              
1999             {
2000             no warnings 'once';
2001             # NOTE: POST /v1/distribution
2002             # NOTE: sub _PostDistribution
2003             *_PostDistribution = \&_GetDistribution
2004             }
2005              
2006 2     2   88947 # NOTE: GET /v1/distribution/{distribution}
2007 2         13 sub _GetModuleDistribution
2008 2         364 {
2009 2   50     12 my $self = shift( @_ );
2010             my $opts = $self->_get_args_as_hash( @_ );
2011 2   50     23 my $def = $opts->{def};
2012 2   50     15 my $data = $self->data ||
2013 2         14 return( $self->error( "No mock data could be found." ) );
2014 2         7090 my $lang = $opts->{lang} || DEFAULT_LANG;
2015             my $req = $opts->{request} || return( $self->error( "No request object was provided." ) );
2016 2   50     9 my $form = $req->as_form_data;
2017 2         21 my $vars = $opts->{vars};
2018 2         6 my $dist = $vars->{distribution} ||
2019 2         4 return( $self->error({ code => 400, message => 'Missing param: distribution' }) );
  2         19  
2020             ( my $package = $dist ) =~ s/-/::/g;
2021 52 100 33     313 my $res;
      66        
2022             foreach my $user ( keys( %{$data->{users}} ) )
2023             {
2024             if( exists( $data->{users}->{ $user }->{modules} ) &&
2025 2         70 ref( $data->{users}->{ $user }->{modules} ) eq 'HASH' &&
2026             exists( $data->{users}->{ $user }->{modules}->{ $package } ) )
2027             {
2028             $res =
2029             {
2030             bugs =>
2031             {
2032             github =>
2033             {
2034             active => 56,
2035             closed => 107,
2036             open => 56,
2037             source => "https://github.com/\L${user}\E/${dist}",
2038             },
2039             rt =>
2040             {
2041             active => 0,
2042             closed => 58,
2043             new => 0,
2044             open => 0,
2045             patched => 0,
2046             rejected => 5,
2047             resolved => 53,
2048             source => "https://rt.cpan.org/Public/Dist/Display.html?Name=${dist}",
2049             stalled => 0,
2050             },
2051             },
2052             external_package =>
2053             {
2054             cygwin => "perl-${dist}",
2055             debian => "perl-${dist}",
2056             fedora => "perl-${dist}",
2057             },
2058             name => $dist,
2059             river =>
2060             {
2061             bucket => 4,
2062             bus_factor => 7,
2063             immediate => 1358,
2064 2         9 total => 8529,
2065             },
2066             };
2067             last;
2068 2         8 }
2069 2 50       9 }
2070            
2071 0         0 my $code;
2072 0         0 if( !defined( $res ) )
2073             {
2074             $code = 404;
2075             return( $self->error({ code => $code, message => 'Not found' }) );
2076 2         5 }
2077             else
2078             {
2079 2         9 $code = 200;
2080 2         106 }
2081            
2082             my $payload = $self->json->encode( $res );
2083             my $resp = HTTP::Promise::Response->new( $code, HTTP::Promise::Status->status_message( $code => $lang ), [
2084             @STANDARD_HEADERS,
2085             Content_Type => 'application/json',
2086             Content_Length => length( $payload ),
2087 2         2724 Date => $self->_date_now,
2088             ], $payload,
2089             );
2090             return( $resp );
2091             }
2092 3     3   27  
  3         6  
  3         1532  
2093             {
2094             # NOTE: POST /v1/distribution/{distribution}
2095             no warnings 'once';
2096             # NOTE: sub _PostModuleDistribution
2097             *_PostModuleDistribution = \&_GetModuleDistribution;
2098             }
2099              
2100 4     4   47840 # NOTE: GET /v1/distribution/river?distribution=HTTP-Message&distribution=Module-Generic
2101 4         19 sub _GetModuleDistributionRiverWithQuery
2102 4         662 {
2103 4   50     35 my $self = shift( @_ );
2104             my $opts = $self->_get_args_as_hash( @_ );
2105 4   50     33 my $def = $opts->{def};
2106 4   50     13 my $data = $self->data ||
2107 4         16 return( $self->error( "No mock data could be found." ) );
2108 4 50 66     16367 my $lang = $opts->{lang} || DEFAULT_LANG;
2109 4 50 33     72 my $req = $opts->{request} || return( $self->error( "No request object was provided." ) );
2110             my $form = $req->as_form_data;
2111             $form->{distribution} = $opts->{distribution} if( exists( $opts->{distribution} ) && $opts->{distribution} );
2112 0         0 if( !exists( $form->{distribution} ) ||
2113             !length( $form->{distribution} ) )
2114 4 50       187 {
2115             return( $self->error({ code => 400, message => 'Missing param: distribution' }) );
2116 4         155 }
2117 4         10 my $dists = ref( $form->{distribution} ) eq 'ARRAY' ? $form->{distribution} : [$form->{distribution}];
2118            
2119 4         21 my $res = {};
2120             my $rivers = {};
2121 4         33
2122 4         11 foreach my $dist ( @$dists )
  4         34  
2123             {
2124 104 100 33     533 ( my $package = $dist ) =~ s/-/::/g;
      66        
2125             foreach my $user ( keys( %{$data->{users}} ) )
2126             {
2127             if( exists( $data->{users}->{ $user }->{modules} ) &&
2128             ref( $data->{users}->{ $user }->{modules} ) eq 'HASH' &&
2129 4         37 exists( $data->{users}->{ $user }->{modules}->{ $package } ) )
2130             {
2131             # On purpose, same data for everyone so it is predictable, since it does not matter anyway
2132             $rivers->{ $dist } =
2133             {
2134             bucket => 4,
2135             bus_factor => 7,
2136 4         18 immediate => 1358,
2137             total => 8529,
2138             };
2139             last;
2140             }
2141 4 50       19 }
2142             }
2143 4         15
2144             if( scalar( keys( %$rivers ) ) )
2145             {
2146 4         37 $res->{river} = $rivers;
2147 4         183 }
2148              
2149             my $payload = $self->json->encode( $res );
2150             my $resp = HTTP::Promise::Response->new( 200, HTTP::Promise::Status->status_message( 200 => $lang ), [
2151             @STANDARD_HEADERS,
2152             Content_Type => 'application/json',
2153             Content_Length => length( $payload ),
2154 4         5579 Date => $self->_date_now,
2155             ], $payload,
2156             );
2157             return( $resp );
2158             }
2159 3     3   28  
  3         5  
  3         762  
2160             {
2161             # NOTE: POST /v1/distribution/river {"distribution": ["HTTP-Message", "Module-Generic"]}
2162             no warnings 'once';
2163             # NOTE: sub _PostModuleDistributionRiverWithJSON
2164             *_PostModuleDistributionRiverWithJSON = \&_GetModuleDistributionRiverWithQuery;
2165             }
2166              
2167 2     2   87797 # NOTE: GET /v1/distribution/river/{distribution}
2168 2         9 sub _GetModuleDistributionRiverWithParam
2169 2         391 {
2170 2   50     11 my $self = shift( @_ );
2171             my $opts = $self->_get_args_as_hash( @_ );
2172 2   50     24 my $def = $opts->{def};
2173 2   50     10 my $data = $self->data ||
2174 2         12 return( $self->error( "No mock data could be found." ) );
2175 2         6860 my $lang = $opts->{lang} || DEFAULT_LANG;
2176             my $req = $opts->{request} || return( $self->error( "No request object was provided." ) );
2177 2   50     14 my $form = $req->as_form_data;
2178             my $vars = $opts->{vars};
2179 2         5 my $dist = $vars->{distribution} ||
2180 2         13 return( $self->error({ code => 400, message => 'Missing param: distribution' }) );
2181             # Pass it to _GetModuleDistributionRiverWithQuery()
2182             $opts->{distribution} = $dist;
2183             return( $self->_GetModuleDistributionRiverWithQuery( %$opts ) );
2184             }
2185 3     3   23  
  3         11  
  3         950  
2186             {
2187             # NOTE: POST /v1/distribution/river/{distribution}
2188             no warnings 'once';
2189             # NOTE: sub _PostModuleDistribution
2190             *_PostModuleDistributionRiverWithParam = \&_GetModuleDistributionRiverWithParam;
2191             }
2192              
2193             # NOTE: GET /v1/distribution/_mapping
2194             # GetDistributionMapping is accessed directly in the data
2195              
2196             # NOTE: POST /v1/distribution/_mapping
2197             # PostDistributionMapping is accessed directly in the data
2198              
2199             {
2200             # NOTE: GET /v1/distribution/_search
2201             # NOTE: POST /v1/distribution/_search
2202             # NOTE: sub _GetDistributionSearch
2203             # NOTE: sub _PostDistributionSearch
2204             *_GetDistributionSearch = \&_GetDistribution;
2205             *_PostDistributionSearch = \&_GetDistribution;
2206             }
2207              
2208             # NOTE: DELETE /v1/distribution/_search/scroll
2209             # TODO: _DeleteDistributionSearchScroll
2210 1     1   45882 # Need to find out exactly what this endpoint returns
2211 1         9 sub _DeleteDistributionSearchScroll
2212 1         209 {
2213 1   50     25 my $self = shift( @_ );
2214             my $opts = $self->_get_args_as_hash( @_ );
2215 1   50     10 my $def = $opts->{def};
2216 1   50     10 my $data = $self->data ||
2217 1         8 return( $self->error( "No mock data could be found." ) );
2218 1         4140 my $lang = $opts->{lang} || DEFAULT_LANG;
2219 1         7 my $req = $opts->{request} || return( $self->error( "No request object was provided." ) );
2220 1         75 my $form = $req->as_form_data;
2221             my $msg = { code => 501, message => 'Not implemented' };
2222             my $payload = $self->json->encode( $msg );
2223             my $resp = HTTP::Promise::Response->new( $msg->{code}, HTTP::Promise::Status->status_message( $msg->{code} => $lang ), [
2224             @STANDARD_HEADERS,
2225             Content_Type => 'application/json',
2226             Content_Length => length( $payload ),
2227 1         1401 Date => $self->_date_now,
2228             ], $payload,
2229             );
2230             return( $resp );
2231             }
2232              
2233 2     2   45909 # NOTE: GET /v1/distribution/_search/scroll
2234 2         11 sub _GetDistributionSearchScroll
2235 2         306 {
2236 2         12 my $self = shift( @_ );
2237             my $opts = $self->_get_args_as_hash( @_ );
2238             $opts->{scroll} = 1;
2239             return( $self->_GetDistributionSearch( %$opts ) );
2240 3     3   28 }
  3         7  
  3         1038  
2241              
2242             {
2243             no warnings 'once';
2244             # NOTE: POST /v1/distribution/_search/scroll
2245             # NOTE: sub _PostDistributionSearchScroll
2246             *_PostDistributionSearchScroll = \&_GetDistributionSearchScroll;
2247             }
2248              
2249 2     2   88826 # NOTE: GET /v1/download_url/{module}
2250 2         30 sub _GetDownloadURL
2251 2         362 {
2252 2   50     15 my $self = shift( @_ );
2253             my $opts = $self->_get_args_as_hash( @_ );
2254 2   50     15 my $def = $opts->{def};
2255 2   50     8 my $data = $self->data ||
2256 2         9 return( $self->error( "No mock data could be found." ) );
2257 2         6827 my $lang = $opts->{lang} || DEFAULT_LANG;
2258             my $req = $opts->{request} || return( $self->error( "No request object was provided." ) );
2259 2   50     14 my $form = $req->as_form_data;
2260 2         3 my $vars = $opts->{vars};
2261 2         5 my $mod = $vars->{module} ||
  2         19  
2262             return( $self->error({ code => 400, message => 'Missing param: module' }) );
2263 52 100 33     289 my $res;
      66        
2264             foreach my $user ( keys( %{$data->{users}} ) )
2265             {
2266             if( exists( $data->{users}->{ $user }->{modules} ) &&
2267 2         9 ref( $data->{users}->{ $user }->{modules} ) eq 'HASH' &&
2268 2         13 exists( $data->{users}->{ $user }->{modules}->{ $mod } ) )
2269 2         4 {
2270 2         35 my $this = $data->{users}->{ $user }->{modules}->{ $mod };
2271 2         9 my @keys = qw( checksum_md5 checksum_sha256 date download_url release status version );
2272             $res = {};
2273             @$res{ @keys } = @$this{ @keys };
2274             last;
2275 2         12 }
2276 2         101 }
2277            
2278             my $payload = $self->json->encode( $res );
2279             my $resp = HTTP::Promise::Response->new( 200, HTTP::Promise::Status->status_message( 200 => $lang ), [
2280             @STANDARD_HEADERS,
2281             Content_Type => 'application/json',
2282             Content_Length => length( $payload ),
2283 2         2694 Date => $self->_date_now,
2284             ], $payload,
2285             );
2286             return( $resp );
2287 3     3   22 }
  3         5  
  3         526  
2288              
2289             {
2290             no warnings 'once';
2291             # NOTE: POST /v1/download_url/{module}
2292             # NOTE: sub _PostDownloadURL
2293             *_PostDownloadURL = \&_GetDownloadURL;
2294             }
2295              
2296 6     6   136707 # NOTE: GET /v1/favorite
2297 6         59 sub _GetFavorite
2298             {
2299             my $self = shift( @_ );
2300 48     48   62 my $opts = $self->_get_args_as_hash( @_ );
2301             return( $self->_search( %$opts, type => 'favorite', total => 44382, callback => sub
2302             {
2303             my $this = shift( @_ );
2304             return({
2305             _id => $this->{id},
2306             _index => 'cpan_v1_01',
2307             _score => 1,
2308             _source =>
2309             {
2310             author => $this->{author},
2311             date => $this->{date},
2312             distribution => $this->{distribution},
2313             id => $this->{id},
2314 48         628 release => $this->{release},
2315             user => $this->{release},
2316 6         1022 },
2317             _type => 'favorite',
2318             });
2319             }) );
2320 3     3   21 }
  3         5  
  3         1324  
2321              
2322             {
2323             no warnings 'once';
2324             # NOTE: POST /v1/favorite
2325             # NOTE: sub _PostFavorite
2326             *_PostFavorite = \&_GetFavorite
2327             }
2328              
2329 2     2   89807 # NOTE: GET /v1/favorite/{user}/{distribution}
2330 2         13 sub _GetFavoriteByUserModule
2331 2         378 {
2332 2   50     12 my $self = shift( @_ );
2333             my $opts = $self->_get_args_as_hash( @_ );
2334 2   50     37 my $def = $opts->{def};
2335 2   50     12 my $data = $self->data ||
2336 2         14 return( $self->error( "No mock data could be found." ) );
2337 2         7186 my $lang = $opts->{lang} || DEFAULT_LANG;
2338             my $req = $opts->{request} || return( $self->error( "No request object was provided." ) );
2339             my $form = $req->as_form_data;
2340 2   50     22 my $vars = $opts->{vars};
2341             # e.g.: 8IClg1rxdhRV1BvxqR0rKYyiLmQ
2342             my $id = $vars->{user} ||
2343 2   50     16 return( $self->error({ code => 400, message => 'Missing param: user' }) );
2344 2         26 # e.g.: DBI
2345 2         6 my $dist = $vars->{distribution} ||
2346 2         7 return( $self->error({ code => 400, message => 'Missing param: distribution' }) );
  2         35  
2347             ( my $module = $dist ) =~ s/-/::/g;
2348 52         117 my $res;
2349 52 50 66     189 foreach my $user ( keys( %{$data->{users}} ) )
2350             {
2351             my $this = $data->{users}->{ $user };
2352             if( $this->{user} eq $id && exists( $this->{modules}->{ $module } ) )
2353             {
2354             $res =
2355             {
2356             author => $this->{author},
2357             date => $this->{modules}->{ $module }->{date},
2358 2         24 distribution => $dist,
2359             id => $this->{modules}->{ $module }->{id},
2360 2         6 release => $this->{modules}->{ $module }->{release},
2361             user => $id,
2362             };
2363             last;
2364 2         9 }
2365 2 50       22 }
2366            
2367 0         0 my $code = 200;
2368 0         0 if( !defined( $res ) )
2369             {
2370             $code = 404;
2371 2         9 $res = { code => $code, message => 'Nothing found' };
2372 2         109 }
2373            
2374             my $payload = $self->json->encode( $res );
2375             my $resp = HTTP::Promise::Response->new( $code, HTTP::Promise::Status->status_message( $code => $lang ), [
2376             @STANDARD_HEADERS,
2377             Content_Type => 'application/json',
2378             Content_Length => length( $payload ),
2379 2         2915 Date => $self->_date_now,
2380             ], $payload,
2381             );
2382             return( $resp );
2383             }
2384 3     3   24  
  3         6  
  3         1199  
2385             {
2386             # NOTE: POST /v1/favorite/agg_by_distributions
2387             no warnings 'once';
2388             # NOTE: sub _PostFavoriteAggregateDistribution
2389             *_PostFavoriteByUserModule = \&_GetFavoriteByUserModule;
2390             }
2391              
2392 2     2   48605 # NOTE: GET /v1/favorite/agg_by_distributions
2393 2         11 sub _GetFavoriteAggregateDistribution
2394 2         412 {
2395 2   50     15 my $self = shift( @_ );
2396             my $opts = $self->_get_args_as_hash( @_ );
2397 2   50     34 my $def = $opts->{def};
2398 2   50     14 my $data = $self->data ||
2399 2         9 return( $self->error( "No mock data could be found." ) );
2400             my $lang = $opts->{lang} || DEFAULT_LANG;
2401 2   50     10207 my $req = $opts->{request} || return( $self->error( "No request object was provided." ) );
2402 2 50       65 my $form = $req->as_form_data;
2403 2         13 my $dist = $form->{distribution} ||
2404             return( $self->error({ code => 400, message => 'Missing param: distribution' }) );
2405             $dist = [$dist] unless( ref( $dist ) eq 'ARRAY' );
2406             my $res =
2407             {
2408             favorites => {},
2409 2         6 myfavorites => {},
2410             took => 5,
2411 2         15 };
2412 2         6 foreach my $d ( @$dist )
  2         23  
2413             {
2414 60 100 33     314 ( my $package = $d ) =~ s/-/::/g;
      66        
2415             foreach my $user ( keys( %{$data->{users}} ) )
2416             {
2417             if( exists( $data->{users}->{ $user }->{modules} ) &&
2418 2         12 ref( $data->{users}->{ $user }->{modules} ) eq 'HASH' &&
2419             exists( $data->{users}->{ $user }->{modules}->{ $package } ) )
2420             {
2421             $res->{favorites}->{ $package } = int( $data->{users}->{ $user }->{modules}->{ $package }->{likes} );
2422 2         14 }
2423 2         105 }
2424             }
2425             my $payload = $self->json->encode( $res );
2426             my $resp = HTTP::Promise::Response->new( 200, HTTP::Promise::Status->status_message( 200 => $lang ), [
2427             @STANDARD_HEADERS,
2428             Content_Type => 'application/json',
2429             Content_Length => length( $payload ),
2430 2         2673 Date => $self->_date_now,
2431             ], $payload,
2432             );
2433             return( $resp );
2434             }
2435 3     3   22  
  3         7  
  3         915  
2436             {
2437             # NOTE: POST /v1/favorite/agg_by_distributions
2438             no warnings 'once';
2439             # NOTE: sub _PostFavoriteAggregateDistribution
2440             *_PostFavoriteAggregateDistribution = \&_GetFavoriteAggregateDistribution;
2441             }
2442              
2443             # NOTE: GET /v1/favorite/by_user/{user}
2444 2     2   88201 # Example: /v1/favorite/by_user/q_15sjOkRminDY93g9DuZQ
2445 2         12 sub _GetFavoriteByUser
2446 2         416 {
2447 2   50     12 my $self = shift( @_ );
2448             my $opts = $self->_get_args_as_hash( @_ );
2449 2   50     21 my $def = $opts->{def};
2450 2   50     14 my $data = $self->data ||
2451 2         12 return( $self->error( "No mock data could be found." ) );
2452 2         6764 my $lang = $opts->{lang} || DEFAULT_LANG;
2453             my $req = $opts->{request} || return( $self->error( "No request object was provided." ) );
2454             my $form = $req->as_form_data;
2455 2   50     12 my $vars = $opts->{vars};
2456 2         4 # e.g.: 8IClg1rxdhRV1BvxqR0rKYyiLmQ
2457 2         5 my $id = $vars->{user} ||
  2         15  
2458             return( $self->error({ code => 400, message => 'Missing param: user' }) );
2459 60 100       170 my $favs = {};
2460             foreach my $user ( keys( %{$data->{users}} ) )
2461 2         4 {
2462             if( $data->{users}->{ $user }->{user} eq $id )
2463             {
2464             my $this = $data->{users}->{ $user };
2465 2         21 $favs =
2466             {
2467             favorites => $data->{users}->{ $user }->{user},
2468             took => 15,
2469 2         16 };
2470 2         76 }
2471             }
2472             my $payload = $self->json->encode( $favs );
2473             my $resp = HTTP::Promise::Response->new( 200, HTTP::Promise::Status->status_message( 200 => $lang ), [
2474             @STANDARD_HEADERS,
2475             Content_Type => 'application/json',
2476             Content_Length => length( $payload ),
2477 2         2708 Date => $self->_date_now,
2478             ], $payload,
2479             );
2480             return( $resp );
2481 3     3   22 }
  3         5  
  3         1317  
2482              
2483             {
2484             no warnings 'once';
2485             # NOTE: POST /v1/favorite/by_user/{user}
2486             # NOTE sub _PostFavoriteByUser
2487             *_PostFavoriteByUser = \&_GetFavoriteByUser;
2488             }
2489              
2490 2     2   88102 # NOTE: GET /v1/favorite/leaderboard
2491 2         12 sub _GetFavoriteLeaderboard
2492 2         329 {
2493 2   50     10 my $self = shift( @_ );
2494             my $opts = $self->_get_args_as_hash( @_ );
2495 2   50     17 my $def = $opts->{def};
2496 2   50     14 my $data = $self->data ||
2497 2         12 return( $self->error( "No mock data could be found." ) );
2498 2         6793 my $lang = $opts->{lang} || DEFAULT_LANG;
2499 2         5 my $req = $opts->{request} || return( $self->error( "No request object was provided." ) );
  2         43  
2500             my $form = $req->as_form_data;
2501 60 50 33     308 my $top = {};
2502             foreach my $user ( sort( keys( %{$data->{users}} ) ) )
2503             {
2504 60         65 if( exists( $data->{users}->{ $user }->{modules} ) &&
  60         220  
2505             ref( $data->{users}->{ $user }->{modules} ) eq 'HASH' )
2506 196         334 {
2507 196 100       561 foreach my $package ( keys( %{$data->{users}->{ $user }->{modules}} ) )
2508 196         188 {
  196         872  
2509             my $this = $data->{users}->{ $user }->{modules}->{ $package };
2510             $top->{ $this->{likes} } = [] if( !exists( $top->{ $this->{likes} } ) );
2511             push( @{$top->{ $this->{likes} }}, $this->{distribution} );
2512             }
2513 2         11 }
2514 2         13 }
2515            
2516 10         18 my $mods = [];
  10         218  
2517             foreach my $n ( sort( keys( %$top ) ) )
2518             {
2519 2         30 push( @$mods, +{ map( ( key => $_, doc_count => $n ), @{$top->{ $n }} ) } );
2520             }
2521              
2522             my $res =
2523             {
2524             leaderboard => $mods,
2525             took => 22,
2526 2         12 total => scalar( @$mods ),
2527 2         110 };
2528            
2529             my $payload = $self->json->encode( $res );
2530             my $resp = HTTP::Promise::Response->new( 200, HTTP::Promise::Status->status_message( 200 => $lang ), [
2531             @STANDARD_HEADERS,
2532             Content_Type => 'application/json',
2533             Content_Length => length( $payload ),
2534 2         2698 Date => $self->_date_now,
2535             ], $payload,
2536             );
2537             return( $resp );
2538 3     3   22 }
  3         8  
  3         1145  
2539              
2540             {
2541             no warnings 'once';
2542             # NOTE: POST /v1/favorite/by_user/{user}
2543             # NOTE sub _PostFavoriteByUser
2544             *_PostFavoriteLeaderboard = \&_GetFavoriteLeaderboard;
2545             }
2546              
2547 2     2   90549 # NOTE: GET /v1/favorite/recent
2548 2         14 sub _GetFavoriteRecent
2549 2         379 {
2550 2   50     14 my $self = shift( @_ );
2551             my $opts = $self->_get_args_as_hash( @_ );
2552 2   50     26 my $def = $opts->{def};
2553 2   50     14 my $data = $self->data ||
2554 2         12 return( $self->error( "No mock data could be found." ) );
2555 2   50     7085 my $lang = $opts->{lang} || DEFAULT_LANG;
2556 2   50     150 my $req = $opts->{request} || return( $self->error( "No request object was provided." ) );
2557             my $form = $req->as_form_data;
2558 2   50     113 my $page = $form->{page} //= 1;
2559 2   50     12 my $size = $form->{size} //= 10;
2560             # $page cannot be 0. It falls back to 1
2561             $page ||= 1;
2562 2         6 my $recent = $self->_build_recent ||
2563 2         7 return( $self->pass_error );
2564 2         5
2565 2         12 my $favorites = [];
2566             my $offset = ( ( $page - 1 ) * $size );
2567 2         103 my $n = 0;
2568             my @keys = qw( author date distribution id release user );
2569 22 50       70 # foreach my $dt ( sort{ $a <=> $b } keys( %$recent ) )
2570             foreach my $dt ( sort( keys( %$recent ) ) )
2571 22         37 {
2572 22         30 if( $n >= $offset )
2573 22         203 {
2574 22         42 my $this = $recent->{ $dt };
2575             my $ref = {};
2576 22         28 @$ref{ @keys } = @$this{ @keys };
2577 22 100       43 push( @$favorites, $ref );
2578             }
2579 2         21 $n++;
2580             last if( $n > ( $offset + $size ) );
2581             }
2582             my $res =
2583             {
2584             favorites => $favorites,
2585             took => 8,
2586 2         12 total => scalar( keys( %$recent ) ),
2587 2         172 };
2588            
2589             my $payload = $self->json->encode( $res );
2590             my $resp = HTTP::Promise::Response->new( 200, HTTP::Promise::Status->status_message( 200 => $lang ), [
2591             @STANDARD_HEADERS,
2592             Content_Type => 'application/json',
2593             Content_Length => length( $payload ),
2594 2         3291 Date => $self->_date_now,
2595             ], $payload,
2596             );
2597             return( $resp );
2598 3     3   22 }
  3         6  
  3         1437  
2599              
2600             {
2601             no warnings 'once';
2602             # NOTE: POST /v1/favorite/recent
2603             # NOTE sub _PostFavoriteRecent
2604             *_PostFavoriteRecent = \&_GetFavoriteRecent;
2605             }
2606              
2607             # NOTE: GET /v1/favorite/users_by_distribution/{distribution}
2608 2     2   89848 # Example: /v1/favorite/users_by_distribution/Nice-Try
2609 2         12 sub _GetFavoriteUsers
2610 2         351 {
2611 2   50     12 my $self = shift( @_ );
2612             my $opts = $self->_get_args_as_hash( @_ );
2613 2   50     18 my $def = $opts->{def};
2614 2   50     11 my $data = $self->data ||
2615 2         12 return( $self->error( "No mock data could be found." ) );
2616 2         6950 my $lang = $opts->{lang} || DEFAULT_LANG;
2617             my $req = $opts->{request} || return( $self->error( "No request object was provided." ) );
2618             my $form = $req->as_form_data;
2619 2   50     11 my $vars = $opts->{vars};
2620 2         23 # e.g.: DBI
2621 2         9 my $dist = $vars->{distribution} ||
2622 2         4 return( $self->error({ code => 400, message => 'Not found' }) );
  2         27  
2623             ( my $package = $dist ) =~ s/-/::/g;
2624 60 100 33     352 my $users = [];
      66        
2625             foreach my $user ( keys( %{$data->{users}} ) )
2626             {
2627             if( exists( $data->{users}->{ $user }->{modules} ) &&
2628 2         7 ref( $data->{users}->{ $user }->{modules} ) eq 'HASH' &&
2629 2         4 exists( $data->{users}->{ $user }->{modules}->{ $package } ) )
  2         8  
2630             {
2631 4         5 my $this = $data->{users}->{ $user }->{modules}->{ $package };
  4         22  
2632             foreach my $author ( @{$this->{likers}} )
2633 18 100       30 {
2634             foreach my $user ( keys( %{$data->{users}} ) )
2635 4         10 {
2636 4         13 if( $user eq $author )
2637             {
2638             push( @$users, $data->{users}->{ $user }->{id} );
2639             last;
2640             }
2641             }
2642             }
2643 2         14 }
2644             }
2645 2         11 # Returns an empty hash reference if nothing found.
2646 2         90 my $res = { users => $users };
2647            
2648             my $payload = $self->json->encode( $res );
2649             my $resp = HTTP::Promise::Response->new( 200, HTTP::Promise::Status->status_message( 200 => $lang ), [
2650             @STANDARD_HEADERS,
2651             Content_Type => 'application/json',
2652             Content_Length => length( $payload ),
2653 2         2781 Date => $self->_date_now,
2654             ], $payload,
2655             );
2656             return( $resp );
2657 3     3   22 }
  3         10  
  3         157  
2658              
2659             {
2660             no warnings 'once';
2661             # NOTE: POST /v1/favorite/users_by_distribution/{distribution}
2662             # NOTE sub _PostFavoriteUsers
2663             *_PostFavoriteUsers = \&_GetFavoriteUsers;
2664             }
2665              
2666             # NOTE: GET /v1/favorite/_mapping
2667             # GetFavoriteMapping is accessed directly in the data
2668              
2669             # NOTE: POST /v1/favorite/_mapping
2670 3     3   25 # PostFavoriteMapping is accessed directly in the data
  3         7  
  3         953  
2671              
2672             {
2673             no warnings 'once';
2674             # NOTE: GET /v1/favorite/_search
2675             # NOTE: POST /v1/favorite/_search
2676             # NOTE: sub _GetFavoriteSearch
2677             # NOTE: sub _PostFavoriteSearch
2678             *_GetFavoriteSearch = \&_GetFavorite;
2679             *_PostFavoriteSearch = \&_GetFavorite;
2680             }
2681              
2682             # NOTE: DELETE /v1/favorite/_search/scroll
2683             # TODO: _DeleteFavoriteSearchScroll
2684 1     1   46246 # Need to find out exactly what this endpoint returns
2685 1         5 sub _DeleteFavoriteSearchScroll
2686 1         187 {
2687 1   50     5 my $self = shift( @_ );
2688             my $opts = $self->_get_args_as_hash( @_ );
2689 1   50     16 my $def = $opts->{def};
2690 1   50     7 my $data = $self->data ||
2691 1         7 return( $self->error( "No mock data could be found." ) );
2692 1         4083 my $lang = $opts->{lang} || DEFAULT_LANG;
2693 1         6 my $req = $opts->{request} || return( $self->error( "No request object was provided." ) );
2694 1         49 my $form = $req->as_form_data;
2695             my $msg = { code => 501, message => 'Not implemented' };
2696             my $payload = $self->json->encode( $msg );
2697             my $resp = HTTP::Promise::Response->new( $msg->{code}, HTTP::Promise::Status->status_message( $msg->{code} => $lang ), [
2698             @STANDARD_HEADERS,
2699             Content_Type => 'application/json',
2700             Content_Length => length( $payload ),
2701 1         1761 Date => $self->_date_now,
2702             ], $payload,
2703             );
2704             return( $resp );
2705             }
2706              
2707 2     2   45939 # NOTE: GET /v1/favorite/_search/scroll
2708 2         12 sub _GetFavoriteSearchScroll
2709 2         297 {
2710 2         17 my $self = shift( @_ );
2711             my $opts = $self->_get_args_as_hash( @_ );
2712             $opts->{scroll} = 1;
2713             return( $self->_GetFavoriteSearch( %$opts ) );
2714 3     3   24 }
  3         5  
  3         448  
2715              
2716             {
2717             no warnings 'once';
2718             # NOTE: POST /v1/favorite/_search/scroll
2719             # NOTE: sub _PostFavoriteSearchScroll
2720             *_PostFavoriteSearchScroll = \&_GetFavoriteSearchScroll;
2721             }
2722              
2723 6     6   138291 # NOTE: GET /v1/file
2724 6         30 sub _GetFile
2725             {
2726             my $self = shift( @_ );
2727 42     42   50 my $opts = $self->_get_args_as_hash( @_ );
2728             return( $self->_search( %$opts, type => 'file', total => 29178111, callback => sub
2729             {
2730 42         189 my $this = shift( @_ );
2731             return({
2732             _id => $this->{id},
2733             _index => 'cpan_v1_01',
2734             _score => 1,
2735 6         973 _source => $this,
2736             _type => 'file',
2737             });
2738             }) );
2739 3     3   33 }
  3         15  
  3         2180  
2740              
2741             {
2742             no warnings 'once';
2743             # NOTE: POST /v1/file
2744             # NOTE: sub _PostFile
2745             *_PostFile = \&_GetFile;
2746             }
2747              
2748             # NOTE GET /v1/file/{author}/{release}/{path}
2749 2     2   88327 # Example: /v1/file/JDEGUEST/Nice-Try-v1.3.4/lib/Nice/Try.pm
2750 2         7 sub _GetFileByAuthorReleaseFilePath
2751 2         292 {
2752 2   50     11 my $self = shift( @_ );
2753             my $opts = $self->_get_args_as_hash( @_ );
2754 2   50     22 my $def = $opts->{def};
2755 2   50     11 my $data = $self->data ||
2756 2         11 return( $self->error( "No mock data could be found." ) );
2757 2         6585 my $lang = $opts->{lang} || DEFAULT_LANG;
2758             my $req = $opts->{request} || return( $self->error( "No request object was provided." ) );
2759 2   50     10 my $form = $req->as_form_data;
2760             my $vars = $opts->{vars};
2761 2   50     9 my $author = $vars->{author} ||
2762 2         3 return( $self->error({ code => 400, message => 'Missing parameter: author' }) );
2763 2         11 my $rel = $vars->{release} ||
2764 2         6 return( $self->error({ code => 400, message => 'Missing parameter: release' }) );
2765 2         9 my $path = $vars->{path};
2766 2         16 my @parts = split( /-/, $rel );
2767 2         6 my $vers = pop( @parts );
2768 2         3 my $dist = join( '-', @parts );
  2         18  
2769             ( my $package = $dist ) =~ s/-/::/g;
2770 52 50 33     179 my $res;
2771 52 100       110 foreach my $user ( keys( %{$data->{users}} ) )
2772             {
2773 2         8 next unless( exists( $data->{users}->{ $user }->{modules} ) && ref( $data->{users}->{ $user }->{modules} ) eq 'HASH' );
2774 2 50 33     26 if( exists( $data->{users}->{ $user }->{modules}->{ $package } ) )
2775 2         24 {
2776             my $this = $data->{users}->{ $user }->{modules}->{ $package };
2777             my $is_dir = ( !length( $path ) || substr( $path, -1, 1 ) eq '/' ) ? \1 : \0;
2778             my @keys = qw(
2779             abstract author authorized date deprecated description distribution
2780             download_url id maturity stat status version version_numified
2781             );
2782             $res =
2783 2         68 {
2784             binary => \0,
2785             directory => $is_dir,
2786             dist_fav_count => scalar( @{$this->{likers}} ),
2787             documentation => $package,
2788             indexed => \1,
2789             level => 2,
2790             mime => ( $is_dir ? 'text/plain' : 'text/x-script.perl-module' ),
2791             module => [
2792             {
2793             associated_pod => "${author}/${rel}/${path}",
2794             authorized => \1,
2795             indexed => \1,
2796 2 50       7 name => $package,
    50          
2797             version => $vers,
2798             version_numified => $this->{version_numified},
2799             }],
2800             name => ( $path ? [split( /\//, $path )]->[-1] : $rel ),
2801             path => $path,
2802             pod => '',
2803             pod_lines => [[1234, 5678]],
2804             release => $rel,
2805             sloc => 1234,
2806 2         42 slop => 456,
2807 2         9 suggest => { input => [$package], payload => { doc_name => $package }, weight => 123 },
2808             };
2809             @$res{ @keys } = @$this{ @keys };
2810             last;
2811 2         10 }
2812 2 50       7 }
2813            
2814 0         0 my $code = 200;
2815 0         0 if( !defined( $res ) )
2816             {
2817             $code = 404;
2818 2         8 $res = { code => $code, message => 'Not found' };
2819 2         122 }
2820            
2821             my $payload = $self->json->utf8->encode( $res );
2822             my $resp = HTTP::Promise::Response->new( $code, HTTP::Promise::Status->status_message( $code => $lang ), [
2823             @STANDARD_HEADERS,
2824             Content_Type => 'application/json',
2825             Content_Length => length( $payload ),
2826 2         2600 Date => $self->_date_now,
2827             ], $payload,
2828             );
2829             return( $resp );
2830 3     3   60 }
  3         9  
  3         1883  
2831              
2832             {
2833             no warnings 'once';
2834             # NOTE: POST /v1/file/{author}/{release}/{path}
2835             # NOTE: sub _PostFileByAuthorReleaseFilePath
2836             *_PostFileByAuthorReleaseFilePath = \&_GetFileByAuthorReleaseFilePath;
2837             }
2838              
2839             # NOTE GET /v1/file/dir/{path}
2840 2     2   89831 # Example: /v1/file/dir/JDEGUEST/Module-Generic-v0.31.0/lib/Module/Generic
2841 2         12 sub _GetFilePathDirectoryContent
2842 2         348 {
2843 2   50     7 my $self = shift( @_ );
2844             my $opts = $self->_get_args_as_hash( @_ );
2845 2   50     20 my $def = $opts->{def};
2846 2   50     12 my $data = $self->data ||
2847 2         8 return( $self->error( "No mock data could be found." ) );
2848 2         6808 my $lang = $opts->{lang} || DEFAULT_LANG;
2849             my $req = $opts->{request} || return( $self->error( "No request object was provided." ) );
2850 2   50     9 my $form = $req->as_form_data;
2851 2         14 my $vars = $opts->{vars};
2852             my $path = $vars->{path} ||
2853             return( $self->error({ code => 400, message => 'Missing parameter: path' }) );
2854             my $res =
2855 2 50       11 {
2856             dir => [],
2857 0         0 };
2858 0         0 if( substr( $path, -1, 1 ) eq '/' )
2859 0         0 {
2860 0         0 my @parts = split( /\//, $path );
2861 0         0 my $author = shift( @parts );
2862 0         0 my $rel = shift( @parts );
2863 0         0 my $dir_path = join( '/', @parts );
2864 0         0 $dir_path =~ s,/+$,,g;
2865 0         0 @parts = split( /-/, $rel );
2866 0         0 my $vers = pop( @parts );
2867 0         0 my $file = $parts[-1] . '.pm';
2868             my $std_path = join( '/', 'lib', @parts[0..$#parts-1] );
2869 0 0       0 my $dist = join( '-', @parts );
2870 0         0 ( my $package = $dist ) =~ s/-/::/g;
  0         0  
2871             # This is just mock data, so we only accept standard top directory path for this distribution
2872 0 0 0     0 $dir_path = $std_path if( $dir_path ne $std_path );
2873 0 0       0 foreach my $user ( keys( %{$data->{users}} ) )
2874             {
2875 0         0 next unless( exists( $data->{users}->{ $user }->{modules} ) && ref( $data->{users}->{ $user }->{modules} ) eq 'HASH' );
2876             if( exists( $data->{users}->{ $user }->{modules}->{ $package } ) )
2877             {
2878             my $this = $data->{users}->{ $user }->{modules}->{ $package };
2879             $res->{dir} = [{
2880             directory => \0,
2881             documentation => $package,
2882             mime => 'text/x-script.perl-module',
2883             name => $file,
2884             path => "${dir_path}/${file}",
2885 0         0 slop => 123,
2886 0         0 'stat.mtime' => $this->{stat}->{mtime},
2887             'stat.size' => $this->{stat}->{size},
2888             }];
2889             last;
2890 2         7 }
2891 2         71 }
2892             }
2893             my $payload = $self->json->utf8->encode( $res );
2894             my $resp = HTTP::Promise::Response->new( 200, HTTP::Promise::Status->status_message( 200 => $lang ), [
2895             @STANDARD_HEADERS,
2896             Content_Type => 'application/json',
2897             Content_Length => length( $payload ),
2898 2         2713 Date => $self->_date_now,
2899             ], $payload,
2900             );
2901             return( $resp );
2902 3     3   29 }
  3         5  
  3         192  
2903              
2904             {
2905             no warnings 'once';
2906             # NOTE POST /v1/file/dir/{path}
2907             # NOTE: sub _PostFilePathDirectoryContent
2908             *_PostFilePathDirectoryContent = \&_GetFilePathDirectoryContent;
2909             }
2910              
2911             # NOTE: GET /v1/file/_mapping
2912             # GetFileMapping is accessed directly in the data
2913              
2914             # NOTE: POST /v1/file/_mapping
2915 3     3   19 # PostFileMapping is accessed directly in the data
  3         10  
  3         847  
2916              
2917             {
2918             no warnings 'once';
2919             # NOTE: GET /v1/file/_search
2920             # NOTE: POST /v1/file/_search
2921             # NOTE: sub _GetFileSearch
2922             # NOTE: sub _PostFileSearch
2923             *_GetFileSearch = \&_GetFile;
2924             *_PostFileSearch = \&_GetFile;
2925             }
2926              
2927             # NOTE: DELETE /v1/file/_search/scroll
2928             # TODO: _DeleteFileSearchScroll
2929 1     1   46418 # Need to find out exactly what this endpoint returns
2930 1         9 sub _DeleteFileSearchScroll
2931 1         192 {
2932 1   50     7 my $self = shift( @_ );
2933             my $opts = $self->_get_args_as_hash( @_ );
2934 1   50     18 my $def = $opts->{def};
2935 1   50     7 my $data = $self->data ||
2936 1         8 return( $self->error( "No mock data could be found." ) );
2937 1         4048 my $lang = $opts->{lang} || DEFAULT_LANG;
2938 1         6 my $req = $opts->{request} || return( $self->error( "No request object was provided." ) );
2939 1         52 my $form = $req->as_form_data;
2940             my $msg = { code => 501, message => 'Not implemented' };
2941             my $payload = $self->json->encode( $msg );
2942             my $resp = HTTP::Promise::Response->new( $msg->{code}, HTTP::Promise::Status->status_message( $msg->{code} => $lang ), [
2943             @STANDARD_HEADERS,
2944             Content_Type => 'application/json',
2945             Content_Length => length( $payload ),
2946 1         1439 Date => $self->_date_now,
2947             ], $payload,
2948             );
2949             return( $resp );
2950             }
2951              
2952 2     2   47535 # NOTE: GET /v1/file/_search/scroll
2953 2         14 sub _GetFileSearchScroll
2954 2         386 {
2955 2         16 my $self = shift( @_ );
2956             my $opts = $self->_get_args_as_hash( @_ );
2957             $opts->{scroll} = 1;
2958             return( $self->_GetFileSearch( %$opts ) );
2959 3     3   21 }
  3         3  
  3         845  
2960              
2961             {
2962             no warnings 'once';
2963             # NOTE: POST /v1/file/_search/scroll
2964             # NOTE: sub _PostFileSearchScroll
2965             *_PostFileSearchScroll = \&_GetFileSearchScroll;
2966             }
2967              
2968             # TODO
2969 2     2   88664 # NOTE: GET /v1/history/documentation/{module}/{path}
2970 2         12 sub _GetDocumentationHistory
2971 2         336 {
2972 2   50     8 my $self = shift( @_ );
2973             my $opts = $self->_get_args_as_hash( @_ );
2974 2   50     13 my $def = $opts->{def};
2975 2   50     8 my $data = $self->data ||
2976 2         10 return( $self->error( "No mock data could be found." ) );
2977 2         6859 my $lang = $opts->{lang} || DEFAULT_LANG;
2978 2         23 my $req = $opts->{request} || return( $self->error( "No request object was provided." ) );
2979             my $form = $req->as_form_data;
2980 2         79 my $res;
2981             my $payload = $self->json->utf8->encode( $res );
2982              
2983             my $resp = HTTP::Promise::Response->new( 200, HTTP::Promise::Status->status_message( 200 => $lang ), [
2984             @STANDARD_HEADERS,
2985             Content_Type => 'text/html; charset=UTF-8',
2986             Content_Length => length( $payload ),
2987 2         2692 Date => $self->_date_now,
2988             ], $payload,
2989             );
2990             return( $resp );
2991 3     3   29 }
  3         6  
  3         665  
2992              
2993             {
2994             no warnings 'once';
2995             # NOTE: POST /v1/history/documentation/{module}/{path}
2996             # NOTE: sub _PostDocumentationHistory
2997             *_PostDocumentationHistory = \&_GetDocumentationHistory;
2998             }
2999              
3000             # TODO
3001 2     2   88684 # NOTE: GET /v1/search/history/file/{distribution}/{path}
3002 2         9 sub _GetFileHistory
3003 2         329 {
3004 2   50     24 my $self = shift( @_ );
3005             my $opts = $self->_get_args_as_hash( @_ );
3006 2   50     21 my $def = $opts->{def};
3007 2   50     14 my $data = $self->data ||
3008 2         8 return( $self->error( "No mock data could be found." ) );
3009 2         6601 my $lang = $opts->{lang} || DEFAULT_LANG;
3010 2         12 my $req = $opts->{request} || return( $self->error( "No request object was provided." ) );
3011             my $form = $req->as_form_data;
3012 2         71 my $res;
3013             my $payload = $self->json->utf8->encode( $res );
3014              
3015             my $resp = HTTP::Promise::Response->new( 200, HTTP::Promise::Status->status_message( 200 => $lang ), [
3016             @STANDARD_HEADERS,
3017             Content_Type => 'text/html; charset=UTF-8',
3018             Content_Length => length( $payload ),
3019 2         2574 Date => $self->_date_now,
3020             ], $payload,
3021             );
3022             return( $resp );
3023 3     3   21 }
  3         89  
  3         661  
3024              
3025             {
3026             no warnings 'once';
3027             # NOTE: POST /v1/search/history/file/{distribution}/{path}
3028             # NOTE: sub _PostFileHistory
3029             *_PostFileHistory = \&_GetFileHistory;
3030             }
3031              
3032             # TODO
3033 2     2   91294 # NOTE: GET /v1/search/history/module/{module}/{path}
3034 2         17 sub _GetModuleHistory
3035 2         353 {
3036 2   50     13 my $self = shift( @_ );
3037             my $opts = $self->_get_args_as_hash( @_ );
3038 2   50     21 my $def = $opts->{def};
3039 2   50     14 my $data = $self->data ||
3040 2         9 return( $self->error( "No mock data could be found." ) );
3041 2         7109 my $lang = $opts->{lang} || DEFAULT_LANG;
3042 2         14 my $req = $opts->{request} || return( $self->error( "No request object was provided." ) );
3043             my $form = $req->as_form_data;
3044 2         84 my $res;
3045             my $payload = $self->json->utf8->encode( $res );
3046              
3047             my $resp = HTTP::Promise::Response->new( 200, HTTP::Promise::Status->status_message( 200 => $lang ), [
3048             @STANDARD_HEADERS,
3049             Content_Type => 'text/html; charset=UTF-8',
3050             Content_Length => length( $payload ),
3051 2         2941 Date => $self->_date_now,
3052             ], $payload,
3053             );
3054             return( $resp );
3055 3     3   21 }
  3         6  
  3         734  
3056              
3057             {
3058             no warnings 'once';
3059             # NOTE: POST /v1/search/history/module/{module}/{path}
3060             # NOTE: sub _PostModuleHistory
3061             *_PostModuleHistory = \&_GetModuleHistory;
3062             }
3063              
3064 2     2   88796 # NOTE: GET /v1/login/index
3065 2         9 sub _GetLoginPage
3066 2         290 {
3067 2   50     8 my $self = shift( @_ );
3068             my $opts = $self->_get_args_as_hash( @_ );
3069 2   50     24 my $def = $opts->{def};
3070 2   50     12 my $data = $self->data ||
3071 2         8 return( $self->error( "No mock data could be found." ) );
3072 2         6590 my $lang = $opts->{lang} || DEFAULT_LANG;
3073 2         13 my $req = $opts->{request} || return( $self->error( "No request object was provided." ) );
3074             my $form = $req->as_form_data;
3075             my $html = qq{<pre><h1>Login via</h1><ul><li><a href="/login/github">GitHub</a></li> <li><a href="/login/google">Google</a></li> <li><a href="/login/pause">PAUSE</a></li> <li><a href="/login/twitter">Twitter</a></li></ul></pre>};
3076             my $resp = HTTP::Promise::Response->new( 200, HTTP::Promise::Status->status_message( 200 => $lang ), [
3077             @STANDARD_HEADERS,
3078             Content_Type => 'text/html; charset=UTF-8',
3079             Content_Length => length( $html ),
3080 2         2550 Date => $self->_date_now,
3081             ], $html,
3082             );
3083             return( $resp );
3084 3     3   19 }
  3         6  
  3         785  
3085              
3086             {
3087             no warnings 'once';
3088             # NOTE: POST /v1/login/index
3089             # NOTE: sub _PostLoginPage
3090             *_PostLoginPage = \&_GetLoginPage;
3091             }
3092              
3093 4     4   175277 # NOTE: GET /v1/mirror
3094 4         17 sub _GetMirror
3095 4         616 {
3096 4   50     15 my $self = shift( @_ );
3097             my $opts = $self->_get_args_as_hash( @_ );
3098 4   50     20 my $def = $opts->{def};
3099 4   50     14 my $data = $self->data ||
3100 4         12 return( $self->error( "No mock data could be found." ) );
3101 4         13163 my $lang = $opts->{lang} || DEFAULT_LANG;
3102             my $req = $opts->{request} || return( $self->error( "No request object was provided." ) );
3103             my $form = $req->as_form_data;
3104             my $res =
3105             {
3106             mirrors => [
3107             {
3108             ccode => "zz",
3109             city => "Everywhere",
3110             contact => [{ contact_site => "perl.org", contact_user => "cpan" }],
3111             continent => "Global",
3112             country => "Global",
3113             distance => undef,
3114             dnsrr => "N",
3115             freq => "instant",
3116             http => "http://www.cpan.org/",
3117             inceptdate => "2021-04-09T00:00:00",
3118             location => [0, 0],
3119             name => "www.cpan.org",
3120             org => "Global CPAN CDN",
3121             src => "rsync://cpan-rsync.perl.org/CPAN/",
3122             tz => 0,
3123             },
3124             ],
3125 4         17 took => 7,
3126 4         216 total => 1,
3127             };
3128             my $payload = $self->json->encode( $res );
3129             my $resp = HTTP::Promise::Response->new( 200, HTTP::Promise::Status->status_message( 200 => $lang ), [
3130             @STANDARD_HEADERS,
3131             Content_Type => 'application/json',
3132             Content_Length => length( $payload ),
3133 4         5205 Date => $self->_date_now,
3134             ], $payload,
3135             );
3136             return( $resp );
3137 3     3   22 }
  3         7  
  3         293  
3138              
3139             {
3140             no warnings 'once';
3141             # NOTE: POST /v1/mirror
3142             # NOTE: sub _PostMirror
3143             *_PostMirror = \&_GetMirror;
3144 3     3   23 }
  3         3  
  3         463  
3145              
3146             {
3147             no warnings 'once';
3148             # NOTE: GET /v1/mirror/search
3149             # NOTE: sub _GetMirrorSearch
3150             *_GetMirrorSearch = \&_GetMirror;
3151             # NOTE: POST /v1/mirror/search
3152             # NOTE: sub _PostMirrorSearch
3153             *_PostMirrorSearch = \&_GetMirror;
3154             }
3155              
3156 6     6   135943 # NOTE: GET /v1/module
3157 6         23 sub _GetModule
3158             {
3159             my $self = shift( @_ );
3160 42     42   45 my $opts = $self->_get_args_as_hash( @_ );
3161             return( $self->_search( %$opts, type => 'distribution', total => 29178966, callback => sub
3162             {
3163 42         141 my $this = shift( @_ );
3164             return({
3165             _id => $this->{id},
3166             _index => 'cpan_v1_01',
3167             _score => 1,
3168 6         1213 _source => $this,
3169             _type => 'file',
3170             });
3171             }) );
3172 3     3   29 }
  3         11  
  3         1057  
3173              
3174             {
3175             no warnings 'once';
3176             # NOTE: POST /v1/module
3177             # NOTE: sub _PostModule
3178             *_PostModule = \&_GetModule;
3179             }
3180              
3181             # NOTE: GET /v1/module/{module}
3182 2     2   90586 # Example: /v1/module/HTTP::Message
3183 2         13 sub _GetModuleFile
3184 2         388 {
3185 2   50     10 my $self = shift( @_ );
3186             my $opts = $self->_get_args_as_hash( @_ );
3187 2   50     23 my $def = $opts->{def};
3188 2   50     14 my $data = $self->data ||
3189 2         16 return( $self->error( "No mock data could be found." ) );
3190 2         7112 my $lang = $opts->{lang} || DEFAULT_LANG;
3191             my $req = $opts->{request} || return( $self->error( "No request object was provided." ) );
3192 2   50     11 my $form = $req->as_form_data;
3193 2         5 my $vars = $opts->{vars};
3194 2         5 my $mod = $vars->{module} ||
  2         40  
3195             return( $self->error({ code => 400, message => 'Missing parameter: module' }) );
3196 2 50 33     30 my $res;
3197 2 50       11 foreach my $user ( sort( keys( %{$data->{users}} ) ) )
3198             {
3199 2         6 next unless( exists( $data->{users}->{ $user }->{modules} ) && ref( $data->{users}->{ $user }->{modules} ) eq 'HASH' );
3200 2         5 if( exists( $data->{users}->{ $user }->{modules}->{ $mod } ) )
3201             {
3202             $res = $data->{users}->{ $user }->{modules}->{ $mod };
3203             last;
3204 2         7 }
3205 2 50       12 }
3206              
3207 0         0 my $code = 200;
3208 0         0 if( !defined( $res ) )
3209             {
3210             $code = 404;
3211 2         9 $res = { code => $code, message => 'Not found' };
3212 2         205 }
3213            
3214             my $payload = $self->json->utf8->encode( $res );
3215             my $resp = HTTP::Promise::Response->new( $code, HTTP::Promise::Status->status_message( $code => $lang ), [
3216             @STANDARD_HEADERS,
3217             Content_Type => 'application/json',
3218             Content_Length => length( $payload ),
3219 2         2791 Date => $self->_date_now,
3220             ], $payload,
3221             );
3222             return( $resp );
3223 3     3   26 }
  3         22  
  3         186  
3224              
3225             {
3226             no warnings 'once';
3227             # NOTE: POST /v1/module/{module}
3228             # NOTE: sub _PostModuleFile
3229             *_PostModuleFile = \&_GetModuleFile;
3230             }
3231              
3232             # NOTE: GET /v1/module/_mapping
3233             # GetModuleMapping is accessed directly in the data
3234              
3235             # NOTE: POST /v1/module/_mapping
3236 3     3   17 # PostModuleMapping is accessed directly in the data
  3         5  
  3         803  
3237              
3238             {
3239             no warnings 'once';
3240             # NOTE: GET /v1/module/_search
3241             # NOTE: POST /v1/module/_search
3242             # NOTE: sub _GetModuleSearch
3243             # NOTE: sub _PostModuleSearch
3244             *_GetModuleSearch = \&_GetModule;
3245             *_PostModuleSearch = \&_GetModule;
3246             }
3247              
3248             # NOTE: DELETE /v1/module/_search/scroll
3249             # TODO: _DeleteModuleSearchScroll
3250 1     1   45665 # Need to find out exactly what this endpoint returns
3251 1         5 sub _DeleteModuleSearchScroll
3252 1         166 {
3253 1   50     4 my $self = shift( @_ );
3254             my $opts = $self->_get_args_as_hash( @_ );
3255 1   50     15 my $def = $opts->{def};
3256 1   50     7 my $data = $self->data ||
3257 1         6 return( $self->error( "No mock data could be found." ) );
3258 1         3802 my $lang = $opts->{lang} || DEFAULT_LANG;
3259 1         5 my $req = $opts->{request} || return( $self->error( "No request object was provided." ) );
3260 1         37 my $form = $req->as_form_data;
3261             my $msg = { code => 501, message => 'Not implemented' };
3262             my $payload = $self->json->encode( $msg );
3263             my $resp = HTTP::Promise::Response->new( $msg->{code}, HTTP::Promise::Status->status_message( $msg->{code} => $lang ), [
3264             @STANDARD_HEADERS,
3265             Content_Type => 'application/json',
3266             Content_Length => length( $payload ),
3267 1         1285 Date => $self->_date_now,
3268             ], $payload,
3269             );
3270             return( $resp );
3271             }
3272              
3273 2     2   47005 # NOTE: GET /v1/module/_search/scroll
3274 2         12 sub _GetModuleSearchScroll
3275 2         326 {
3276 2         10 my $self = shift( @_ );
3277             my $opts = $self->_get_args_as_hash( @_ );
3278             $opts->{scroll} = 1;
3279             return( $self->_GetModuleSearch( %$opts ) );
3280 3     3   20 }
  3         8  
  3         578  
3281              
3282             {
3283             no warnings 'once';
3284             # NOTE: POST /v1/module/_search/scroll
3285             # NOTE: sub _PostModuleSearchScroll
3286             *_PostModuleSearchScroll = \&_GetModuleSearchScroll;
3287             }
3288              
3289 2     2   90146 # NOTE: GET /v1/package
3290 2         10 sub _GetPackage
3291             {
3292             my $self = shift( @_ );
3293 20     20   21 my $opts = $self->_get_args_as_hash( @_ );
3294             return( $self->_search( %$opts, type => 'package', total => 29178966, callback => sub
3295             {
3296             my $this = shift( @_ );
3297             return({
3298             _id => $this->{package},
3299             _index => 'cpan_v1_01',
3300             _score => 1,
3301             _source =>
3302             {
3303             author => $this->{author},
3304             dist_version => $this->{version},
3305             distribution => $this->{distribution},
3306             file => join( '/', substr( $this->{author}, 0, 1 ), substr( $this->{author}, 0, 2 ), $this->{author}, $this->{archive} ),
3307 20         212 module_name => $this->{package},
3308             version => $this->{version},
3309 2         383 },
3310             _type => 'package',
3311             });
3312             }) );
3313 3     3   19 }
  3         7  
  3         1166  
3314              
3315             {
3316             no warnings 'once';
3317             # NOTE: POST /v1/package
3318             # NOTE: sub _PostPackage
3319             *_PostPackage = \&_GetPackage;
3320             }
3321              
3322 2     2   89477 # NOTE: GET /v1/package/modules/{distribution}
3323 2         10 sub _GetPackageDistributionList
3324 2         322 {
3325 2   50     9 my $self = shift( @_ );
3326             my $opts = $self->_get_args_as_hash( @_ );
3327 2   50     35 my $def = $opts->{def};
3328 2   50     10 my $data = $self->data ||
3329 2         11 return( $self->error( "No mock data could be found." ) );
3330 2         6885 my $lang = $opts->{lang} || DEFAULT_LANG;
3331             my $req = $opts->{request} || return( $self->error( "No request object was provided." ) );
3332 2   50     10 my $form = $req->as_form_data;
3333 2         19 my $vars = $opts->{vars};
3334 2         11 my $dist = $vars->{distribution} ||
3335 2         9 return( $self->error({ code => 400, message => 'Missing parameter: distribution' }) );
  2         34  
3336             ( my $package = $dist ) =~ s/-/::/g;
3337 2 50 33     44 my $res;
3338 2 50       16 foreach my $user ( sort( keys( %{$data->{users}} ) ) )
3339             {
3340 2         7 next unless( exists( $data->{users}->{ $user }->{modules} ) && ref( $data->{users}->{ $user }->{modules} ) eq 'HASH' );
3341 2         6 if( exists( $data->{users}->{ $user }->{modules}->{ $package } ) )
3342             {
3343             $res = { modules => [ $package ] };
3344             last;
3345 2         6 }
3346 2 50       7 }
3347              
3348 0         0 my $code = 200;
3349 0         0 if( !defined( $res ) )
3350             {
3351             $code = 404;
3352 2         9 $res = { code => $code, message => "Cannot find last release for ${dist}" };
3353 2         91 }
3354            
3355             my $payload = $self->json->utf8->encode( $res );
3356             my $resp = HTTP::Promise::Response->new( $code, HTTP::Promise::Status->status_message( $code => $lang ), [
3357             @STANDARD_HEADERS,
3358             Content_Type => 'application/json',
3359             Content_Length => length( $payload ),
3360 2         2716 Date => $self->_date_now,
3361             ], $payload,
3362             );
3363             return( $resp );
3364 3     3   22 }
  3         5  
  3         1243  
3365              
3366             {
3367             no warnings 'once';
3368             # NOTE: POST /v1/package/modules/{distribution}
3369             # NOTE: sub _PostPackageDistributionList
3370             *_PostPackageDistributionList = \&_GetPackageDistributionList;
3371             }
3372              
3373             # NOTE: GET /v1/package/{module}
3374 2     2   90121 # Example: /v1/package/HTTP::Message
3375 2         9 sub _GetModulePackage
3376 2         327 {
3377 2   50     8 my $self = shift( @_ );
3378             my $opts = $self->_get_args_as_hash( @_ );
3379 2   50     13 my $def = $opts->{def};
3380 2   50     7 my $data = $self->data ||
3381 2         8 return( $self->error( "No mock data could be found." ) );
3382 2         6891 my $lang = $opts->{lang} || DEFAULT_LANG;
3383             my $req = $opts->{request} || return( $self->error( "No request object was provided." ) );
3384 2   50     13 my $form = $req->as_form_data;
3385 2         8 my $vars = $opts->{vars};
3386 2         5 my $mod = $vars->{module} ||
  2         42  
3387             return( $self->error({ code => 400, message => 'Missing parameter: module' }) );
3388 2 50 33     27 my $res;
3389 2 50       12 foreach my $user ( sort( keys( %{$data->{users}} ) ) )
3390             {
3391 2         6 next unless( exists( $data->{users}->{ $user }->{modules} ) && ref( $data->{users}->{ $user }->{modules} ) eq 'HASH' );
3392             if( exists( $data->{users}->{ $user }->{modules}->{ $mod } ) )
3393             {
3394             my $this = $data->{users}->{ $user }->{modules}->{ $mod };
3395             $res =
3396             {
3397             author => $this->{author},
3398             dist_version => $this->{version},
3399             distribution => $this->{distribution},
3400 2         26 file => join( '/', substr( $this->{author}, 0, 1 ), substr( $this->{author}, 0, 2 ), $this->{author}, $this->{archive} ),
3401 2         5 module_name => $this->{package},
3402             version => $this->{version},
3403             };
3404 2         7 last;
3405 2 50       9 }
3406             }
3407 0         0 my $code = 200;
3408 0         0 if( !defined( $res ) )
3409             {
3410             $code = 404;
3411 2         8 $res = { code => $code, message => 'Not found' };
3412 2         153 }
3413            
3414             my $payload = $self->json->utf8->encode( $res );
3415             my $resp = HTTP::Promise::Response->new( $code, HTTP::Promise::Status->status_message( $code => $lang ), [
3416             @STANDARD_HEADERS,
3417             Content_Type => 'application/json',
3418             Content_Length => length( $payload ),
3419 2         2682 Date => $self->_date_now,
3420             ], $payload,
3421             );
3422             return( $resp );
3423 3     3   22 }
  3         7  
  3         584  
3424              
3425             {
3426             no warnings 'once';
3427             # NOTE: POST /v1/package/modules/{distribution}
3428             # NOTE: sub _PostModulePackage
3429             *_PostModulePackage = \&_GetModulePackage;
3430             }
3431              
3432             # NOTE: GET /v1/permission
3433 2     2   89632 # Example: /v1/package/HTTP::Message
3434 2         10 sub _GetPermission
3435             {
3436             my $self = shift( @_ );
3437 20     20   24 my $opts = $self->_get_args_as_hash( @_ );
3438             return( $self->_search( %$opts, type => 'permission', total => 29178966, callback => sub
3439             {
3440             my $this = shift( @_ );
3441             return({
3442             _id => $this->{package},
3443             _index => 'cpan_v1_01',
3444             _score => 1,
3445             _source =>
3446             {
3447             co_maintainers => $this->{contributors},
3448 20         148 module_name => $this->{package},
3449             owner => $this->{author},
3450 2         361 },
3451             _type => 'permission',
3452             });
3453             }) );
3454 3     3   22 }
  3         9  
  3         1402  
3455              
3456             {
3457             no warnings 'once';
3458             # NOTE: POST /v1/permission
3459             # NOTE: sub _PostPermission
3460             *_PostPermission = \&_GetPermission;
3461             }
3462              
3463             # NOTE: GET /v1/permission/by_author/{author}
3464 2     2   88748 # Example: /v1/permission/by_author/OALDERS
3465 2         33 sub _GetPermissionByAuthor
3466 2         331 {
3467 2   50     7 my $self = shift( @_ );
3468             my $opts = $self->_get_args_as_hash( @_ );
3469 2   50     22 my $def = $opts->{def};
3470 2   50     8 my $data = $self->data ||
3471 2         9 return( $self->error( "No mock data could be found." ) );
3472 2         6714 my $lang = $opts->{lang} || DEFAULT_LANG;
3473             my $req = $opts->{request} || return( $self->error( "No request object was provided." ) );
3474 2   50     11 my $form = $req->as_form_data;
3475 2         18 my $vars = $opts->{vars};
3476 2 50       8 my $author = $vars->{author} ||
3477             return( $self->error({ code => 400, message => 'Missing parameter: author' }) );
3478 2         3 my $res = { permissions => [] };
3479 2         5 if( exists( $data->{users}->{ $author } ) )
  2         19  
3480             {
3481 8         28 my $mods = {};
3482             foreach my $package ( keys( %{$data->{users}->{ $author }->{modules}} ) )
3483             {
3484             $mods->{ $package } =
3485             {
3486             co_maintainers => [],
3487             module_name => $package,
3488 2         6 owner => $author,
  2         20  
3489             };
3490 8         12 }
  8         37  
3491             foreach my $package ( keys( %{$data->{users}->{ $author }->{modules}} ) )
3492 0         0 {
3493 0         0 foreach my $ref ( @{$data->{users}->{ $author }->{modules}->{ $package }->{contributions}} )
3494             {
3495             ( my $class = $ref->{distribution} ) =~ s/-/::/g;
3496             $mods->{ $class } =
3497             {
3498             co_maintainers => [$author],
3499             module_name => $class,
3500             owner => undef,
3501 2         4 };
  2         22  
3502             }
3503             }
3504 2         11 push( @{$res->{permissions}}, map( $mods->{ $_ }, sort( keys( %$mods ) ) ) );
3505 2         88 }
3506              
3507             my $payload = $self->json->utf8->encode( $res );
3508             my $resp = HTTP::Promise::Response->new( 200, HTTP::Promise::Status->status_message( 200 => $lang ), [
3509             @STANDARD_HEADERS,
3510             Content_Type => 'application/json',
3511             Content_Length => length( $payload ),
3512 2         2589 Date => $self->_date_now,
3513             ], $payload,
3514             );
3515             return( $resp );
3516 3     3   24 }
  3         7  
  3         1305  
3517              
3518             {
3519             no warnings 'once';
3520             # NOTE: POST /v1/permission/by_author/{author}
3521             # NOTE: sub _PostPermissionByAuthor
3522             *_PostPermissionByAuthor = \&_GetPermissionByAuthor;
3523             }
3524              
3525             # NOTE: GET /v1/permission/by_module
3526 6     6   49749 # Example: /v1/permission/by_module?module=DBD::DBM::Statement
3527 6         30 sub _GetPermissionByModuleQueryString
3528 6         893 {
3529 6   50     25 my $self = shift( @_ );
3530             my $opts = $self->_get_args_as_hash( @_ );
3531 6   50     43 my $def = $opts->{def};
3532 6   50     26 my $data = $self->data ||
3533 6         28 return( $self->error( "No mock data could be found." ) );
3534 6 100       23704 my $lang = $opts->{lang} || DEFAULT_LANG;
3535 6 50 50     113 my $req = $opts->{request} || return( $self->error( "No request object was provided." ) );
      33        
3536             my $form = $req->as_form_data;
3537 0         0 $form->{module} = $opts->{module} if( exists( $opts->{module} ) );
3538             if( !exists( $form->{module} ) || !length( $form->{module} // '' ) )
3539             {
3540             return( $self->error({ code => 400, message => 'Missing parameter: module' }) );
3541             }
3542 6 50       370 # If called by _GetPermissionByModule() or by query string or JSON payload
3543 6         236 my $mods = ref( $form->{module} ) eq 'ARRAY'
3544 6         22 ? $form->{module}
3545             : [$form->{module}];
3546 6         13 my $res = { permissions => [] };
  6         95  
3547             foreach my $package ( @$mods )
3548 6 50 33     61 {
3549 6 50       24 foreach my $user ( sort( keys( %{$data->{users}} ) ) )
3550             {
3551 6         18 next unless( exists( $data->{users}->{ $user }->{modules} ) && ref( $data->{users}->{ $user }->{modules} ) eq 'HASH' );
3552 6         15 if( exists( $data->{users}->{ $user }->{modules}->{ $package } ) )
3553             {
3554 6         45 my $this = $data->{users}->{ $user }->{modules}->{ $package };
3555             push( @{$res->{permissions}},
3556             {
3557 6         11 co_maintainers => [map( $_->{pauseid}, @{$this->{contributions}} )],
3558 6         24 module_name => $package,
3559             owner => $this->{author},
3560             });
3561             last;
3562 6         29 }
3563 6         253 }
3564             }
3565             my $payload = $self->json->utf8->encode( $res );
3566             my $resp = HTTP::Promise::Response->new( 200, HTTP::Promise::Status->status_message( 200 => $lang ), [
3567             @STANDARD_HEADERS,
3568             Content_Type => 'application/json',
3569             Content_Length => length( $payload ),
3570 6         8071 Date => $self->_date_now,
3571             ], $payload,
3572             );
3573             return( $resp );
3574 3     3   88 }
  3         19  
  3         399  
3575              
3576             {
3577             no warnings 'once';
3578             # NOTE: POST /v1/permission/by_module
3579             # NOTE: sub _PostPermissionByModuleJSON
3580             *_PostPermissionByModuleJSON = \&_GetPermissionByModuleQueryString;
3581             }
3582              
3583 2     2   89428 # NOTE: GET /v1/permission/by_module/{module}
3584 2         9 sub _GetPermissionByModule
3585 2         318 {
3586             my $self = shift( @_ );
3587 2   50     9 my $opts = $self->_get_args_as_hash( @_ );
3588 2         11 my $vars = $opts->{vars};
3589             my $module = $vars->{module} ||
3590             return( $self->error({ code => 400, message => 'Missing parameter: module' }) );
3591             return( $self->_GetPermissionByModuleQueryString( %$opts, module => $module ) );
3592 3     3   26 }
  3         6  
  3         378  
3593              
3594             {
3595             no warnings 'once';
3596             # NOTE: POST /v1/permission/by_module/{module}
3597             # NOTE: sub _PostPermissionByModule
3598             *_PostPermissionByModule = \&_GetPermissionByModule;
3599             }
3600              
3601             # NOTE: GET /v1/permission/{module}
3602 2     2   88937 # Example: /v1/permission/HTTP::Message
3603 2         8 sub _GetModulePermission
3604 2         342 {
3605             my $self = shift( @_ );
3606 2   50     9 my $opts = $self->_get_args_as_hash( @_ );
3607 2         14 my $vars = $opts->{vars};
3608             my $module = $vars->{module} ||
3609             return( $self->error({ code => 400, message => 'Missing parameter: module' }) );
3610             return( $self->_GetPermissionByModuleQueryString( %$opts, module => $module ) );
3611 3     3   20 }
  3         5  
  3         721  
3612              
3613             {
3614             no warnings 'once';
3615             # NOTE: POST /v1/permission/{module}
3616             # NOTE: sub _PostModulePermission
3617             *_PostModulePermission = \&_GetModulePermission;
3618             }
3619              
3620             # NOTE: GET /v1/pod_render
3621             # Example:
3622             # =encoding utf-8\n\n=head1 Hello World\n\nSomething here\n\n=oops\n\n=cut\n
3623             # /v1/pod_render?pod=3Dencoding+utf-8%0A%0A%3Dhead1+Hello+World%0A%0ASomething+here%0A%0A%3Doops%0A%0A%3Dcut%0A
3624 2     2   48970 #
3625 2         19 sub _GetRenderPOD
3626 2         308 {
3627 2   50     15 my $self = shift( @_ );
3628             my $opts = $self->_get_args_as_hash( @_ );
3629 2   50     46 my $def = $opts->{def};
3630 2   50     13 my $data = $self->data ||
3631 2         9 return( $self->error( "No mock data could be found." ) );
3632 2         10463 my $lang = $opts->{lang} || DEFAULT_LANG;
3633 2   50     80 my $req = $opts->{request} || return( $self->error( "No request object was provided." ) );
3634             my $form = $req->as_form_data;
3635             my $pod = $form->{pod};
3636             my $resp = HTTP::Promise::Response->new( 200, HTTP::Promise::Status->status_message( 200 => $lang ), [
3637             @STANDARD_HEADERS,
3638             Content_Type => 'text/plain; charset=UTF-8',
3639             Content_Length => length( $pod // '' ),
3640 2         2631 Date => $self->_date_now,
3641             ], $pod,
3642             );
3643             return( $resp );
3644 3     3   39 }
  3         13  
  3         1928  
3645              
3646             {
3647             no warnings 'once';
3648             # NOTE: POST /v1/pod_render
3649             # NOTE: sub _PostRenderPOD
3650             *_PostRenderPOD = \&_GetRenderPOD;
3651             }
3652              
3653             # NOTE GET /v1/pod/{module}
3654 4     4   90232 # Example: /v1/pod/HTTP::Message?content-type=text/plain
3655 4         18 sub _GetModulePOD
3656 4         628 {
3657 4   50     17 my $self = shift( @_ );
3658             my $opts = $self->_get_args_as_hash( @_ );
3659 4   50     62 my $def = $opts->{def};
3660 4   50     19 my $data = $self->data ||
3661 4         18 return( $self->error( "No mock data could be found." ) );
3662 4         13363 my $lang = $opts->{lang} || DEFAULT_LANG;
3663             my $req = $opts->{request} || return( $self->error( "No request object was provided." ) );
3664             my $form = $req->as_form_data;
3665             my $vars = $opts->{vars};
3666 4 100       22 # So this can also be called from _GetModuleReleasePod()
3667 4 50 50     26 my $module = exists( $opts->{module} )
3668 4   50     14 ? $opts->{module}
3669 4 50       138 : $vars->{module};
3670 4         12 return( $self->error({ code => 400, message => 'Missing parameter: module' }) ) if( !length( $module // '' ) );
3671 4         7 my $type = $form->{'content-type'} || 'text/plain';
3672 4         12 $type = 'text/html' unless( $type =~ m,^text/(?:html|plain|x-markdown|x-pod)$,i );
  4         64  
3673             $type = lc( $type );
3674 120 50 33     471 my $res;
3675 120 100       258 foreach my $user ( sort( keys( %{$data->{users}} ) ) )
3676             {
3677 4         10 next unless( exists( $data->{users}->{ $user }->{modules} ) && ref( $data->{users}->{ $user }->{modules} ) eq 'HASH' );
3678 4         9 if( exists( $data->{users}->{ $user }->{modules}->{ $module } ) )
3679 4 50       16 {
    50          
    0          
    0          
3680             my $this = $data->{users}->{ $user }->{modules}->{ $module };
3681 0         0 my $info = $data->{users}->{ $user };
3682             if( $type eq 'text/html' )
3683             {
3684             $res = <<EOT;
3685             <ul id="index">
3686             <li><a href="#NAME">NAME</a></li>
3687             <li><a href="#VERSION">VERSION</a></li>
3688             <li><a href="#SYNOPSIS">SYNOPSIS</a></li>
3689             <li><a href="#DESCRIPTION">DESCRIPTION</a></li>
3690             <li><a href="#AUTHOR">AUTHOR</a></li>
3691             <li><a href="#COPYRIGHT-AND-LICENSE">COPYRIGHT AND LICENSE</a></li>
3692             </ul>
3693              
3694             <h1 id="NAME">NAME</h1>
3695              
3696             <p>${module} - $this->{abstract}</p>
3697              
3698             <h1 id="VERSION">VERSION</h1>
3699              
3700             <p>version $this->{version}</p>
3701              
3702             <h1 id="SYNOPSIS">SYNOPSIS</h1>
3703              
3704             <h1 id="DESCRIPTION">DESCRIPTION</h1>
3705              
3706             <h1 id="AUTHOR">AUTHOR</h1>
3707              
3708             <p>$info->{name} &lt;$info->{email}->[0]&gt;</p>
3709              
3710             <h1 id="COPYRIGHT-AND-LICENSE"><a id="COPYRIGHT"></a>COPYRIGHT AND LICENSE</h1>
3711              
3712             <p>This software is copyright (c) 2023 by $info->{name}.</p>
3713              
3714             <p>This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself.</p>
3715              
3716             EOT
3717 4         65 }
3718             elsif( $type eq 'text/plain' )
3719             {
3720             $res = <<EOT;
3721             NAME
3722             ${module} - $this->{abstract}
3723              
3724             VERSION
3725             version $this->{version}
3726              
3727             SYNOPSIS
3728              
3729             DESCRIPTION
3730              
3731             AUTHOR
3732             $info->{name} <$info->{email}->[0]>
3733              
3734             COPYRIGHT AND LICENSE
3735             This software is copyright (c) 2023 by $info->{name}.
3736              
3737             This is free software; you can redistribute it and/or modify it under the
3738             same terms as the Perl 5 programming language system itself.
3739             EOT
3740 0         0 }
3741             elsif( $type eq 'text/x-markdown' )
3742             {
3743             $res = <<EOT;
3744             # NAME
3745              
3746             ${module} - $this->{abstract}
3747              
3748             # VERSION
3749              
3750             version $this->{version}
3751              
3752             # SYNOPSIS
3753              
3754             # DESCRIPTION
3755              
3756             # AUTHOR
3757              
3758             $info->{name} <$info->{email}->[0]>
3759              
3760             # COPYRIGHT AND LICENSE
3761              
3762             This software is copyright (c) 2023 by $info->{name}.
3763              
3764             This is free software; you can redistribute it and/or modify it under
3765             the same terms as the Perl 5 programming language system itself.
3766              
3767             EOT
3768 0         0 }
3769             elsif( $type eq 'text/x-pod' )
3770             {
3771             $res = <<EOT;
3772             =head1 NAME
3773              
3774             ${module} - $this->{abstract}
3775              
3776             =head1 VERSION
3777              
3778             version $this->{version}
3779              
3780             =head1 SYNOPSIS
3781              
3782             =head1 DESCRIPTION
3783              
3784             =head1 AUTHOR
3785              
3786             $info->{name} <$info->{email}->[0]>
3787              
3788             =head1 COPYRIGHT AND LICENSE
3789              
3790             This software is copyright (c) 2023 by $info->{name}.
3791              
3792             This is free software; you can redistribute it and/or modify it under
3793             the same terms as the Perl 5 programming language system itself.
3794              
3795             EOT
3796 4   50     27 }
3797             }
3798             }
3799             my $resp = HTTP::Promise::Response->new( 200, HTTP::Promise::Status->status_message( 200 => $lang ), [
3800             @STANDARD_HEADERS,
3801             Content_Type => $type,
3802             Content_Length => length( $res // '' ),
3803 4         5459 Date => $self->_date_now,
3804             ], $res,
3805             );
3806             return( $resp );
3807 3     3   23 }
  3         9  
  3         839  
3808              
3809             {
3810             no warnings 'once';
3811             # NOTE: POST /v1/pod/{module}
3812             # NOTE: sub _PostModulePOD
3813             *_PostModulePOD = \&_GetModulePOD;
3814             }
3815              
3816             # NOTE: GET /v1/pod/{author}/{release}/{path}
3817 2     2   91195 # Example: /v1/pod/OALDERS/HTTP-Message-6.36/lib/HTTP/Message.pm?content-type=text/x-markdown
3818 2         12 sub _GetModuleReleasePod
3819 2         329 {
3820 2   50     11 my $self = shift( @_ );
3821             my $opts = $self->_get_args_as_hash( @_ );
3822 2   50     23 my $def = $opts->{def};
3823 2   50     9 my $data = $self->data ||
3824 2         9 return( $self->error( "No mock data could be found." ) );
3825 2         6918 my $lang = $opts->{lang} || DEFAULT_LANG;
3826             my $req = $opts->{request} || return( $self->error( "No request object was provided." ) );
3827 2   50     12 my $form = $req->as_form_data;
3828             my $vars = $opts->{vars};
3829 2   50     9 my $author = $vars->{author} ||
3830             return( $self->error({ code => 400, message => 'Missing parameter: author' }) );
3831 2   50     7 my $release = $vars->{release} ||
3832 2         10 return( $self->error({ code => 400, message => 'Missing parameter: release' }) );
3833 2         7 my $path = $vars->{path} ||
3834 2         8 return( $self->error({ code => 400, message => 'Missing parameter: path' }) );
3835 2         12 my @parts = split( /-/, $release );
3836 2         23 my $vers = pop( @parts );
3837             my $dist = join( '-', @parts );
3838             ( my $package = $dist ) =~ s/-/::/g;
3839             return( $self->_GetModulePOD( %$opts, module => $package ) );
3840 3     3   26 }
  3         5  
  3         515  
3841              
3842             {
3843             no warnings 'once';
3844             # NOTE: POST /v1/pod/{module}
3845             # NOTE: sub _PostModuleReleasePod
3846             *_PostModuleReleasePod = \&_GetModuleReleasePod;
3847             }
3848              
3849 6     6   140723 # NOTE: GET /v1/rating
3850 6         35 sub _GetRating
3851             {
3852             my $self = shift( @_ );
3853 42     42   48 my $opts = $self->_get_args_as_hash( @_ );
3854             return( $self->_search( %$opts, type => 'rating', total => 29178966, callback => sub
3855             {
3856             my $this = shift( @_ );
3857             return({
3858             _id => $this->{id},
3859             _index => 'cpan_v1_01',
3860             _score => 1,
3861             _source =>
3862             {
3863 42         305 author => $this->{author},
3864             date => $this->{date},
3865             distribution => $this->{distribution},
3866             rating => '4.0',
3867             release => 'PLACEHOLDER',
3868             user => 'CPANRatings',
3869 6         901 },
3870             _type => 'rating',
3871             });
3872             }) );
3873 3     3   20 }
  3         4  
  3         1318  
3874              
3875             {
3876             no warnings 'once';
3877             # NOTE: POST /v1/rating
3878             # NOTE: sub _PostRating
3879             *_PostRating = \&_GetRating;
3880             }
3881              
3882             # NOTE: GET /v1/rating/by_distributions
3883 2     2   47129 # Example: /v1/rating/by_distributions?distribution=HTTP-Message
3884 2         8 sub _GetRatingByDistribution
3885 2         308 {
3886 2   50     7 my $self = shift( @_ );
3887             my $opts = $self->_get_args_as_hash( @_ );
3888 2   50     21 my $def = $opts->{def};
3889 2   50     9 my $data = $self->data ||
3890 2         8 return( $self->error( "No mock data could be found." ) );
3891 2 50       9277 my $lang = $opts->{lang} || DEFAULT_LANG;
3892 2 50       58 my $req = $opts->{request} || return( $self->error( "No request object was provided." ) );
3893 2         126 my $form = $req->as_form_data;
3894 2         12 return( $self->error({ code => 400, message => 'Missing param: distribution' }) ) if( !exists( $form->{distribution} ) );
3895             my $dists = ref( $form->{distribution} ) eq 'ARRAY' ? $form->{distribution} : [$form->{distribution}];
3896 2         22 my $res;
3897 2         4 foreach my $dist ( @$dists )
  2         28  
3898             {
3899 60 50 33     178 ( my $package = $dist ) =~ s/-/::/g;
3900 60 100       108 foreach my $user ( sort( keys( %{$data->{users}} ) ) )
3901             {
3902 2         5 next unless( exists( $data->{users}->{ $user }->{modules} ) && ref( $data->{users}->{ $user }->{modules} ) eq 'HASH' );
3903 2 50       11 if( exists( $data->{users}->{ $user }->{modules}->{ $package } ) )
3904 2         22 {
3905             my $this = $data->{users}->{ $user }->{modules}->{ $package };
3906             $res = { distributions => {}, took => 8, total => 19 } if( !defined( $res ) );
3907             $res->{distributions}->{ $package } =
3908             {
3909             # Imaginary numbers, and all the same for this mock data
3910             avg => 4.90000009536743,
3911             count => 19,
3912             max => 4.90000009536743,
3913             min => 4.90000009536743,
3914             sum => 93.1000018119812,
3915             };
3916 2         5 }
3917 2 50       7 }
3918             }
3919 0         0 my $code = 200;
3920 0         0 if( !defined( $res ) )
3921             {
3922             $code = 404;
3923 2         7 $res = { code => $code, message => 'Not found' };
3924 2         98 }
3925            
3926             my $payload = $self->json->utf8->encode( $res );
3927             my $resp = HTTP::Promise::Response->new( $code, HTTP::Promise::Status->status_message( $code => $lang ), [
3928             @STANDARD_HEADERS,
3929             Content_Type => 'application/json',
3930             Content_Length => length( $payload ),
3931 2         2538 Date => $self->_date_now,
3932             ], $payload,
3933             );
3934             return( $resp );
3935 3     3   22 }
  3         6  
  3         231  
3936              
3937             {
3938             no warnings 'once';
3939             # NOTE: POST /v1/rating/by_distributions
3940             # NOTE: sub _PostRatingByDistribution
3941             *_PostRatingByDistribution = \&_GetRatingByDistribution;
3942             }
3943              
3944             # NOTE: GET /v1/rating/_mapping
3945             # GetRatingMapping is accessed directly in the data
3946              
3947             # NOTE: POST /v1/rating/_mapping
3948 3     3   32 # PostRatingMapping is accessed directly in the data
  3         5  
  3         843  
3949              
3950             {
3951             no warnings 'once';
3952             # NOTE: GET /v1/rating/_search
3953             # NOTE: POST /v1/rating/_search
3954             # NOTE: sub _GetRatingSearch
3955             # NOTE: sub _PostRatingSearch
3956             *_GetRatingSearch = \&_GetRating;
3957             *_PostRatingSearch = \&_GetRating;
3958             }
3959              
3960             # NOTE: DELETE /v1/rating/_search/scroll
3961             # TODO: _DeleteRatingSearchScroll
3962 1     1   46575 # Need to find out exactly what this endpoint returns
3963 1         9 sub _DeleteRatingSearchScroll
3964 1         157 {
3965 1   50     4 my $self = shift( @_ );
3966             my $opts = $self->_get_args_as_hash( @_ );
3967 1   50     19 my $def = $opts->{def};
3968 1   50     7 my $data = $self->data ||
3969 1         9 return( $self->error( "No mock data could be found." ) );
3970 1         3875 my $lang = $opts->{lang} || DEFAULT_LANG;
3971 1         4 my $req = $opts->{request} || return( $self->error( "No request object was provided." ) );
3972 1         73 my $form = $req->as_form_data;
3973             my $msg = { code => 501, message => 'Not implemented' };
3974             my $payload = $self->json->encode( $msg );
3975             my $resp = HTTP::Promise::Response->new( $msg->{code}, HTTP::Promise::Status->status_message( $msg->{code} => $lang ), [
3976             @STANDARD_HEADERS,
3977             Content_Type => 'application/json',
3978             Content_Length => length( $payload ),
3979 1         1249 Date => $self->_date_now,
3980             ], $payload,
3981             );
3982             return( $resp );
3983             }
3984              
3985 2     2   45346 # NOTE: GET /v1/rating/_search/scroll
3986 2         9 sub _GetRatingSearchScroll
3987 2         269 {
3988 2         13 my $self = shift( @_ );
3989             my $opts = $self->_get_args_as_hash( @_ );
3990             $opts->{scroll} = 1;
3991             return( $self->_GetRatingSearch( %$opts ) );
3992 3     3   22 }
  3         4  
  3         545  
3993              
3994             {
3995             no warnings 'once';
3996             # NOTE: POST /v1/rating/_search/scroll
3997             # NOTE: sub _PostRatingSearchScroll
3998             *_PostRatingSearchScroll = \&_GetRatingSearchScroll;
3999             }
4000              
4001 6     6   134610 # NOTE: GET /v1/release
4002 6         20 sub _GetRelease
4003             {
4004 6         956 my $self = shift( @_ );
4005             my $opts = $self->_get_args_as_hash( @_ );
4006             # Properties to copy
4007             my @keys = qw(
4008             abstract archive author authorized changes_file checksum_md5 checksum_sha256
4009             date dependency deprecated distribution download_url first id license main_module
4010             maturity metadata name provides resources stat status version version_numified
4011 40     40   46 );
4012 40         47 return( $self->_search( %$opts, type => 'distribution', total => 14410, callback => sub
4013 40         666 {
4014             my $this = shift( @_ );
4015             my $ref = {};
4016 40         121 @$ref{ @keys } = @$this{ @keys };
4017             return({
4018             _id => $this->{id},
4019             _index => 'cpan_v1_01',
4020             _score => 1,
4021 6         57 _source => $ref,
4022             _type => 'release',
4023             });
4024             }) );
4025 3     3   49 }
  3         7  
  3         1363  
4026              
4027             {
4028             no warnings 'once';
4029             # NOTE: POST /v1/release
4030             # NOTE: sub _PostRelease
4031             *_PostRelease = \&_GetRelease;
4032             }
4033              
4034 4     4   89725 # NOTE: GET /v1/release/{distribution}
4035 4         18 sub _GetReleaseDistribution
4036 4         624 {
4037 4   50     14 my $self = shift( @_ );
4038             my $opts = $self->_get_args_as_hash( @_ );
4039 4   50     24 my $def = $opts->{def};
4040 4   50     15 my $data = $self->data ||
4041 4         16 return( $self->error( "No mock data could be found." ) );
4042 4         13159 my $lang = $opts->{lang} || DEFAULT_LANG;
4043             my $req = $opts->{request} || return( $self->error( "No request object was provided." ) );
4044 4   50     27 my $form = $req->as_form_data;
4045 4         31 my $vars = $opts->{vars};
4046             my $dist = $opts->{distribution} || $vars->{distribution} ||
4047 4         42 return( $self->error({ code => 400, message => 'Missing parameter: distribution' }) );
4048             ( my $package = $dist ) =~ s/-/::/g;
4049             # Properties to copy
4050             my @keys = qw(
4051             abstract archive author authorized changes_file checksum_md5 checksum_sha256
4052 4         7 date dependency deprecated distribution download_url first id license main_module
4053 4         9 maturity metadata name provides resources stat status version version_numified
  4         65  
4054             );
4055 4 50 33     88 my $res;
4056 4 50       22 foreach my $user ( sort( keys( %{$data->{users}} ) ) )
4057             {
4058 4         13 next unless( exists( $data->{users}->{ $user }->{modules} ) && ref( $data->{users}->{ $user }->{modules} ) eq 'HASH' );
4059 4         9 if( exists( $data->{users}->{ $user }->{modules}->{ $package } ) )
4060 4         88 {
4061 4         11 my $this = $data->{users}->{ $user }->{modules}->{ $package };
4062             $res = {};
4063             @$res{ @keys } = @$this{ @keys };
4064 4         11 last;
4065 4 50       14 }
4066             }
4067 0         0 my $code = 200;
4068 0         0 if( !defined( $res ) )
4069             {
4070             $code = 404;
4071 4         14 $res = { code => $code, message => 'Not found' };
4072 4         301 }
4073            
4074             my $payload = $self->json->utf8->encode( $res );
4075             my $resp = HTTP::Promise::Response->new( $code, HTTP::Promise::Status->status_message( $code => $lang ), [
4076             @STANDARD_HEADERS,
4077             Content_Type => 'application/json',
4078             Content_Length => length( $payload ),
4079 4         5354 Date => $self->_date_now,
4080             ], $payload,
4081             );
4082             return( $resp );
4083 3     3   22 }
  3         6  
  3         759  
4084              
4085             {
4086             no warnings 'once';
4087             # NOTE: POST /v1/release/{distribution}
4088             # NOTE: sub _PostReleaseDistribution
4089             *_PostReleaseDistribution = \&_GetReleaseDistribution;
4090             }
4091              
4092             # NOTE: GET /v1/release/{author}/{release}
4093 2     2   87458 # Example: /v1/release/OALDERS/HTTP-Message-6.36
4094 2         10 sub _GetAuthorReleaseDistribution
4095 2         283 {
4096 2   50     7 my $self = shift( @_ );
4097             my $opts = $self->_get_args_as_hash( @_ );
4098 2   50     23 my $def = $opts->{def};
4099 2   50     10 my $data = $self->data ||
4100 2         9 return( $self->error( "No mock data could be found." ) );
4101 2         6551 my $lang = $opts->{lang} || DEFAULT_LANG;
4102             my $req = $opts->{request} || return( $self->error( "No request object was provided." ) );
4103 2   50     16 my $form = $req->as_form_data;
4104             my $vars = $opts->{vars};
4105 2   50     12 my $author = $vars->{author} ||
4106 2         10 return( $self->error({ code => 400, message => 'Missing parameter: author' }) );
4107 2         5 my $rel = $vars->{release} ||
4108 2         6 return( $self->error({ code => 400, message => 'Missing parameter: release' }) );
4109 2         17 my @parts = split( /-/, $rel );
4110             my $vers = pop( @parts );
4111             my $dist = join( '-', @parts );
4112             return( $self->_GetReleaseDistribution( %$opts, distribution => $dist ) );
4113 3     3   22 }
  3         5  
  3         1149  
4114              
4115             {
4116             no warnings 'once';
4117             # NOTE: POST /v1/release/{author}/{release}
4118             # NOTE: sub _PostAuthorReleaseDistribution
4119             *_PostAuthorReleaseDistribution = \&_GetAuthorReleaseDistribution;
4120             }
4121              
4122             # NOTE: GET /v1/release/all_by_author/{author}
4123 4     4   174948 # Example: /v1/release/all_by_author/JDEGUEST
4124 4         18 sub _GetAllReleasesByAuthor
4125 4         578 {
4126 4   50     13 my $self = shift( @_ );
4127             my $opts = $self->_get_args_as_hash( @_ );
4128 4   50     29 my $def = $opts->{def};
4129 4   50     14 my $data = $self->data ||
4130 4         15 return( $self->error( "No mock data could be found." ) );
4131 4         12998 my $lang = $opts->{lang} || DEFAULT_LANG;
4132             my $req = $opts->{request} || return( $self->error( "No request object was provided." ) );
4133 4   50     18 my $form = $req->as_form_data;
4134 4         9 my $vars = $opts->{vars};
4135 4         28 my $author = $vars->{author} ||
4136             return( $self->error({ code => 400, message => 'Missing parameter: author' }) );
4137             my $all = [];
4138             my @keys = qw(
4139 4 50       15 abstract author authorized date distribution download_url maturity name status
4140             version
4141 4         8 );
  4         31  
4142             if( exists( $data->{users}->{ $author } ) )
4143 16         23 {
4144 16         21 foreach my $package ( sort( keys( %{$data->{users}->{ $author }->{modules}} ) ) )
4145 16         113 {
4146 16         33 my $this = $data->{users}->{ $author }->{modules}->{ $package };
4147             my $ref = {};
4148             @$ref{ @keys } = @$this{ @keys };
4149 4         16 push( @$all, $ref );
4150             }
4151             }
4152             my $res =
4153             {
4154             release => $all,
4155 4         11 took => 12,
4156 4         207 total => scalar( @$all ),
4157             };
4158             my $payload = $self->json->utf8->encode( $res );
4159             my $resp = HTTP::Promise::Response->new( 200, HTTP::Promise::Status->status_message( 200 => $lang ), [
4160             @STANDARD_HEADERS,
4161             Content_Type => 'application/json',
4162             Content_Length => length( $payload ),
4163 4         5049 Date => $self->_date_now,
4164             ], $payload,
4165             );
4166             return( $resp );
4167 3     3   22 }
  3         4  
  3         1550  
4168              
4169             {
4170             no warnings 'once';
4171             # NOTE: POST /v1/release/all_by_author/{author}
4172             # NOTE: sub _PostAllReleasesByAuthor
4173             *_PostAllReleasesByAuthor = \&_GetAllReleasesByAuthor;
4174             # NOTE: GET /v1/release/by_author/{author}
4175             # NOTE: sub _GetReleaseByAuthor
4176             * _GetReleaseByAuthor = \&_GetAllReleasesByAuthor;
4177             # NOTE: POST /v1/release/by_author/{author}
4178             # NOTE: sub _PostReleaseByAuthor
4179             *_PostReleaseByAuthor = \&_GetAllReleasesByAuthor;
4180             }
4181              
4182             # NOTE: GET /v1/release/contributors/{author}/{release}
4183 2     2   88415 # Example: /v1/release/contributors/OALDERS/HTTP-Message-6.36
4184 2         9 sub _GetReleaseDistributionContributors
4185 2         313 {
4186 2   50     7 my $self = shift( @_ );
4187             my $opts = $self->_get_args_as_hash( @_ );
4188 2   50     26 my $def = $opts->{def};
4189 2   50     14 my $data = $self->data ||
4190 2         10 return( $self->error( "No mock data could be found." ) );
4191 2         6683 my $lang = $opts->{lang} || DEFAULT_LANG;
4192             my $req = $opts->{request} || return( $self->error( "No request object was provided." ) );
4193 2   50     15 my $form = $req->as_form_data;
4194             my $vars = $opts->{vars};
4195 2   50     12 my $author = $vars->{author} ||
4196 2         9 return( $self->error({ code => 400, message => 'Missing parameter: author' }) );
4197 2         10 my $rel = $vars->{release} ||
4198 2         7 return( $self->error({ code => 400, message => 'Missing parameter: release' }) );
4199 2         25 my @parts = split( /-/, $rel );
4200 2         7 my $vers = pop( @parts );
4201 2 50 33     49 my $dist = join( '-', @parts );
      33        
      33        
4202             ( my $package = $dist ) =~ s/-/::/g;
4203             my $all = [];
4204             if( exists( $data->{users}->{ $author } ) &&
4205             exists( $data->{users}->{ $author }->{modules} ) &&
4206 2         9 ref( $data->{users}->{ $author }->{modules} ) eq 'HASH' &&
4207 2         5 exists( $data->{users}->{ $author }->{modules}->{ $package } ) )
4208 2         8 {
4209             my $this = $data->{users}->{ $author }->{modules}->{ $package };
4210 6 50       16 my $contributors = $this->{contributors};
4211             foreach my $user ( @$contributors )
4212 6         10 {
4213 6         8 if( exists( $data->{users}->{ $user } ) )
4214 6         36 {
4215 6         20 my $info = $data->{users}->{ $user };
4216             my $ref = {};
4217             @$ref{qw( email name )} = @$info{qw( email name )};
4218             push( @$all, $ref );
4219 2         11 }
4220 2         10 }
4221 2         91 }
4222             my $res = { contributors => $all };
4223             my $payload = $self->json->utf8->encode( $res );
4224             my $resp = HTTP::Promise::Response->new( 200, HTTP::Promise::Status->status_message( 200 => $lang ), [
4225             @STANDARD_HEADERS,
4226             Content_Type => 'application/json',
4227             Content_Length => length( $payload ),
4228 2         2542 Date => $self->_date_now,
4229             ], $payload,
4230             );
4231             return( $resp );
4232 3     3   25 }
  3         4  
  3         1986  
4233              
4234             {
4235             no warnings 'once';
4236             # NOTE: POST /v1/release/contributors/{author}/{release}
4237             # NOTE: sub _PostReleaseDistributionContributors
4238             *_PostReleaseDistributionContributors = \&_GetReleaseDistributionContributors;
4239             }
4240              
4241 2     2   88032 # NOTE: GET /v1/release/files_by_category/{author}/{release}
4242 2         11 sub _GetReleaseKeyFilesByCategory
4243 2         313 {
4244 2   50     10 my $self = shift( @_ );
4245             my $opts = $self->_get_args_as_hash( @_ );
4246 2   50     23 my $def = $opts->{def};
4247 2   50     14 my $data = $self->data ||
4248 2         10 return( $self->error( "No mock data could be found." ) );
4249 2         6682 my $lang = $opts->{lang} || DEFAULT_LANG;
4250             my $req = $opts->{request} || return( $self->error( "No request object was provided." ) );
4251 2   50     23 my $form = $req->as_form_data;
4252             my $vars = $opts->{vars};
4253 2   50     14 my $author = $vars->{author} ||
4254 2         12 return( $self->error({ code => 400, message => 'Missing parameter: author' }) );
4255 2         7 my $rel = $vars->{release} ||
4256 2         7 return( $self->error({ code => 400, message => 'Missing parameter: release' }) );
4257 2         11 my @parts = split( /-/, $rel );
4258 2         5 my $vers = pop( @parts );
4259 2 50 33     57 my $dist = join( '-', @parts );
      33        
      33        
4260             ( my $package = $dist ) =~ s/-/::/g;
4261             my $res;
4262             if( exists( $data->{users}->{ $author } ) &&
4263             exists( $data->{users}->{ $author }->{modules} ) &&
4264 2         7 ref( $data->{users}->{ $author }->{modules} ) eq 'HASH' &&
4265 2         4 exists( $data->{users}->{ $author }->{modules}->{ $package } ) )
4266             {
4267             my $this = $data->{users}->{ $author }->{modules}->{ $package };
4268             my $info = $data->{users}->{ $author };
4269             $res =
4270             {
4271             categories =>
4272             {
4273             changelog =>
4274             [{
4275             author => $this->{author},
4276             category => 'changelog',
4277             distribution => $dist,
4278             name => 'Changes',
4279             path => 'Changes',
4280             pod_lines => [],
4281             release => $rel,
4282             status => 'cpan',
4283             }],
4284             contributing =>
4285             [{
4286             author => $this->{author},
4287             category => 'contributing',
4288             distribution => $dist,
4289             name => 'CONTRIBUTING.md',
4290             path => 'CONTRIBUTING.md',
4291             release => $rel,
4292             status => 'cpan',
4293             }],
4294             dist =>
4295             [{
4296             author => $this->{author},
4297             category => 'dist',
4298             distribution => $dist,
4299             name => 'Makefile.PL',
4300             path => 'Makefile.PL',
4301             pod_lines => [],
4302             release => $rel,
4303             status => 'cpan',
4304             },
4305             {
4306             author => $this->{author},
4307             category => 'dist',
4308             distribution => $dist,
4309             name => 'META.json',
4310             path => 'META.json',
4311             pod_lines => [],
4312             release => $rel,
4313             status => 'cpan',
4314             },
4315             {
4316             author => $this->{author},
4317             category => 'dist',
4318             distribution => $dist,
4319             name => 'META.yml',
4320             path => 'META.yml',
4321             pod_lines => [],
4322             release => $rel,
4323             status => 'cpan',
4324             }],
4325             install =>
4326             [{
4327             author => $this->{author},
4328             category => 'dist',
4329             distribution => $dist,
4330             name => 'INSTALL',
4331             path => 'INSTALL',
4332             pod_lines => [],
4333             release => $rel,
4334             status => 'cpan',
4335             }],
4336             license =>
4337             [{
4338             author => $this->{author},
4339             category => 'license',
4340             distribution => $dist,
4341             name => 'LICENSE',
4342             path => 'LICENSE',
4343             pod_lines => [],
4344             release => $rel,
4345             status => 'cpan',
4346             }],
4347 2         108 other =>
4348             [{
4349             author => $this->{author},
4350             category => 'other',
4351             distribution => $dist,
4352             name => 'README.md',
4353             path => 'README.md',
4354             pod_lines => [],
4355             release => $rel,
4356             status => 'cpan',
4357             }],
4358             },
4359             took => 10,
4360 2         9 total => 8,
4361 2 50       6 };
4362             }
4363 0         0 my $code = 200;
4364 0         0 if( !defined( $res ) )
4365             {
4366             $code = 404;
4367 2         9 $res = { code => $code, message => 'Not found' };
4368 2         130 }
4369            
4370             my $payload = $self->json->utf8->encode( $res );
4371             my $resp = HTTP::Promise::Response->new( $code, HTTP::Promise::Status->status_message( $code => $lang ), [
4372             @STANDARD_HEADERS,
4373             Content_Type => 'application/json',
4374             Content_Length => length( $payload ),
4375 2         2680 Date => $self->_date_now,
4376             ], $payload,
4377             );
4378             return( $resp );
4379 3     3   24 }
  3         3  
  3         1772  
4380              
4381             {
4382             no warnings 'once';
4383             # NOTE: POST /v1/release/files_by_category/{author}/{release}
4384             # NOTE: sub _PostReleaseKeyFilesByCategory
4385             *_PostReleaseKeyFilesByCategory = \&_GetReleaseKeyFilesByCategory;
4386             }
4387              
4388 2     2   88314 # NOTE: GET /v1/release/interesting_files/{author}/{release}
4389 2         9 sub _GetReleaseInterestingFiles
4390 2         315 {
4391 2   50     8 my $self = shift( @_ );
4392             my $opts = $self->_get_args_as_hash( @_ );
4393 2   50     25 my $def = $opts->{def};
4394 2   50     10 my $data = $self->data ||
4395 2         9 return( $self->error( "No mock data could be found." ) );
4396 2         6689 my $lang = $opts->{lang} || DEFAULT_LANG;
4397             my $req = $opts->{request} || return( $self->error( "No request object was provided." ) );
4398 2   50     23 my $form = $req->as_form_data;
4399             my $vars = $opts->{vars};
4400 2   50     15 my $author = $vars->{author} ||
4401 2         18 return( $self->error({ code => 400, message => 'Missing parameter: author' }) );
4402 2         6 my $rel = $vars->{release} ||
4403 2         8 return( $self->error({ code => 400, message => 'Missing parameter: release' }) );
4404 2         16 my @parts = split( /-/, $rel );
4405 2         6 my $vers = pop( @parts );
4406 2 50 33     45 my $dist = join( '-', @parts );
      33        
      33        
4407             ( my $package = $dist ) =~ s/-/::/g;
4408             my $res;
4409             if( exists( $data->{users}->{ $author } ) &&
4410             exists( $data->{users}->{ $author }->{modules} ) &&
4411 2         10 ref( $data->{users}->{ $author }->{modules} ) eq 'HASH' &&
4412 2         6 exists( $data->{users}->{ $author }->{modules}->{ $package } ) )
4413             {
4414             my $this = $data->{users}->{ $author }->{modules}->{ $package };
4415             my $info = $data->{users}->{ $author };
4416             $res =
4417             {
4418             files => [
4419             {
4420             author => $this->{author},
4421             category => 'changelog',
4422             distribution => $dist,
4423             name => 'Changes',
4424             path => 'Changes',
4425             pod_lines => [],
4426             release => $rel,
4427             status => 'cpan',
4428             },
4429             {
4430             author => $this->{author},
4431             category => 'contributing',
4432             distribution => $dist,
4433             name => 'CONTRIBUTING.md',
4434             path => 'CONTRIBUTING.md',
4435             release => $rel,
4436             status => 'cpan',
4437             },
4438             {
4439             author => $this->{author},
4440             category => 'dist',
4441             distribution => $dist,
4442             name => 'Makefile.PL',
4443             path => 'Makefile.PL',
4444             pod_lines => [],
4445             release => $rel,
4446             status => 'cpan',
4447             },
4448             {
4449             author => $this->{author},
4450             category => 'dist',
4451             distribution => $dist,
4452             name => 'META.json',
4453             path => 'META.json',
4454             pod_lines => [],
4455             release => $rel,
4456             status => 'cpan',
4457             },
4458             {
4459             author => $this->{author},
4460             category => 'dist',
4461             distribution => $dist,
4462             name => 'META.yml',
4463             path => 'META.yml',
4464             pod_lines => [],
4465             release => $rel,
4466             status => 'cpan',
4467             },
4468             {
4469             author => $this->{author},
4470             category => 'dist',
4471             distribution => $dist,
4472             name => 'INSTALL',
4473             path => 'INSTALL',
4474             pod_lines => [],
4475             release => $rel,
4476             status => 'cpan',
4477             },
4478             {
4479             author => $this->{author},
4480             category => 'license',
4481             distribution => $dist,
4482             name => 'LICENSE',
4483             path => 'LICENSE',
4484             pod_lines => [],
4485             release => $rel,
4486             status => 'cpan',
4487 2         68 },
4488             {
4489             author => $this->{author},
4490             category => 'other',
4491             distribution => $dist,
4492             name => 'README.md',
4493             path => 'README.md',
4494             pod_lines => [],
4495             release => $rel,
4496             status => 'cpan',
4497             },
4498             ],
4499             took => 10,
4500 2         9 total => 8,
4501 2 50       7 };
4502             }
4503 0         0 my $code = 200;
4504 0         0 if( !defined( $res ) )
4505             {
4506             $code = 404;
4507 2         11 $res = { code => $code, message => 'Not found' };
4508 2         117 }
4509            
4510             my $payload = $self->json->utf8->encode( $res );
4511             my $resp = HTTP::Promise::Response->new( $code, HTTP::Promise::Status->status_message( $code => $lang ), [
4512             @STANDARD_HEADERS,
4513             Content_Type => 'application/json',
4514             Content_Length => length( $payload ),
4515 2         2579 Date => $self->_date_now,
4516             ], $payload,
4517             );
4518             return( $resp );
4519 3     3   26 }
  3         7  
  3         1165  
4520              
4521             {
4522             no warnings 'once';
4523             # NOTE: POST /v1/release/interesting_files/{author}/{release}
4524             # NOTE: sub _PostReleaseInterestingFiles
4525             *_PostReleaseInterestingFiles = \&_GetReleaseInterestingFiles;
4526             }
4527              
4528             # NOTE: GET /v1/release/latest_by_author/{author}
4529 2     2   87485 # Example: /v1/release/latest_by_author/OALDERS
4530 2         9 sub _GetLatestReleaseByAuthor
4531 2         305 {
4532 2   50     11 my $self = shift( @_ );
4533             my $opts = $self->_get_args_as_hash( @_ );
4534 2   50     13 my $def = $opts->{def};
4535 2   50     13 my $data = $self->data ||
4536 2         9 return( $self->error( "No mock data could be found." ) );
4537 2         6579 my $lang = $opts->{lang} || DEFAULT_LANG;
4538             my $req = $opts->{request} || return( $self->error( "No request object was provided." ) );
4539 2   50     11 my $form = $req->as_form_data;
4540 2         10 my $vars = $opts->{vars};
4541 2         20 my $author = $vars->{author} ||
4542 2 50 33     33 return( $self->error({ code => 400, message => 'Missing parameter: author' }) );
      33        
4543             my $res = { releases => [] };
4544             my @keys = qw( abstract author date distribution name status );
4545             if( exists( $data->{users}->{ $author } ) &&
4546 2         6 exists( $data->{users}->{ $author }->{modules} ) &&
  2         13  
4547             ref( $data->{users}->{ $author }->{modules} ) eq 'HASH' )
4548 8         13 {
4549 8         14 foreach my $package ( sort( keys( %{$data->{users}->{ $author }->{modules}} ) ) )
4550 8         59 {
4551 8         9 my $this = $data->{users}->{ $author }->{modules}->{ $package };
  8         15  
4552             my $ref = {};
4553             @$ref{ @keys } = @$this{ @keys };
4554 2         7 push( @{$res->{releases}}, $ref );
4555 2         5 }
  2         4  
4556 2         7 }
4557 2         99 $res->{took} = 10;
4558             $res->{total} = scalar( @{$res->{releases}} );
4559             my $payload = $self->json->utf8->encode( $res );
4560             my $resp = HTTP::Promise::Response->new( 200, HTTP::Promise::Status->status_message( 200 => $lang ), [
4561             @STANDARD_HEADERS,
4562             Content_Type => 'application/json',
4563             Content_Length => length( $payload ),
4564 2         2622 Date => $self->_date_now,
4565             ], $payload,
4566             );
4567             return( $resp );
4568 3     3   26 }
  3         8  
  3         1323  
4569              
4570             {
4571             no warnings 'once';
4572             # NOTE: POST /v1/release/latest_by_author/{author}
4573             # NOTE: sub _PostLatestReleaseByAuthor
4574             *_PostLatestReleaseByAuthor = \&_GetLatestReleaseByAuthor;
4575             }
4576              
4577 2     2   87798 # NOTE: GET /v1/release/latest_by_distribution/{distribution}
4578 2         8 sub _GetLatestReleaseByDistribution
4579 2         299 {
4580 2   50     9 my $self = shift( @_ );
4581             my $opts = $self->_get_args_as_hash( @_ );
4582 2   50     22 my $def = $opts->{def};
4583 2   50     9 my $data = $self->data ||
4584 2         11 return( $self->error( "No mock data could be found." ) );
4585 2         6559 my $lang = $opts->{lang} || DEFAULT_LANG;
4586             my $req = $opts->{request} || return( $self->error( "No request object was provided." ) );
4587 2   50     10 my $form = $req->as_form_data;
4588 2         18 my $vars = $opts->{vars};
4589             my $dist = $vars->{distribution} ||
4590 2         23 return( $self->error({ code => 400, message => 'Missing parameter: distribution' }) );
4591             ( my $package = $dist ) =~ s/-/::/g;
4592             # Properties to copy
4593             my @keys = qw(
4594             abstract archive author authorized changes_file checksum_md5 checksum_sha256
4595 2         5 date dependency deprecated distribution download_url first id license main_module
4596 2         3 maturity metadata name provides resources stat status version version_numified
  2         21  
4597             );
4598 60 100 33     372 my $res;
      33        
      66        
4599             foreach my $user ( keys( %{$data->{users}} ) )
4600             {
4601             if( exists( $data->{users}->{ $user } ) &&
4602             exists( $data->{users}->{ $user }->{modules} ) &&
4603 2         7 ref( $data->{users}->{ $user }->{modules} ) eq 'HASH' &&
4604 2         5 exists( $data->{users}->{ $user }->{modules}->{ $package } ) )
4605 2         43 {
4606 2         9 my $this = $data->{users}->{ $user }->{modules}->{ $package };
4607             my $ref = {};
4608             @$ref{ @keys } = @$this{ @keys };
4609             $res =
4610             {
4611             release => $ref,
4612             took => 3,
4613             total => 1,
4614             };
4615 2         11 }
4616 2 50       6 }
4617              
4618 0         0 my $code = 200;
4619 0         0 if( !defined( $res ) )
4620             {
4621 2         7 $code = 404;
4622 2         153 $res = { code => $code, message => 'Not found' };
4623             }
4624             my $payload = $self->json->utf8->encode( $res );
4625             my $resp = HTTP::Promise::Response->new( $code, HTTP::Promise::Status->status_message( $code => $lang ), [
4626             @STANDARD_HEADERS,
4627             Content_Type => 'application/json',
4628             Content_Length => length( $payload ),
4629 2         2523 Date => $self->_date_now,
4630             ], $payload,
4631             );
4632             return( $resp );
4633 3     3   21 }
  3         23  
  3         1406  
4634              
4635             {
4636             no warnings 'once';
4637             # NOTE: POST /v1/release/latest_by_distribution/{distribution}
4638             # NOTE: sub _PostLatestReleaseByDistribution
4639             *_PostLatestReleaseByDistribution = \&_GetLatestReleaseByDistribution;
4640             }
4641              
4642             # NOTE: GET /v1/release/modules/{author}/{release}
4643 2     2   88248 # Example: /v1/release/modules/OALDERS/HTTP-Message-6.36
4644 2         12 sub _GetReleaseModules
4645 2         313 {
4646 2   50     8 my $self = shift( @_ );
4647             my $opts = $self->_get_args_as_hash( @_ );
4648 2   50     422 my $def = $opts->{def};
4649 2   50     12 my $data = $self->data ||
4650 2         8 return( $self->error( "No mock data could be found." ) );
4651 2         6627 my $lang = $opts->{lang} || DEFAULT_LANG;
4652             my $req = $opts->{request} || return( $self->error( "No request object was provided." ) );
4653 2   50     13 my $form = $req->as_form_data;
4654             my $vars = $opts->{vars};
4655 2   50     6 my $author = $vars->{author} ||
4656 2         8 return( $self->error({ code => 400, message => 'Missing parameter: author' }) );
4657 2         6 my $rel = $vars->{release} ||
4658 2         5 return( $self->error({ code => 400, message => 'Missing parameter: release' }) );
4659 2         23 my @parts = split( /-/, $rel );
4660 2         13 my $vers = pop( @parts );
4661 2         265 my $dist = join( '-', @parts );
4662             ( my $package = $dist ) =~ s/-/::/g;
4663             my $res = { files => [], took => 10, total => 1 };
4664             my @keys = qw(
4665             abstract archive author authorized changes_file checksum_md5 checksum_sha256
4666 2 50 33     48 date dependency deprecated distribution download_url first id license main_module
      33        
      33        
4667             maturity metadata name provides resources stat status version version_numified
4668             );
4669             if( exists( $data->{users}->{ $author } ) &&
4670             exists( $data->{users}->{ $author }->{modules} ) &&
4671 2         8 ref( $data->{users}->{ $author }->{modules} ) eq 'HASH' &&
4672 2         4 exists( $data->{users}->{ $author }->{modules}->{ $package } ) )
4673 2         42 {
4674 2         4 my $this = $data->{users}->{ $author }->{modules}->{ $package };
  2         7  
4675             my $ref = {};
4676 2         6 @$ref{ @keys } = @$this{ @keys };
4677 2 50       6 push( @{$res->{files}}, $ref );
4678             }
4679 0         0 my $code = 200;
4680 0         0 if( !defined( $res ) )
4681             {
4682             $code = 404;
4683 2         6 $res = { code => $code, message => 'Not found' };
4684 2         145 }
4685            
4686             my $payload = $self->json->utf8->encode( $res );
4687             my $resp = HTTP::Promise::Response->new( $code, HTTP::Promise::Status->status_message( $code => $lang ), [
4688             @STANDARD_HEADERS,
4689             Content_Type => 'application/json',
4690             Content_Length => length( $payload ),
4691 2         2553 Date => $self->_date_now,
4692             ], $payload,
4693             );
4694             return( $resp );
4695 3     3   22 }
  3         6  
  3         1355  
4696              
4697             {
4698             no warnings 'once';
4699             # NOTE: POST /v1/release/modules/{author}/{release}
4700             # NOTE: sub _PostReleaseModules
4701             *_PostReleaseModules = \&_GetReleaseModules;
4702             }
4703              
4704             # NOTE: GET /v1/release/recent
4705 2     2   87205 # See also _GetFavoriteRecent()
4706 2         8 sub _GetReleaseRecent
4707 2         276 {
4708 2   50     7 my $self = shift( @_ );
4709             my $opts = $self->_get_args_as_hash( @_ );
4710 2   50     21 my $def = $opts->{def};
4711 2   50     10 my $data = $self->data ||
4712 2         7 return( $self->error( "No mock data could be found." ) );
4713 2   50     6430 my $lang = $opts->{lang} || DEFAULT_LANG;
4714 2   50     131 my $req = $opts->{request} || return( $self->error( "No request object was provided." ) );
4715             my $form = $req->as_form_data;
4716 2   50     180 my $page = $form->{page} //= 1;
4717 2   50     8 my $size = $form->{size} //= 10;
4718             # $page cannot be 0. It falls back to 1
4719             $page ||= 1;
4720 2         4 my $recent = $self->_build_recent ||
4721 2         6 return( $self->pass_error );
4722 2         3
4723 2         7 my $releases = [];
4724             my $offset = ( ( $page - 1 ) * $size );
4725 2         91 my $n = 0;
4726             my @keys = qw( author date distribution id release user );
4727 22 50       34 # foreach my $dt ( sort{ $a <=> $b } keys( %$recent ) )
4728             foreach my $dt ( sort( keys( %$recent ) ) )
4729 22         33 {
4730 22         25 if( $n >= $offset )
4731 22         139 {
4732 22         33 my $this = $recent->{ $dt };
4733             my $ref = {};
4734 22         22 @$ref{ @keys } = @$this{ @keys };
4735 22 100       38 push( @$releases, $ref );
4736             }
4737 2         17 $n++;
4738             last if( $n > ( $offset + $size ) );
4739             }
4740             my $res =
4741             {
4742             releases => $releases,
4743             took => 8,
4744 2         7 total => scalar( keys( %$recent ) ),
4745 2         102 };
4746            
4747             my $payload = $self->json->encode( $res );
4748             my $resp = HTTP::Promise::Response->new( 200, HTTP::Promise::Status->status_message( 200 => $lang ), [
4749             @STANDARD_HEADERS,
4750             Content_Type => 'application/json',
4751             Content_Length => length( $payload ),
4752 2         2528 Date => $self->_date_now,
4753             ], $payload,
4754             );
4755             return( $resp );
4756 3     3   27 }
  3         4  
  3         796  
4757              
4758             {
4759             no warnings 'once';
4760             # NOTE: POST /v1/release/recent
4761             # NOTE: sub _PostReleaseRecent
4762             *_PostReleaseRecent = \&_GetReleaseRecent;
4763             }
4764              
4765 2     2   87954 # NOTE: GET /v1/release/top_uploaders
4766 2         14 sub _GetTopReleaseUploaders
4767 2         291 {
4768 2   50     8 my $self = shift( @_ );
4769             my $opts = $self->_get_args_as_hash( @_ );
4770 2   50     20 my $def = $opts->{def};
4771 2   50     12 my $data = $self->data ||
4772 2         8 return( $self->error( "No mock data could be found." ) );
4773 2         6585 my $lang = $opts->{lang} || DEFAULT_LANG;
4774 2         4 my $req = $opts->{request} || return( $self->error( "No request object was provided." ) );
  2         25  
4775             my $form = $req->as_form_data;
4776 60         56 my $all = {};
  60         155  
4777             foreach my $user ( keys( %{$data->{users}} ) )
4778 2         14 {
4779 2         7 $all->{ $user } = scalar( keys( %{$data->{users}->{ $user }->{modules}} ) );
4780 2         82 }
4781             my $res = { counts => $all, took => 10, total => scalar( keys( %$all ) ) };
4782             my $payload = $self->json->encode( $res );
4783             my $resp = HTTP::Promise::Response->new( 200, HTTP::Promise::Status->status_message( 200 => $lang ), [
4784             @STANDARD_HEADERS,
4785             Content_Type => 'application/json',
4786             Content_Length => length( $payload ),
4787 2         2588 Date => $self->_date_now,
4788             ], $payload,
4789             );
4790             return( $resp );
4791 3     3   24 }
  3         8  
  3         1178  
4792              
4793             {
4794             no warnings 'once';
4795             # NOTE: POST /v1/release/top_uploaders
4796             # NOTE: sub _PostTopReleaseUploaders
4797             *_PostTopReleaseUploaders = \&_GetTopReleaseUploaders;
4798             }
4799              
4800 2     2   88069 # NOTE: GET /v1/release/versions/{distribution}
4801 2         7 sub _GetAllReleasesByVersion
4802 2         298 {
4803 2   50     7 my $self = shift( @_ );
4804             my $opts = $self->_get_args_as_hash( @_ );
4805 2   50     15 my $def = $opts->{def};
4806 2   50     8 my $data = $self->data ||
4807 2         10 return( $self->error( "No mock data could be found." ) );
4808 2         6464 my $lang = $opts->{lang} || DEFAULT_LANG;
4809             my $req = $opts->{request} || return( $self->error( "No request object was provided." ) );
4810 2   50     9 my $form = $req->as_form_data;
4811 2         19 my $vars = $opts->{vars};
4812 2         11 my $dist = $vars->{distribution} ||
4813 2         14 return( $self->error({ code => 400, message => 'Missing parameter: distribution' }) );
4814 2         4 ( my $package = $dist ) =~ s/-/::/g;
  2         34  
4815             my $res = { releases => [], took => 10, total => 1 };
4816 2 50 33     27 my @keys = qw( author authorized date download_url maturity name status version );
4817 2 50       7 foreach my $user ( sort( keys( %{$data->{users}} ) ) )
4818             {
4819 2         6 next unless( exists( $data->{users}->{ $user }->{modules} ) && ref( $data->{users}->{ $user }->{modules} ) eq 'HASH' );
4820 2         4 if( exists( $data->{users}->{ $user }->{modules}->{ $package } ) )
4821 2         24 {
4822 2         3 my $this = $data->{users}->{ $user }->{modules}->{ $package };
  2         6  
4823 2         6 my $ref = {};
4824             @$ref{ @keys } = @$this{ @keys };
4825             push( @{$res->{releases}}, $ref );
4826 2         10 last;
4827 2         86 }
4828             }
4829             my $payload = $self->json->encode( $res );
4830             my $resp = HTTP::Promise::Response->new( 200, HTTP::Promise::Status->status_message( 200 => $lang ), [
4831             @STANDARD_HEADERS,
4832             Content_Type => 'application/json',
4833             Content_Length => length( $payload ),
4834 2         2504 Date => $self->_date_now,
4835             ], $payload,
4836             );
4837             return( $resp );
4838 3     3   22 }
  3         6  
  3         169  
4839              
4840             {
4841             no warnings 'once';
4842             # NOTE: POST /v1/release/versions/{distribution}
4843             # NOTE: sub _PostAllReleasesByVersion
4844             *_PostAllReleasesByVersion = \&_GetAllReleasesByVersion;
4845             }
4846              
4847             # NOTE: GET /v1/release/_mapping
4848             # GetReleaseMapping is accessed directly in the data
4849              
4850             # NOTE: POST /v1/release/_mapping
4851 3     3   34 # PostReleaseMapping is accessed directly in the data
  3         8  
  3         928  
4852              
4853             {
4854             no warnings 'once';
4855             # NOTE: GET /v1/release/_search
4856             # NOTE: POST /v1/release/_search
4857             # NOTE: sub _GetReleaseSearch
4858             # NOTE: sub _PostReleaseSearch
4859             *_GetReleaseSearch = \&_GetRelease;
4860             *_PostReleaseSearch = \&_GetRelease;
4861             }
4862              
4863             # NOTE: DELETE /v1/release/_search/scroll
4864             # TODO: _DeleteReleaseSearchScroll
4865 1     1   45691 # Need to find out exactly what this endpoint returns
4866 1         6 sub _DeleteReleaseSearchScroll
4867 1         150 {
4868 1   50     5 my $self = shift( @_ );
4869             my $opts = $self->_get_args_as_hash( @_ );
4870 1   50     17 my $def = $opts->{def};
4871 1   50     7 my $data = $self->data ||
4872 1         5 return( $self->error( "No mock data could be found." ) );
4873 1         3807 my $lang = $opts->{lang} || DEFAULT_LANG;
4874 1         4 my $req = $opts->{request} || return( $self->error( "No request object was provided." ) );
4875 1         44 my $form = $req->as_form_data;
4876             my $msg = { code => 501, message => 'Not implemented' };
4877             my $payload = $self->json->encode( $msg );
4878             my $resp = HTTP::Promise::Response->new( $msg->{code}, HTTP::Promise::Status->status_message( $msg->{code} => $lang ), [
4879             @STANDARD_HEADERS,
4880             Content_Type => 'application/json',
4881             Content_Length => length( $payload ),
4882 1         1317 Date => $self->_date_now,
4883             ], $payload,
4884             );
4885             return( $resp );
4886             }
4887              
4888 2     2   45344 # NOTE: GET /v1/release/_search/scroll
4889 2         11 sub _GetReleaseSearchScroll
4890 2         276 {
4891 2         12 my $self = shift( @_ );
4892             my $opts = $self->_get_args_as_hash( @_ );
4893             $opts->{scroll} = 1;
4894             return( $self->_GetReleaseSearch( %$opts ) );
4895 3     3   22 }
  3         6  
  3         739  
4896              
4897             {
4898             no warnings 'once';
4899             # NOTE: POST /v1/release/_search/scroll
4900             # NOTE: sub _PostReleaseSearchScroll
4901             *_PostReleaseSearchScroll = \&_GetReleaseSearchScroll;
4902             }
4903              
4904             # NOTE: GET /v1/reverse_dependencies/dist/{distribution}
4905 2     2   88905 # TODO: finalise code for this, but is it really necessary?
4906 2         13 sub _GetReverseDependencyDist
4907 2         326 {
4908 2   50     7 my $self = shift( @_ );
4909             my $opts = $self->_get_args_as_hash( @_ );
4910 2   50     20 my $def = $opts->{def};
4911 2   50     9 my $data = $self->data ||
4912 2         13 return( $self->error( "No mock data could be found." ) );
4913 2         6562 my $lang = $opts->{lang} || DEFAULT_LANG;
4914             my $req = $opts->{request} || return( $self->error( "No request object was provided." ) );
4915 2   50     9 my $form = $req->as_form_data;
4916 2         10 my $vars = $opts->{vars};
4917             my $dist = $vars->{distribution} ||
4918             return( $self->error({ code => 400, message => 'Missing parameter: distribution' }) );
4919             my $res = { data => [], took => 10, total => 0 };
4920             # foreach my $user ( sort( keys( %{$data->{users}} ) ) )
4921             # {
4922             # next unless( exists( $data->{users}->{ $user }->{modules} ) && ref( $data->{users}->{ $user }->{modules} ) eq 'HASH' );
4923             # if( exists( $data->{users}->{ $user }->{modules}->{ $module } ) )
4924             # {
4925             # my $this = $data->{users}->{ $user }->{modules}->{ $module };
4926             # my $ref = {};
4927             # @$ref{ @keys } = @$this{ @keys };
4928             # push( @{$res->{data}}, $ref );
4929 2         8 # last;
4930 2         77 # }
4931             # }
4932             my $payload = $self->json->encode( $res );
4933             my $resp = HTTP::Promise::Response->new( 200, HTTP::Promise::Status->status_message( 200 => $lang ), [
4934             @STANDARD_HEADERS,
4935             Content_Type => 'application/json',
4936             Content_Length => length( $payload ),
4937 2         2530 Date => $self->_date_now,
4938             ], $payload,
4939             );
4940             return( $resp );
4941 3     3   22 }
  3         5  
  3         683  
4942              
4943             {
4944             no warnings 'once';
4945             # NOTE: POST /v1/reverse_dependencies/dist/{distribution}
4946             # NOTE: sub _PostReverseDependencyDist
4947             *_PostReverseDependencyDist = \&_GetReverseDependencyDist;
4948             }
4949              
4950             # NOTE: GET /v1/reverse_dependencies/module/{module}
4951 2     2   88910 # TODO: finalise code for this, but is it really necessary?
4952 2         11 sub _GetReverseDependencyModule
4953 2         312 {
4954 2   50     9 my $self = shift( @_ );
4955             my $opts = $self->_get_args_as_hash( @_ );
4956 2   50     28 my $def = $opts->{def};
4957 2   50     11 my $data = $self->data ||
4958 2         9 return( $self->error( "No mock data could be found." ) );
4959 2         6741 my $lang = $opts->{lang} || DEFAULT_LANG;
4960             my $req = $opts->{request} || return( $self->error( "No request object was provided." ) );
4961 2   50     11 my $form = $req->as_form_data;
4962 2         8 my $vars = $opts->{vars};
4963 2         9 my $module = $vars->{module} ||
4964 2         84 return( $self->error({ code => 400, message => 'Missing parameter: module' }) );
4965             my $res = { data => [], took => 10, total => 0 };
4966             my $payload = $self->json->encode( $res );
4967             my $resp = HTTP::Promise::Response->new( 200, HTTP::Promise::Status->status_message( 200 => $lang ), [
4968             @STANDARD_HEADERS,
4969             Content_Type => 'application/json',
4970             Content_Length => length( $payload ),
4971 2         2694 Date => $self->_date_now,
4972             ], $payload,
4973             );
4974             return( $resp );
4975 3     3   22 }
  3         5  
  3         6727  
4976              
4977             {
4978             no warnings 'once';
4979             # NOTE: POST /v1/reverse_dependencies/module/{module}
4980             # NOTE: sub _PostReverseDependencyModule
4981             *_PostReverseDependencyModule = \&_GetReverseDependencyModule;
4982             }
4983              
4984             # NOTE: GET /v1/search
4985 1     1   45414 # TODO: I have tried query with 'q', but it does not seem to work. Need to investigate (2023-08-25)
4986 1         6 sub _GetSearchResult
4987 1         145 {
4988 1   50     5 my $self = shift( @_ );
4989             my $opts = $self->_get_args_as_hash( @_ );
4990 1   50     14 my $def = $opts->{def};
4991 1   50     6 my $data = $self->data ||
4992 1         7 return( $self->error( "No mock data could be found." ) );
4993 1         3867 my $lang = $opts->{lang} || DEFAULT_LANG;
4994 1         5 my $req = $opts->{request} || return( $self->error( "No request object was provided." ) );
4995 1         35 my $form = $req->as_form_data;
4996             my $msg = { code => 501, message => 'Not implemented' };
4997             my $payload = $self->json->encode( $msg );
4998             my $resp = HTTP::Promise::Response->new( $msg->{code}, HTTP::Promise::Status->status_message( $msg->{code} => $lang ), [
4999             @STANDARD_HEADERS,
5000             Content_Type => 'application/json',
5001             Content_Length => length( $payload ),
5002 1         1251 Date => $self->_date_now,
5003             ], $payload,
5004             );
5005             return( $resp );
5006             }
5007              
5008 1     1   47387 # NOTE: GET /v1/search/autocomplete
5009 1         6 sub _GetSearchAutocompleteResult
5010 1         142 {
5011 1   50     4 my $self = shift( @_ );
5012             my $opts = $self->_get_args_as_hash( @_ );
5013 1   50     8 my $def = $opts->{def};
5014 1   50     4 my $data = $self->data ||
5015             return( $self->error( "No mock data could be found." ) );
5016             my $lang = $opts->{lang} || DEFAULT_LANG;
5017 1         7 my $req = $opts->{request} || return( $self->error( "No request object was provided." ) );
5018             # Including JSON payload, such as:
5019 1   33     3794 # {"query": {"match_all":{}},"filter":{"and":[{"term":{"pauseid":"JOHNDOE"}}]}}
5020             my $form = $req->as_form_data;
5021             my $q = $form->{'q'} || do
5022             {
5023             my $res =
5024             {
5025             source => \1,
5026             type => undef,
5027             inflate => 1,
5028             _refresh => 0,
5029             'index' => undef,
5030             };
5031             my $payload = $self->json->encode( $res );
5032             my $resp = HTTP::Promise::Response->new( 400, HTTP::Promise::Status->status_message( 400 => $lang ), [
5033             @STANDARD_HEADERS,
5034             Content_Type => 'application/json',
5035             Content_Length => length( $payload ),
5036             Date => $self->_date_now,
5037             ], $payload,
5038 1         26 );
5039             return( $resp );
5040             };
5041 3     3   5 my $query = "${q}.*";
5042             return( $self->_search( %$opts, query => $query, type => 'file', callback => sub
5043             {
5044             my $this = shift( @_ );
5045             return({
5046             _id => $this->{id},
5047             _index => "cpan_v1_01",
5048             _score => 6.99089,
5049             _type => "file",
5050             _version => 22,
5051             fields => {
5052             author => $this->{author},
5053             distribution => $this->{distribution},
5054             documentation => $this->{package},
5055             release => $this->{release}
5056             },
5057 3         41 'sort' => [
5058             6.99089,
5059 1         24 $this->{package},
5060             ]
5061             });
5062             }) );
5063             }
5064              
5065 1     1   45352 # NOTE: GET /v1/search/autocomplete/suggest
5066 1         6 sub _GetSearchAutocompleteSuggestResult
5067 1         150 {
5068 1   50     4 my $self = shift( @_ );
5069             my $opts = $self->_get_args_as_hash( @_ );
5070 1   50     7 my $def = $opts->{def};
5071 1   50     7 my $data = $self->data ||
5072             return( $self->error( "No mock data could be found." ) );
5073             my $lang = $opts->{lang} || DEFAULT_LANG;
5074 1         4 my $req = $opts->{request} || return( $self->error( "No request object was provided." ) );
5075             # Including JSON payload, such as:
5076 1   33     3909 # {"query": {"match_all":{}},"filter":{"and":[{"term":{"pauseid":"JOHNDOE"}}]}}
5077             my $form = $req->as_form_data;
5078             my $q = $form->{'q'} || do
5079             {
5080             my $res =
5081             {
5082             source => \1,
5083             type => undef,
5084             inflate => 1,
5085             _refresh => 0,
5086             'index' => undef,
5087             };
5088             my $payload = $self->json->encode( $res );
5089             my $resp = HTTP::Promise::Response->new( 400, HTTP::Promise::Status->status_message( 400 => $lang ), [
5090             @STANDARD_HEADERS,
5091             Content_Type => 'application/json',
5092             Content_Length => length( $payload ),
5093             Date => $self->_date_now,
5094             ], $payload,
5095             );
5096 1         29 return( $resp );
5097 1         22 };
5098 1         5
  1         14  
5099             my $suggestions = [];
5100 30 50       59 my @keys = qw( author date deprecated distribution name release );
5101 30         28 foreach my $user ( keys( %{$data->{users}} ) )
  30         60  
5102             {
5103 98         128 next unless( exists( $data->{users}->{ $user }->{modules} ) );
5104 98 100       261 foreach my $package ( keys( %{$data->{users}->{ $user }->{modules}} ) )
5105             {
5106 1         3 my $this = $data->{users}->{ $user }->{modules}->{ $package };
5107 1         11 if( $this->{package} =~ /^$q/ )
5108 1         3 {
5109             my $ref = {};
5110             @$ref{ @keys } = @$this{ @keys };
5111             push( @$suggestions, $ref );
5112 1         8 }
5113 1         5 }
5114 1         42 }
5115             my $res = { suggestions => $suggestions };
5116             my $payload = $self->json->encode( $res );
5117             my $resp = HTTP::Promise::Response->new( 200, HTTP::Promise::Status->status_message( 200 => $lang ), [
5118             @STANDARD_HEADERS,
5119             Content_Type => 'application/json',
5120             Content_Length => length( $payload ),
5121 1         1302 Date => $self->_date_now,
5122             ], $payload,
5123             );
5124             return( $resp );
5125             }
5126              
5127 1     1   45956 # NOTE: GET /v1/search/first
5128 1         6 sub _GetSearchFirstResult
5129 1         160 {
5130 1   50     6 my $self = shift( @_ );
5131             my $opts = $self->_get_args_as_hash( @_ );
5132 1   50     6 my $def = $opts->{def};
5133 1   50     5 my $data = $self->data ||
5134             return( $self->error( "No mock data could be found." ) );
5135             my $lang = $opts->{lang} || DEFAULT_LANG;
5136 1         6 my $req = $opts->{request} || return( $self->error( "No request object was provided." ) );
5137             # Including JSON payload, such as:
5138 1   33     3923 # {"query": {"match_all":{}},"filter":{"and":[{"term":{"pauseid":"JOHNDOE"}}]}}
5139             my $form = $req->as_form_data;
5140             my $q = $form->{'q'} || do
5141             {
5142             my $res =
5143             {
5144             source => \1,
5145             type => undef,
5146             inflate => 1,
5147             _refresh => 0,
5148             'index' => undef,
5149             };
5150             my $payload = $self->json->encode( $res );
5151             my $resp = HTTP::Promise::Response->new( 400, HTTP::Promise::Status->status_message( 400 => $lang ), [
5152             @STANDARD_HEADERS,
5153             Content_Type => 'application/json',
5154             Content_Length => length( $payload ),
5155             Date => $self->_date_now,
5156             ], $payload,
5157             );
5158 1         27 return( $resp );
5159 1         22 };
5160 1         3
  1         13  
5161             my $res;
5162 30 50       91 my @keys = qw( author authorized date description distribution documentation id indexed pod_lines release status );
5163 30         33 foreach my $user ( keys( %{$data->{users}} ) )
  30         77  
5164             {
5165 98         129 next unless( exists( $data->{users}->{ $user }->{modules} ) );
5166 98 100       279 foreach my $package ( keys( %{$data->{users}->{ $user }->{modules}} ) )
5167             {
5168             my $this = $data->{users}->{ $user }->{modules}->{ $package };
5169             if( $this->{package} =~ /^$q/ )
5170             {
5171 1         12 $res =
5172 1         4 {
5173             'abstract.analyzed' => $this->{abstract},
5174 1         15 dist_fav_count => scalar( @{$this->{likers}} ),
5175             path => 'lib/' . join( '/', split( /::/, $this->{package} ) ) . '.pm',
5176             };
5177             @$res{ @keys } = @$this{ @keys };
5178             }
5179 1         6 }
5180 1 50       5 }
5181            
5182 0         0 my $code = 200;
5183 0         0 if( !defined( $res ) )
5184             {
5185 1         8 $code = 404;
5186 1         44 $res = { code => 404, message => 'The requested info could not be found' };
5187             }
5188             my $payload = $self->json->encode( $res );
5189             my $resp = HTTP::Promise::Response->new( $code, HTTP::Promise::Status->status_message( $code => $lang ), [
5190             @STANDARD_HEADERS,
5191             Content_Type => 'application/json',
5192             Content_Length => length( $payload ),
5193 1         1351 Date => $self->_date_now,
5194             ], $payload,
5195             );
5196             return( $resp );
5197             }
5198              
5199 1     1   46823 # NOTE: GET /v1/search/web
5200 1         7 sub _GetSearchWebResult
5201 1         152 {
5202 1   50     6 my $self = shift( @_ );
5203             my $opts = $self->_get_args_as_hash( @_ );
5204 1   50     20 my $def = $opts->{def};
5205 1   50     7 my $data = $self->data ||
5206             return( $self->error( "No mock data could be found." ) );
5207             my $lang = $opts->{lang} || DEFAULT_LANG;
5208 1         13 my $req = $opts->{request} || return( $self->error( "No request object was provided." ) );
5209 1   50     4072 # Including JSON payload, such as:
5210 1   50     43 # {"query": {"match_all":{}},"filter":{"and":[{"term":{"pauseid":"JOHNDOE"}}]}}
5211             my $form = $req->as_form_data;
5212 1   33     31 my $from = $form->{from} // 0;
5213             my $size = $form->{size} // 10;
5214             my $q = $form->{'q'} || do
5215             {
5216             my $res =
5217             {
5218             source => \1,
5219             type => undef,
5220             inflate => 1,
5221             _refresh => 0,
5222             'index' => undef,
5223             };
5224             my $payload = $self->json->encode( $res );
5225             my $resp = HTTP::Promise::Response->new( 400, HTTP::Promise::Status->status_message( 400 => $lang ), [
5226             @STANDARD_HEADERS,
5227             Content_Type => 'application/json',
5228             Content_Length => length( $payload ),
5229             Date => $self->_date_now,
5230             ], $payload,
5231             );
5232 1         25 return( $resp );
5233 1         3 };
5234 1         24
5235             my $results = [];
5236             my $offset = 0;
5237             my @keys = qw(
5238 1         4 abstract author authorized date description distribution documentation
  1         17  
5239             favorites id indexed module pod_lines release score status
5240 30 50       217 );
5241 30         35 foreach my $user ( keys( %{$data->{users}} ) )
  30         213  
5242 30         484 {
  30         226  
5243             next unless( exists( $data->{users}->{ $user }->{modules} ) );
5244 98         235 $self->message( 4, scalar( keys( %{$data->{users}->{ $user }->{modules}} ) ), " modules for user $user" );
5245 98         1318 foreach my $package ( keys( %{$data->{users}->{ $user }->{modules}} ) )
5246 98 50 66     2127 {
      66        
      33        
5247             my $this = $data->{users}->{ $user }->{modules}->{ $package };
5248             $self->message( 4, "$user -> $package -> package = '$this->{package}', abstract = '$this->{abstract}', name = '$this->{name}', distribution = '$this->{distribution}'." );
5249             if( $this->{package} =~ /$q/ ||
5250             $this->{abstract} =~ /$q/ ||
5251 1 50       16 $this->{name} =~ /$q/ ||
5252             $this->{distribution} =~ /$q/ )
5253 1         2 {
5254 1         22 if( $offset >= $from )
5255             {
5256             my $ref = {};
5257             @$ref{ @keys } = @$this{ @keys };
5258 1         6 my $result =
5259             {
5260             distribution => $this->{distribution},
5261 1         3 hits => [ $ref ],
5262             total => 1,
5263 1         2 };
5264 1 50       7 push( @$results, $result );
5265             }
5266             $offset++;
5267             last if( scalar( @$results ) == $size );
5268 1         24 }
5269 1         10 }
5270 1         60 }
5271             my $res = { collapsed => \1, results => $results, took => 10, total => 1234 };
5272             my $payload = $self->json->encode( $res );
5273             my $resp = HTTP::Promise::Response->new( 200, HTTP::Promise::Status->status_message( 200 => $lang ), [
5274             @STANDARD_HEADERS,
5275             Content_Type => 'application/json',
5276             Content_Length => length( $payload ),
5277 1         1381 Date => $self->_date_now,
5278             ], $payload,
5279             );
5280             return( $resp );
5281             }
5282              
5283 2     2   88661 # NOTE: GET /v1/source/{author}/{release}/{path}
5284 2         9 sub _GetSourceReleasePath
5285 2         294 {
5286 2   50     8 my $self = shift( @_ );
5287             my $opts = $self->_get_args_as_hash( @_ );
5288 2   50     20 my $def = $opts->{def};
5289 2   50     11 my $data = $self->data ||
5290 2         10 return( $self->error( "No mock data could be found." ) );
5291 2         6659 my $lang = $opts->{lang} || DEFAULT_LANG;
5292             my $req = $opts->{request} || return( $self->error( "No request object was provided." ) );
5293 2   50     17 my $form = $req->as_form_data;
5294             my $vars = $opts->{vars};
5295 2   50     9 my $author = $vars->{author} ||
5296 2         9 return( $self->error({ code => 400, message => 'Missing parameter: author' }) );
5297 2         6 my $rel = $vars->{release} ||
5298 2         6 return( $self->error({ code => 400, message => 'Missing parameter: release' }) );
5299 2         4 my @parts = split( /-/, $rel );
5300 2         4 my $vers = pop( @parts );
5301 2 50 33     38 my $dist = join( '-', @parts );
      33        
      33        
5302             my $package = join( '::', @parts );
5303             my $res;
5304             if( exists( $data->{users}->{ $author } ) &&
5305             exists( $data->{users}->{ $author }->{modules} ) &&
5306 2         10 ref( $data->{users}->{ $author }->{modules} ) eq 'HASH' &&
5307             exists( $data->{users}->{ $author }->{modules}->{ $package } ) )
5308             {
5309             $res = <<EOT;
5310             package ${package};
5311             # This is a fake representation of ${dist}
5312              
5313             1;
5314 2         5  
5315 2         7 EOT
5316 2 50       6 }
5317             my $code = 200;
5318 0         0 my $type = 'text/plain';
5319 0         0 if( !defined( $res ) )
5320 0         0 {
5321             $code = 404;
5322 2         10 $res = $self->json->encode({ code => $code, message => 'Not found' });
5323             $type = 'application/json';
5324             }
5325             my $resp = HTTP::Promise::Response->new( $code, HTTP::Promise::Status->status_message( $code => $lang ), [
5326             @STANDARD_HEADERS,
5327             Content_Type => $type,
5328             Content_Length => length( $res ),
5329 2         2669 Date => $self->_date_now,
5330             ], $res,
5331             );
5332             return( $resp );
5333 3     3   23 }
  3         5  
  3         1120  
5334              
5335             {
5336             no warnings 'once';
5337             # NOTE: POST /v1/source/{author}/{release}/{path}
5338             # NOTE: sub _PostSourceReleasePath
5339             *_PostSourceReleasePath = \&_GetSourceReleasePath;
5340             }
5341              
5342 2     2   89609 # NOTE: GET /v1/source/{module}
5343 2         16 sub _GetModuleSource
5344 2         368 {
5345 2   50     16 my $self = shift( @_ );
5346             my $opts = $self->_get_args_as_hash( @_ );
5347 2   50     26 my $def = $opts->{def};
5348 2   50     15 my $data = $self->data ||
5349 2         12 return( $self->error( "No mock data could be found." ) );
5350 2         7003 my $lang = $opts->{lang} || DEFAULT_LANG;
5351             my $req = $opts->{request} || return( $self->error( "No request object was provided." ) );
5352 2   50     10 my $form = $req->as_form_data;
5353 2         12 my $vars = $opts->{vars};
5354 2         4 my $package = $vars->{module} ||
  2         26  
5355             return( $self->error({ code => 400, message => 'Missing parameter: module' }) );
5356 52 100 33     320 my $res;
      66        
5357             foreach my $user ( keys( %{$data->{users}} ) )
5358             {
5359             if( exists( $data->{users}->{ $user }->{modules} ) &&
5360 2         16 ref( $data->{users}->{ $user }->{modules} ) eq 'HASH' &&
5361 2         26 exists( $data->{users}->{ $user }->{modules}->{ $package } ) )
5362 2         12 {
5363             my $this = $data->{users}->{ $user }->{modules}->{ $package };
5364             my $dist = $this->{distribution};
5365             $res = <<EOT;
5366             package ${package};
5367             # This is a fake representation of ${dist}
5368              
5369 2         6 1;
5370              
5371             EOT
5372 2         9 last;
5373 2         4 }
5374 2 50       16 }
5375             my $code = 200;
5376 0         0 my $type = 'text/plain';
5377 0         0 if( !defined( $res ) )
5378 0         0 {
5379             $code = 404;
5380 2         17 $res = $self->json->encode({ code => $code, message => 'Not found' });
5381             $type = 'application/json';
5382             }
5383             my $resp = HTTP::Promise::Response->new( $code, HTTP::Promise::Status->status_message( $code => $lang ), [
5384             @STANDARD_HEADERS,
5385             Content_Type => $type,
5386             Content_Length => length( $res ),
5387 2         2825 Date => $self->_date_now,
5388             ], $res,
5389             );
5390             return( $resp );
5391 3     3   22 }
  3         7  
  3         23555  
5392              
5393             {
5394             no warnings 'once';
5395             # NOTE: POST /v1/source/{module}
5396             # NOTE: sub _PostModuleSource
5397             *_PostModuleSource = \&_GetModuleSource;
5398             }
5399 4     4   8  
5400 4   50     12 sub _build_recent
5401             {
5402 4         9 my $self = shift( @_ );
5403 4 100       18 my $data = $self->data ||
5404             return( $self->error( "No mock data could be found." ) );
5405 1         12 my $recent;
5406             unless( $recent = $self->{_recent} )
5407             {
5408             my $fmt = DateTime::Format::Strptime->new(
5409 1         2089 # iso8601
5410 1         4 pattern => '%FT%T',
  1         23  
5411             );
5412 30 50 33     238 $recent = {};
5413 30         38 foreach my $user ( keys( %{$data->{users}} ) )
  30         138  
5414             {
5415 98         247 next unless( exists( $data->{users}->{ $user }->{modules} ) && ref( $data->{users}->{ $user }->{modules} ) eq 'HASH' );
5416 98         111 foreach my $package ( keys( %{$data->{users}->{ $user }->{modules}} ) )
5417             {
5418             my $this = $data->{users}->{ $user }->{modules}->{ $package };
5419 98         138 local $@;
5420 98         386 # try-catch
5421 98         62579 eval
5422             {
5423 98 50       3831 my $dt = $fmt->parse_datetime( $this->{date} );
5424             $recent->{ $dt } = $this;
5425 0         0 };
5426 0         0 if( $@ )
5427             {
5428             warn( "Error parsing module $package date: $@" );
5429             next;
5430 1         123 }
5431             }
5432 4         21 }
5433             $self->{_recent} = $recent;
5434             }
5435             return( $recent );
5436             }
5437 180     180   3812  
5438             sub _date_now
5439 180         1043 {
5440             my $self = shift( @_ );
5441             # Fri, 18 Aug 2023 01:49:43 GMT
5442             my $fmt = DateTime::Format::Strptime->new(
5443 180         311390 pattern => '%a, %d %b %Y %H:%M:%S GMT',
5444 180         65090 locale => 'en_GB',
5445 180         12127 );
5446             my $now = DateTime->now;
5447             $now->set_formatter( $fmt );
5448             return( $now );
5449             }
5450 4     4   12  
5451 4         15 sub _make_changes_from_module
5452             {
5453             my( $self, $this ) = @_;
5454             my @keys = qw( author date distribution download_url id maturity version version_numified );
5455             my $info =
5456             {
5457             binary => \0,
5458             category => 'changelog',
5459             content => "Changes file for $this->{package}\n\n$this->{version} 2023-08-15T09:12:17\n\n - New stuff",
5460             directory => \0,
5461             indexed => \0,
5462             level => 0,
5463             mime => '',
5464             module => [],
5465             name => 'Changes',
5466 4         117 path => 'Changes',
5467             pod => '',
5468             pod_lines => [],
5469             release => join( '-', @$this{qw( distribution version )} ),
5470             sloc => 487,
5471             slop => 0,
5472             stat =>
5473             {
5474             mode => 33188,
5475             mtime => 1690672351,
5476             size => 35529,
5477 4         45 },
5478 4 50       128 status => 'latest',
5479 4 50       16 };
5480 4         13 @$info{ @keys } = @$this{ @keys };
5481             $info->{authorized} = $info->{authorized} ? \1 : \0;
5482             $info->{deprecated} = $info->{deprecated} ? \1 : \0;
5483             return( $info );
5484             }
5485 47     47   160  
5486 47         245 sub _search
5487 47         6365 {
5488 47   50     253 my $self = shift( @_ );
5489             my $opts = $self->_get_args_as_hash( @_ );
5490 47   50     304 my $def = $opts->{def};
5491 47   50     161 my $data = $self->data ||
5492             return( $self->error( "No mock data could be found." ) );
5493             my $lang = $opts->{lang} || DEFAULT_LANG;
5494 47         173 my $req = $opts->{request} || return( $self->error( "No request object was provided." ) );
5495 47         212594 # Including JSON payload, such as:
5496 47   50     362 # {"query": {"match_all":{}},"filter":{"and":[{"term":{"pauseid":"JOHNDOE"}}]}}
5497 47   50     1309 my $form = $req->as_form_data;
5498             my $hits = [];
5499 47   50     1135 my $from = $form->{from} // 0;
5500             my $size = $form->{size} // 10;
5501 47   50     235 my $type = $opts->{type} ||
5502 47         94 return( $self->error({ code => 500, message => 'Missing "type" parameter for _search method.' }) );
5503 47 100 66     405 my $cb = $opts->{callback} ||
    100 66        
      66        
      66        
5504             return( $self->error({ code => 500, message => 'Missing "callback" parameter for _search method.' }) );
5505             my $q;
5506             if( exists( $opts->{query} ) &&
5507 1         3 defined( $opts->{query} ) &&
5508             length( $opts->{query} ) )
5509             {
5510             $q = $opts->{query};
5511             }
5512             elsif( $req->method eq 'POST' &&
5513             $req->headers->type &&
5514 23         23549 $req->headers->type eq 'application/json' )
5515             {
5516             # Because this is only a fake interface, what can be queried and how it can be is predetermined.
5517             $q = $form->{filter}->{and}->[0]->{term}->{pauseid};
5518 23   100     19519 }
5519             else
5520             {
5521 47         2666 $q = $form->{ 'q' } // '';
5522 47         728 }
5523 47 100       170
5524             my $matches = [];
5525 28 50       145 my $total;
5526             if( !length( $q ) )
5527 0         0 {
  0         0  
5528             if( $type eq 'author' )
5529             {
5530             $matches = [values( %{$data->{users}} )];
5531 28         73 }
  28         242  
5532             else
5533 840 50 33     3155 {
5534 840         883 foreach my $user ( keys( %{$data->{users}} ) )
  840         4467  
5535             {
5536             next unless( exists( $data->{users}->{ $user }->{modules} ) && ref( $data->{users}->{ $user }->{modules} ) eq 'HASH' );
5537             push( @$matches, map( $data->{users}->{ $user }->{modules}->{ $_ }, keys( %{$data->{users}->{ $user }->{modules}} ) ) );
5538 28   50     208 }
5539             }
5540             # Actual number of CPAN modules
5541             $total = $opts->{total} // 29178966;
5542 19         180 }
5543             else
5544 19         615 {
5545 19 50       89 $self->message( 4, "Query is '$q'" );
5546             # my $re = qr/$q/;
5547 0         0 my( $prop, $query );
5548             if( index( $q, ':' ) != -1 )
5549             {
5550             ( $prop, $query ) = split( /:/, $q, 2 );
5551 19         46 }
5552             else
5553 19         184 {
5554 19         120 $query = $q;
5555 19 100       362 }
5556             my $re = qr/$query/;
5557 6         14 $self->message( 4, "Using regular expression -> $re" );
  6         114  
5558             if( $type eq 'author' )
5559 180         744 {
5560 180 50 66     1761 foreach my $user ( sort( keys( %{$data->{users}} ) ) )
      66        
      33        
5561             {
5562             my $this = $data->{users}->{ $user };
5563             if( $this->{pauseid} =~ /$re/ ||
5564             $this->{name} =~ /$re/ ||
5565 6         17 $this->{email} =~ /$re/ ||
5566             $this->{city} =~ /$re/ )
5567             {
5568             push( @$matches, $this );
5569             }
5570             }
5571 13         39 }
  13         235  
5572             else
5573 390 50 33     1673 {
5574 390         412 foreach my $user ( sort( keys( %{$data->{users}} ) ) )
  390         1390  
5575             {
5576 1274         2064 next unless( exists( $data->{users}->{ $user }->{modules} ) && ref( $data->{users}->{ $user }->{modules} ) eq 'HASH' );
5577 1274 50 66     20929 foreach my $package ( sort( keys( %{$data->{users}->{ $user }->{modules}} ) ) )
    100 100        
      66        
      66        
      33        
      33        
      66        
      33        
5578             {
5579 0 0       0 my $this = $data->{users}->{ $user }->{modules}->{ $package };
5580             if( defined( $prop ) )
5581 0         0 {
5582             if( $this->{ $prop } =~ /$re/ )
5583             {
5584             push( @$matches, $this );
5585             }
5586             }
5587             elsif( $this->{abstract} =~ /$re/ ||
5588             $this->{author} =~ /$re/ ||
5589             $this->{distribution} =~ /$re/ ||
5590 1257         7590 $this->{id} =~ /$re/ ||
5591             $this->{name} =~ /$re/ ||
5592 19         54 $this->{package} =~ /$re/ ||
5593             ( exists( $this->{provides} ) && ref( $this->{provides} ) eq 'ARRAY' && join( ' ', @{$this->{provides}} ) =~ /$re/ ) )
5594             {
5595             push( @$matches, $this );
5596             }
5597 19         110 }
5598             }
5599             }
5600 47         171 $total = scalar( @$matches );
5601             }
5602 305         371
5603 305         436 for( my $i = $from; $i < scalar( @$matches ); $i++ )
5604 305         534 {
5605 305 100       735 my $info = $matches->[$i];
5606             my $ref = $cb->( $info );
5607 47         404 push( @$hits, $ref );
5608             last if( scalar( @$hits ) == $size );
5609             }
5610             my $res =
5611             {
5612             _shards =>
5613             {
5614             failed => 0,
5615             successful => 3,
5616             total => 3,
5617             },
5618             hits =>
5619             {
5620             hits => $hits,
5621             max_score => 1,
5622             total => $total,
5623             },
5624             timed_out => \0,
5625 47 100       175 took => 4,
5626             };
5627 14         44
5628             if( $opts->{scroll} )
5629             {
5630 47         167 $res->{_scroll_id} = 'cXVlcnlUaGVuRmV0Y2g7Mzs0MDE0MzQ1MTQ6N2NvRzNSdklTYkdiRmNPNi04VXFjQTs2NzEwNTc1NTE6OWtIOUE2b2xUaHk3cU5iWkl6ajZrUTsxMDcyNDY5OTMxOk1lZVhCR1J4VG1tT0QxWjRFd2J0Z2c7MDs=';
5631 47         10345 }
5632            
5633             my $payload = $self->json->utf8->encode( $res );
5634             my $resp = HTTP::Promise::Response->new( 200, HTTP::Promise::Status->status_message( 200 => $lang ), [
5635             @STANDARD_HEADERS,
5636             Content_Type => 'application/json',
5637             Content_Length => length( $payload ),
5638 47         63554 Date => $self->_date_now,
5639             ], $payload,
5640             );
5641             return( $resp );
5642             }
5643 0     0      
5644             sub DESTROY
5645 0           {
5646 0 0         my $self = shift( @_ );
5647             eval
5648 0 0         {
5649             if( $self->pid )
5650             {
5651             $self->stop || die( $self->error );
5652             }
5653             };
5654             }
5655              
5656             # Make Test::Pod happy
5657             =encoding utf-8
5658              
5659             =cut
5660              
5661             # NOTE: DATA
5662             # The data below are anonymous data using completely fake names, and e-mail addresses,
5663             # but real module names with fictitious version number
5664             $DATA = <<'EOT';
5665             {
5666             alias => {
5667             PostAuthorMapping => "GetAuthorMapping",
5668             PostContributorMapping => "GetContributorMapping",
5669             PostCVE => "GetCVE",
5670             PostCVEByAuthorRelease => "GetCVEByAuthorRelease",
5671             PostCVEByCpanID => "GetCVEByCpanID",
5672             PostCVEByDistribution => "GetCVEByDistribution",
5673             PostDistributionMapping => "GetDistributionMapping",
5674             PostFavoriteMapping => "GetFavoriteMapping",
5675             PostFileMapping => "GetFileMapping",
5676             PostModuleMapping => "GetModuleMapping",
5677             PostRatingMapping => "GetRatingMapping",
5678             PostReleaseMapping => "GetReleaseMapping",
5679             },
5680             GetAuthorMapping => {
5681             cpan_v1_01 => {
5682             mappings => {
5683             author => {
5684             dynamic => \0,
5685             properties => {
5686             asciiname => {
5687             fields => {
5688             analyzed => {
5689             analyzer => "standard",
5690             fielddata => { format => "disabled" },
5691             store => 1,
5692             type => "string",
5693             },
5694             },
5695             ignore_above => 2048,
5696             index => "not_analyzed",
5697             type => "string",
5698             },
5699             blog => {
5700             dynamic => \1,
5701             properties => {
5702             feed => { ignore_above => 2048, index => "not_analyzed", type => "string" },
5703             url => { ignore_above => 2048, index => "not_analyzed", type => "string" },
5704             },
5705             },
5706             city => { ignore_above => 2048, index => "not_analyzed", type => "string" },
5707             country => { ignore_above => 2048, index => "not_analyzed", type => "string" },
5708             donation => {
5709             dynamic => \1,
5710             properties => {
5711             id => { ignore_above => 2048, index => "not_analyzed", type => "string" },
5712             name => { ignore_above => 2048, index => "not_analyzed", type => "string" },
5713             },
5714             },
5715             email => { ignore_above => 2048, index => "not_analyzed", type => "string" },
5716             gravatar_url => { ignore_above => 2048, index => "not_analyzed", type => "string" },
5717             is_pause_custodial_account => { type => "boolean" },
5718             location => { type => "geo_point" },
5719             name => {
5720             fields => {
5721             analyzed => {
5722             analyzer => "standard",
5723             fielddata => { format => "disabled" },
5724             store => 1,
5725             type => "string",
5726             },
5727             },
5728             ignore_above => 2048,
5729             index => "not_analyzed",
5730             type => "string",
5731             },
5732             pauseid => { ignore_above => 2048, index => "not_analyzed", type => "string" },
5733             perlmongers => {
5734             dynamic => \1,
5735             properties => {
5736             name => { ignore_above => 2048, index => "not_analyzed", type => "string" },
5737             url => { ignore_above => 2048, index => "not_analyzed", type => "string" },
5738             },
5739             },
5740             profile => {
5741             dynamic => \0,
5742             include_in_root => 1,
5743             properties => {
5744             id => {
5745             fields => {
5746             analyzed => {
5747             analyzer => "simple",
5748             fielddata => { format => "disabled" },
5749             store => 1,
5750             type => "string",
5751             },
5752             },
5753             ignore_above => 2048,
5754             index => "not_analyzed",
5755             type => "string",
5756             },
5757             name => { ignore_above => 2048, index => "not_analyzed", type => "string" },
5758             },
5759             type => "nested",
5760             },
5761             region => { ignore_above => 2048, index => "not_analyzed", type => "string" },
5762             updated => { format => "strict_date_optional_time||epoch_millis", type => "date" },
5763             user => { ignore_above => 2048, index => "not_analyzed", type => "string" },
5764             website => { ignore_above => 2048, index => "not_analyzed", type => "string" },
5765             },
5766             },
5767             },
5768             },
5769             },
5770             GetContributorMapping => {
5771             cpan_v1_01 => {
5772             mappings => {
5773             contributor => {
5774             dynamic => "false",
5775             properties => {
5776             distribution => { ignore_above => 2048, index => "not_analyzed", type => "string" },
5777             pauseid => { ignore_above => 2048, index => "not_analyzed", type => "string" },
5778             release_author => { ignore_above => 2048, index => "not_analyzed", type => "string" },
5779             release_name => { ignore_above => 2048, index => "not_analyzed", type => "string" },
5780             },
5781             },
5782             },
5783             },
5784             },
5785             GetCVE => {
5786             _shards => { failed => 0, successful => 3, total => 3 },
5787             hits => { hits => [], max_score => undef, total => 0 },
5788             timed_out => 0,
5789             took => 2,
5790             },
5791             GetCVEByAuthorRelease => { cve => [] },
5792             GetCVEByCpanID => { cve => [] },
5793             GetCVEByDistribution => { cve => [] },
5794             GetDistributionMapping => {
5795             cpan_v1_01 => {
5796             mappings => {
5797             distribution => {
5798             dynamic => \0,
5799             properties => {
5800             bugs => {
5801             dynamic => \1,
5802             properties => {
5803             github => {
5804             dynamic => \1,
5805             properties => {
5806             active => { type => "integer" },
5807             closed => { type => "integer" },
5808             open => { type => "integer" },
5809             source => { ignore_above => 2048, index => "not_analyzed", type => "string" },
5810             },
5811             },
5812             rt => {
5813             dynamic => \1,
5814             properties => {
5815             "<html>" => { type => "double" },
5816             active => { type => "integer" },
5817             closed => { type => "integer" },
5818             new => { type => "integer" },
5819             open => { type => "integer" },
5820             patched => { type => "integer" },
5821             rejected => { type => "integer" },
5822             resolved => { type => "integer" },
5823             source => { ignore_above => 2048, index => "not_analyzed", type => "string" },
5824             stalled => { type => "integer" },
5825             },
5826             },
5827             },
5828             },
5829             external_package => {
5830             dynamic => \1,
5831             properties => {
5832             cygwin => { ignore_above => 2048, index => "not_analyzed", type => "string" },
5833             debian => { ignore_above => 2048, index => "not_analyzed", type => "string" },
5834             fedora => { ignore_above => 2048, index => "not_analyzed", type => "string" },
5835             },
5836             },
5837             name => { ignore_above => 2048, index => "not_analyzed", type => "string" },
5838             river => {
5839             dynamic => \1,
5840             properties => {
5841             bucket => { type => "integer" },
5842             bus_factor => { type => "integer" },
5843             immediate => { type => "integer" },
5844             total => { type => "integer" },
5845             },
5846             },
5847             },
5848             },
5849             },
5850             },
5851             },
5852             GetFavoriteMapping => {
5853             cpan_v1_01 => {
5854             mappings => {
5855             favorite => {
5856             dynamic => \0,
5857             properties => {
5858             author => { ignore_above => 2048, index => "not_analyzed", type => "string" },
5859             date => { format => "strict_date_optional_time||epoch_millis", type => "date" },
5860             distribution => { ignore_above => 2048, index => "not_analyzed", type => "string" },
5861             id => { ignore_above => 2048, index => "not_analyzed", type => "string" },
5862             release => { ignore_above => 2048, index => "not_analyzed", type => "string" },
5863             user => { ignore_above => 2048, index => "not_analyzed", type => "string" },
5864             },
5865             },
5866             },
5867             },
5868             },
5869             GetFileMapping => {
5870             cpan_v1_01 => {
5871             mappings => {
5872             file => {
5873             dynamic => \0,
5874             properties => {
5875             abstract => {
5876             fields => {
5877             analyzed => {
5878             analyzer => "standard",
5879             fielddata => { format => "disabled" },
5880             store => 1,
5881             type => "string",
5882             },
5883             },
5884             ignore_above => 2048,
5885             index => "not_analyzed",
5886             type => "string",
5887             },
5888             author => { ignore_above => 2048, index => "not_analyzed", type => "string" },
5889             authorized => { type => "boolean" },
5890             binary => { type => "boolean" },
5891             date => { format => "strict_date_optional_time||epoch_millis", type => "date" },
5892             deprecated => { type => "boolean" },
5893             description => { ignore_above => 2048, index => "not_analyzed", type => "string" },
5894             dir => { ignore_above => 2048, index => "not_analyzed", type => "string" },
5895             directory => { type => "boolean" },
5896             dist_fav_count => { type => "integer" },
5897             distribution => {
5898             fields => {
5899             analyzed => {
5900             analyzer => "standard",
5901             fielddata => { format => "disabled" },
5902             store => 1,
5903             type => "string",
5904             },
5905             camelcase => { analyzer => "camelcase", store => 1, type => "string" },
5906             lowercase => { analyzer => "lowercase", store => 1, type => "string" },
5907             },
5908             ignore_above => 2048,
5909             index => "not_analyzed",
5910             type => "string",
5911             },
5912             documentation => {
5913             fields => {
5914             analyzed => {
5915             analyzer => "standard",
5916             fielddata => { format => "disabled" },
5917             store => 1,
5918             type => "string",
5919             },
5920             camelcase => { analyzer => "camelcase", store => 1, type => "string" },
5921             edge => { analyzer => "edge", store => 1, type => "string" },
5922             edge_camelcase => { analyzer => "edge_camelcase", store => 1, type => "string" },
5923             lowercase => { analyzer => "lowercase", store => 1, type => "string" },
5924             },
5925             ignore_above => 2048,
5926             index => "not_analyzed",
5927             type => "string",
5928             },
5929             download_url => { ignore_above => 2048, index => "not_analyzed", type => "string" },
5930             id => { ignore_above => 2048, index => "not_analyzed", type => "string" },
5931             indexed => { type => "boolean" },
5932             level => { type => "integer" },
5933             maturity => { ignore_above => 2048, index => "not_analyzed", type => "string" },
5934             mime => { ignore_above => 2048, index => "not_analyzed", type => "string" },
5935             module => {
5936             dynamic => \0,
5937             include_in_root => 1,
5938             properties => {
5939             associated_pod => { type => "string" },
5940             authorized => { type => "boolean" },
5941             indexed => { type => "boolean" },
5942             name => {
5943             fields => {
5944             analyzed => {
5945             analyzer => "standard",
5946             fielddata => { format => "disabled" },
5947             store => 1,
5948             type => "string",
5949             },
5950             camelcase => { analyzer => "camelcase", store => 1, type => "string" },
5951             lowercase => { analyzer => "lowercase", store => 1, type => "string" },
5952             },
5953             ignore_above => 2048,
5954             index => "not_analyzed",
5955             type => "string",
5956             },
5957             version => { ignore_above => 2048, index => "not_analyzed", type => "string" },
5958             version_numified => { type => "float" },
5959             },
5960             type => "nested",
5961             },
5962             name => { ignore_above => 2048, index => "not_analyzed", type => "string" },
5963             path => { ignore_above => 2048, index => "not_analyzed", type => "string" },
5964             pod => {
5965             fields => {
5966             analyzed => {
5967             analyzer => "standard",
5968             fielddata => { format => "disabled" },
5969             term_vector => "with_positions_offsets",
5970             type => "string",
5971             },
5972             },
5973             index => "no",
5974             type => "string",
5975             },
5976             pod_lines => { doc_values => 1, ignore_above => 2048, index => "no", type => "string" },
5977             release => {
5978             fields => {
5979             analyzed => {
5980             analyzer => "standard",
5981             fielddata => { format => "disabled" },
5982             store => 1,
5983             type => "string",
5984             },
5985             camelcase => { analyzer => "camelcase", store => 1, type => "string" },
5986             lowercase => { analyzer => "lowercase", store => 1, type => "string" },
5987             },
5988             ignore_above => 2048,
5989             index => "not_analyzed",
5990             type => "string",
5991             },
5992             sloc => { type => "integer" },
5993             slop => { type => "integer" },
5994             stat => {
5995             dynamic => \1,
5996             properties => {
5997             gid => { type => "long" },
5998             mode => { type => "integer" },
5999             mtime => { type => "integer" },
6000             size => { type => "integer" },
6001             uid => { type => "long" },
6002             },
6003             },
6004             status => { ignore_above => 2048, index => "not_analyzed", type => "string" },
6005             suggest => {
6006             analyzer => "simple",
6007             max_input_length => 50,
6008             payloads => 1,
6009             preserve_position_increments => 1,
6010             preserve_separators => 1,
6011             type => "completion",
6012             },
6013             version => { ignore_above => 2048, index => "not_analyzed", type => "string" },
6014             version_numified => { type => "float" },
6015             },
6016             },
6017             },
6018             },
6019             },
6020             GetModuleMapping => {
6021             cpan_v1_01 => {
6022             mappings => {
6023             file => {
6024             dynamic => \0,
6025             properties => {
6026             abstract => {
6027             fields => {
6028             analyzed => {
6029             analyzer => "standard",
6030             fielddata => { format => "disabled" },
6031             store => 1,
6032             type => "string",
6033             },
6034             },
6035             ignore_above => 2048,
6036             index => "not_analyzed",
6037             type => "string",
6038             },
6039             author => { ignore_above => 2048, index => "not_analyzed", type => "string" },
6040             authorized => { type => "boolean" },
6041             binary => { type => "boolean" },
6042             date => { format => "strict_date_optional_time||epoch_millis", type => "date" },
6043             deprecated => { type => "boolean" },
6044             description => { ignore_above => 2048, index => "not_analyzed", type => "string" },
6045             dir => { ignore_above => 2048, index => "not_analyzed", type => "string" },
6046             directory => { type => "boolean" },
6047             dist_fav_count => { type => "integer" },
6048             distribution => {
6049             fields => {
6050             analyzed => {
6051             analyzer => "standard",
6052             fielddata => { format => "disabled" },
6053             store => 1,
6054             type => "string",
6055             },
6056             camelcase => { analyzer => "camelcase", store => 1, type => "string" },
6057             lowercase => { analyzer => "lowercase", store => 1, type => "string" },
6058             },
6059             ignore_above => 2048,
6060             index => "not_analyzed",
6061             type => "string",
6062             },
6063             documentation => {
6064             fields => {
6065             analyzed => {
6066             analyzer => "standard",
6067             fielddata => { format => "disabled" },
6068             store => 1,
6069             type => "string",
6070             },
6071             camelcase => { analyzer => "camelcase", store => 1, type => "string" },
6072             edge => { analyzer => "edge", store => 1, type => "string" },
6073             edge_camelcase => { analyzer => "edge_camelcase", store => 1, type => "string" },
6074             lowercase => { analyzer => "lowercase", store => 1, type => "string" },
6075             },
6076             ignore_above => 2048,
6077             index => "not_analyzed",
6078             type => "string",
6079             },
6080             download_url => { ignore_above => 2048, index => "not_analyzed", type => "string" },
6081             id => { ignore_above => 2048, index => "not_analyzed", type => "string" },
6082             indexed => { type => "boolean" },
6083             level => { type => "integer" },
6084             maturity => { ignore_above => 2048, index => "not_analyzed", type => "string" },
6085             mime => { ignore_above => 2048, index => "not_analyzed", type => "string" },
6086             module => {
6087             dynamic => \0,
6088             include_in_root => 1,
6089             properties => {
6090             associated_pod => { type => "string" },
6091             authorized => { type => "boolean" },
6092             indexed => { type => "boolean" },
6093             name => {
6094             fields => {
6095             analyzed => {
6096             analyzer => "standard",
6097             fielddata => { format => "disabled" },
6098             store => 1,
6099             type => "string",
6100             },
6101             camelcase => { analyzer => "camelcase", store => 1, type => "string" },
6102             lowercase => { analyzer => "lowercase", store => 1, type => "string" },
6103             },
6104             ignore_above => 2048,
6105             index => "not_analyzed",
6106             type => "string",
6107             },
6108             version => { ignore_above => 2048, index => "not_analyzed", type => "string" },
6109             version_numified => { type => "float" },
6110             },
6111             type => "nested",
6112             },
6113             name => { ignore_above => 2048, index => "not_analyzed", type => "string" },
6114             path => { ignore_above => 2048, index => "not_analyzed", type => "string" },
6115             pod => {
6116             fields => {
6117             analyzed => {
6118             analyzer => "standard",
6119             fielddata => { format => "disabled" },
6120             term_vector => "with_positions_offsets",
6121             type => "string",
6122             },
6123             },
6124             index => "no",
6125             type => "string",
6126             },
6127             pod_lines => { doc_values => 1, ignore_above => 2048, index => "no", type => "string" },
6128             release => {
6129             fields => {
6130             analyzed => {
6131             analyzer => "standard",
6132             fielddata => { format => "disabled" },
6133             store => 1,
6134             type => "string",
6135             },
6136             camelcase => { analyzer => "camelcase", store => 1, type => "string" },
6137             lowercase => { analyzer => "lowercase", store => 1, type => "string" },
6138             },
6139             ignore_above => 2048,
6140             index => "not_analyzed",
6141             type => "string",
6142             },
6143             sloc => { type => "integer" },
6144             slop => { type => "integer" },
6145             stat => {
6146             dynamic => \1,
6147             properties => {
6148             gid => { type => "long" },
6149             mode => { type => "integer" },
6150             mtime => { type => "integer" },
6151             size => { type => "integer" },
6152             uid => { type => "long" },
6153             },
6154             },
6155             status => { ignore_above => 2048, index => "not_analyzed", type => "string" },
6156             suggest => {
6157             analyzer => "simple",
6158             max_input_length => 50,
6159             payloads => 1,
6160             preserve_position_increments => 1,
6161             preserve_separators => 1,
6162             type => "completion",
6163             },
6164             version => { ignore_above => 2048, index => "not_analyzed", type => "string" },
6165             version_numified => { type => "float" },
6166             },
6167             },
6168             },
6169             },
6170             },
6171             GetRatingMapping => {
6172             cpan_v1_01 => {
6173             mappings => {
6174             rating => {
6175             dynamic => \0,
6176             properties => {
6177             author => { ignore_above => 2048, index => "not_analyzed", type => "string" },
6178             date => { format => "strict_date_optional_time||epoch_millis", type => "date" },
6179             details => {
6180             dynamic => \0,
6181             properties => {
6182             documentation => { ignore_above => 2048, index => "not_analyzed", type => "string" },
6183             },
6184             },
6185             distribution => { ignore_above => 2048, index => "not_analyzed", type => "string" },
6186             helpful => {
6187             dynamic => \0,
6188             properties => {
6189             user => { ignore_above => 2048, index => "not_analyzed", type => "string" },
6190             value => { type => "boolean" },
6191             },
6192             },
6193             rating => { type => "float" },
6194             release => { ignore_above => 2048, index => "not_analyzed", type => "string" },
6195             user => { ignore_above => 2048, index => "not_analyzed", type => "string" },
6196             },
6197             },
6198             },
6199             },
6200             },
6201             GetReleaseMapping => {
6202             cpan_v1_01 => {
6203             mappings => {
6204             release => {
6205             dynamic => \0,
6206             properties => {
6207             abstract => {
6208             fields => {
6209             analyzed => {
6210             analyzer => "standard",
6211             fielddata => { format => "disabled" },
6212             store => 1,
6213             type => "string",
6214             },
6215             },
6216             ignore_above => 2048,
6217             index => "not_analyzed",
6218             type => "string",
6219             },
6220             archive => { ignore_above => 2048, index => "not_analyzed", type => "string" },
6221             author => { ignore_above => 2048, index => "not_analyzed", type => "string" },
6222             authorized => { type => "boolean" },
6223             changes_file => { ignore_above => 2048, index => "not_analyzed", type => "string" },
6224             checksum_md5 => { ignore_above => 2048, index => "not_analyzed", type => "string" },
6225             checksum_sha256 => { ignore_above => 2048, index => "not_analyzed", type => "string" },
6226             date => { format => "strict_date_optional_time||epoch_millis", type => "date" },
6227             dependency => {
6228             dynamic => \0,
6229             include_in_root => 1,
6230             properties => {
6231             module => { ignore_above => 2048, index => "not_analyzed", type => "string" },
6232             phase => { ignore_above => 2048, index => "not_analyzed", type => "string" },
6233             relationship => { ignore_above => 2048, index => "not_analyzed", type => "string" },
6234             version => { ignore_above => 2048, index => "not_analyzed", type => "string" },
6235             },
6236             type => "nested",
6237             },
6238             deprecated => { type => "boolean" },
6239             distribution => {
6240             fields => {
6241             analyzed => {
6242             analyzer => "standard",
6243             fielddata => { format => "disabled" },
6244             store => 1,
6245             type => "string",
6246             },
6247             camelcase => { analyzer => "camelcase", store => 1, type => "string" },
6248             lowercase => { analyzer => "lowercase", store => 1, type => "string" },
6249             },
6250             ignore_above => 2048,
6251             index => "not_analyzed",
6252             type => "string",
6253             },
6254             download_url => { ignore_above => 2048, index => "not_analyzed", type => "string" },
6255             first => { type => "boolean" },
6256             id => { ignore_above => 2048, index => "not_analyzed", type => "string" },
6257             license => { ignore_above => 2048, index => "not_analyzed", type => "string" },
6258             main_module => { ignore_above => 2048, index => "not_analyzed", type => "string" },
6259             maturity => { ignore_above => 2048, index => "not_analyzed", type => "string" },
6260             name => {
6261             fields => {
6262             analyzed => {
6263             analyzer => "standard",
6264             fielddata => { format => "disabled" },
6265             store => 1,
6266             type => "string",
6267             },
6268             camelcase => { analyzer => "camelcase", store => 1, type => "string" },
6269             lowercase => { analyzer => "lowercase", store => 1, type => "string" },
6270             },
6271             ignore_above => 2048,
6272             index => "not_analyzed",
6273             type => "string",
6274             },
6275             provides => { ignore_above => 2048, index => "not_analyzed", type => "string" },
6276             resources => {
6277             dynamic => \1,
6278             include_in_root => 1,
6279             properties => {
6280             bugtracker => {
6281             dynamic => \1,
6282             include_in_root => 1,
6283             properties => {
6284             mailto => { ignore_above => 2048, index => "not_analyzed", type => "string" },
6285             web => { ignore_above => 2048, index => "not_analyzed", type => "string" },
6286             },
6287             type => "nested",
6288             },
6289             homepage => { ignore_above => 2048, index => "not_analyzed", type => "string" },
6290             license => { ignore_above => 2048, index => "not_analyzed", type => "string" },
6291             repository => {
6292             dynamic => \1,
6293             include_in_root => 1,
6294             properties => {
6295             type => { ignore_above => 2048, index => "not_analyzed", type => "string" },
6296             url => { ignore_above => 2048, index => "not_analyzed", type => "string" },
6297             web => { ignore_above => 2048, index => "not_analyzed", type => "string" },
6298             },
6299             type => "nested",
6300             },
6301             },
6302             type => "nested",
6303             },
6304             stat => {
6305             dynamic => \1,
6306             properties => {
6307             gid => { type => "long" },
6308             mode => { type => "integer" },
6309             mtime => { type => "integer" },
6310             size => { type => "integer" },
6311             uid => { type => "long" },
6312             },
6313             },
6314             status => { ignore_above => 2048, index => "not_analyzed", type => "string" },
6315             tests => {
6316             dynamic => \1,
6317             properties => {
6318             fail => { type => "integer" },
6319             na => { type => "integer" },
6320             pass => { type => "integer" },
6321             unknown => { type => "integer" },
6322             },
6323             },
6324             version => { ignore_above => 2048, index => "not_analyzed", type => "string" },
6325             version_numified => { type => "float" },
6326             },
6327             },
6328             },
6329             },
6330             },
6331             users => {
6332             AFONASEIANTONOV => {
6333             asciiname => "Afonasei Antonov",
6334             city => "Moscow",
6335             contributions => [
6336             {
6337             distribution => "Dist-Zilla-Plugin-ProgCriticTests",
6338             pauseid => "AFONASEIANTONOV",
6339             release_author => "RACHELSEGAL",
6340             release_name => "Dist-Zilla-Plugin-ProgCriticTests-v1.48.19",
6341             },
6342             ],
6343             country => "RU",
6344             email => ["afonasei.antonov\@example.ru"],
6345             favorites => [
6346             {
6347             author => "LILLIANSTEWART",
6348             date => "2010-03-06T13:55:15",
6349             distribution => "Task-Dancer",
6350             },
6351             {
6352             author => "ALEXANDRAPOWELL",
6353             date => "2006-09-07T17:59:00",
6354             distribution => "Geo-Postcodes",
6355             },
6356             {
6357             author => "TEDDYSAPUTRA",
6358             date => "2005-10-23T16:25:35",
6359             distribution => "Math-Symbolic-Custom-Pattern",
6360             },
6361             {
6362             author => "RANGSANSUNTHORN",
6363             date => "2002-05-06T12:31:19",
6364             distribution => "Giza",
6365             },
6366             ],
6367             gravatar_url => "https://secure.gravatar.com/avatar/YcD1vpcPaRrCCXfhehNnAkmTeyqgFqUt?s=130&d=identicon",
6368             is_pause_custodial_account => 0,
6369             links => {
6370             backpan_directory => "https://cpan.metacpan.org/authors/id/A/AF/AFONASEIANTONOV",
6371             cpan_directory => "http://cpan.org/authors/id/A/AF/AFONASEIANTONOV",
6372             cpantesters_matrix => "http://matrix.cpantesters.org/?author=AFONASEIANTONOV",
6373             cpantesters_reports => "http://cpantesters.org/author/A/AFONASEIANTONOV.html",
6374             cpants => "http://cpants.cpanauthors.org/author/AFONASEIANTONOV",
6375             metacpan_explorer => "https://explorer.metacpan.org/?url=/author/AFONASEIANTONOV",
6376             repology => "https://repology.org/maintainer/AFONASEIANTONOV%40cpan",
6377             },
6378             modules => {
6379             "Apache::XPointer" => {
6380             abstract => "mod_perl handler to address XML fragments.",
6381             archive => "Apache-XPointer-2.18.tar.gz",
6382             author => "AFONASEIANTONOV",
6383             authorized => 1,
6384             changes_file => "Changes",
6385             checksum_md5 => "b0da0635221cf4c9f8cd398774d50012",
6386             checksum_sha256 => "15874f970468e44a461432878237a67e6547dde43155dfb3c9a6e24911f88bc4",
6387             contributors => [qw( HELEWISEGIROUX BUDAEJUNG DOHYUNNCHOI )],
6388             date => "2004-11-13T23:40:57",
6389             dependency => [
6390             {
6391             module => "perl",
6392             phase => "runtime",
6393             relationship => "requires",
6394             version => "v5.6.0",
6395             },
6396             {
6397             module => "mod_perl",
6398             phase => "runtime",
6399             relationship => "requires",
6400             version => 1.29,
6401             },
6402             {
6403             module => "XML::LibXML",
6404             phase => "runtime",
6405             relationship => "requires",
6406             version => 1.58,
6407             },
6408             {
6409             module => "XML::LibXML::XPathContext",
6410             phase => "runtime",
6411             relationship => "requires",
6412             version => 0.06,
6413             },
6414             {
6415             module => "Test::Simple",
6416             phase => "build",
6417             relationship => "requires",
6418             version => 0.47,
6419             },
6420             ],
6421             deprecated => 0,
6422             distribution => "Apache-XPointer",
6423             download_url => "https://cpan.metacpan.org/authors/id/A/AF/AFONASEIANTONOV/Apache-XPointer-2.18.tar.gz",
6424             first => 1,
6425             id => "3yKx3djv3Bfh96NwXgDHBeD7b_c",
6426             license => ["perl_5"],
6427             likers => [qw( ALEXANDRAPOWELL TAKASHIISHIKAWA )],
6428             likes => 2,
6429             main_module => "Apache::XPointer",
6430             maturity => "released",
6431             metadata => {
6432             abstract => "mod_perl handler to address XML fragments.",
6433             author => ["Aaron Straup Cope E<lt>ascope\@cpan.orgE<gt>"],
6434             dynamic_config => 1,
6435             generated_by => "Module::Build version 0.25_02, CPAN::Meta::Converter version 2.150005",
6436             license => ["perl_5"],
6437             "meta-spec" => {
6438             url => "http://search.cpan.org/perldoc?CPAN::Meta::Spec",
6439             version => 2,
6440             },
6441             name => "Apache-XPointer",
6442             no_index => {
6443             directory => [qw( t xt inc local perl5 fatlib example blib examples eg )],
6444             },
6445             prereqs => {
6446             build => {
6447             requires => { "Test::Simple" => 0.47 },
6448             },
6449             runtime => {
6450             requires => {
6451             mod_perl => 1.29,
6452             perl => "v5.6.0",
6453             "XML::LibXML" => 1.58,
6454             "XML::LibXML::XPathContext" => 0.06,
6455             },
6456             },
6457             },
6458             provides => {
6459             "Apache::XPointer" => { file => "lib/Apache/XPointer.pm", version => "1.0" },
6460             "Apache::XPointer::XPath" => { file => "lib/Apache/XPointer/XPath.pm", version => "1.0" },
6461             },
6462             release_status => "stable",
6463             version => "1.0",
6464             },
6465             name => "Apache-XPointer",
6466             package => "Apache::XPointer",
6467             provides => [qw( Apache::XPointer Apache::XPointer::XPath )],
6468             release => "Apache-XPointer-2.18",
6469             resources => {},
6470             stat => { gid => 1009, mode => 33204, mtime => 1100389257, size => 5414, uid => 1009 },
6471             status => "backpan",
6472             tests => undef,
6473             user => "x2i7nBeZY4kM0BlRn4gnwV",
6474             version => 2.18,
6475             version_numified => "2.180",
6476             },
6477             "Crypt::OpenSSL::CA" => {
6478             abstract => "The crypto parts of an X509v3 Certification Authority",
6479             archive => "Crypt-OpenSSL-CA-1.95.tar.gz",
6480             author => "AFONASEIANTONOV",
6481             authorized => 1,
6482             changes_file => "Changes",
6483             checksum_md5 => "7b95cd2f52d7e218f55fede4ad3042d4",
6484             checksum_sha256 => "f775bf9cc6f9f9ba6b56915692b8d6f3b4d2746dac166f76561238decb0d61fa",
6485             contributors => ["ENGYONGCHANG"],
6486             date => "2010-08-27T18:07:51",
6487             dependency => [
6488             {
6489             module => "Module::Build",
6490             phase => "configure",
6491             relationship => "requires",
6492             version => 0.36,
6493             },
6494             {
6495             module => "Convert::ASN1",
6496             phase => "build",
6497             relationship => "requires",
6498             version => 0.2,
6499             },
6500             {
6501             module => "FindBin",
6502             phase => "build",
6503             relationship => "requires",
6504             version => 0,
6505             },
6506             {
6507             module => "IO::File",
6508             phase => "build",
6509             relationship => "requires",
6510             version => 0,
6511             },
6512             {
6513             module => "Test::More",
6514             phase => "build",
6515             relationship => "requires",
6516             version => 0,
6517             },
6518             {
6519             module => "Inline::C",
6520             phase => "build",
6521             relationship => "requires",
6522             version => 0,
6523             },
6524             {
6525             module => "POSIX",
6526             phase => "build",
6527             relationship => "requires",
6528             version => 0,
6529             },
6530             {
6531             module => "MIME::Base64",
6532             phase => "build",
6533             relationship => "requires",
6534             version => 0,
6535             },
6536             {
6537             module => "Module::Build::Compat",
6538             phase => "build",
6539             relationship => "requires",
6540             version => 0,
6541             },
6542             {
6543             module => "Net::SSLeay",
6544             phase => "build",
6545             relationship => "requires",
6546             version => 1.25,
6547             },
6548             {
6549             module => "File::Slurp",
6550             phase => "build",
6551             relationship => "requires",
6552             version => 0,
6553             },
6554             {
6555             module => "Devel::Mallinfo",
6556             phase => "build",
6557             relationship => "requires",
6558             version => 0,
6559             },
6560             {
6561             module => "Module::Build",
6562             phase => "build",
6563             relationship => "requires",
6564             version => 0,
6565             },
6566             {
6567             module => "IPC::Run",
6568             phase => "build",
6569             relationship => "requires",
6570             version => 0,
6571             },
6572             {
6573             module => "Devel::Leak",
6574             phase => "build",
6575             relationship => "requires",
6576             version => 0,
6577             },
6578             {
6579             module => "Fatal",
6580             phase => "build",
6581             relationship => "requires",
6582             version => 0,
6583             },
6584             {
6585             module => "Test::Group",
6586             phase => "build",
6587             relationship => "requires",
6588             version => 0,
6589             },
6590             {
6591             module => "File::Temp",
6592             phase => "build",
6593             relationship => "requires",
6594             version => 0,
6595             },
6596             {
6597             module => "Test::Builder",
6598             phase => "build",
6599             relationship => "requires",
6600             version => 0,
6601             },
6602             {
6603             module => "File::Spec::Unix",
6604             phase => "build",
6605             relationship => "requires",
6606             version => 0,
6607             },
6608             {
6609             module => "File::Find",
6610             phase => "build",
6611             relationship => "requires",
6612             version => 0,
6613             },
6614             {
6615             module => "File::Path",
6616             phase => "build",
6617             relationship => "requires",
6618             version => 0,
6619             },
6620             {
6621             module => "File::Spec",
6622             phase => "build",
6623             relationship => "requires",
6624             version => 0,
6625             },
6626             {
6627             module => "Inline",
6628             phase => "build",
6629             relationship => "requires",
6630             version => 0.4,
6631             },
6632             {
6633             module => "File::Spec::Functions",
6634             phase => "build",
6635             relationship => "requires",
6636             version => 0,
6637             },
6638             {
6639             module => "XSLoader",
6640             phase => "runtime",
6641             relationship => "requires",
6642             version => 0,
6643             },
6644             ],
6645             deprecated => 0,
6646             distribution => "Crypt-OpenSSL-CA",
6647             download_url => "https://cpan.metacpan.org/authors/id/A/AF/AFONASEIANTONOV/Crypt-OpenSSL-CA-1.95.tar.gz",
6648             first => 0,
6649             id => "ZPGq3kgIFKLCcyCzky1AILW2UQk",
6650             license => ["perl_5"],
6651             likers => ["RANGSANSUNTHORN"],
6652             likes => 1,
6653             main_module => "Crypt::OpenSSL::CA",
6654             maturity => "released",
6655             metadata => {
6656             abstract => "The crypto parts of an X509v3 Certification Authority",
6657             author => ["Dominique Quatravaux <domq\@cpan.org>"],
6658             dynamic_config => 1,
6659             generated_by => "Module::Build version 0.3603, CPAN::Meta::Converter version 2.150005",
6660             license => ["perl_5"],
6661             "meta-spec" => {
6662             url => "http://search.cpan.org/perldoc?CPAN::Meta::Spec",
6663             version => 2,
6664             },
6665             name => "Crypt-OpenSSL-CA",
6666             no_index => {
6667             directory => [qw(
6668             examples inc t lib/Crypt/OpenSSL/CA/Inline t xt inc
6669             local perl5 fatlib example blib examples eg
6670             )],
6671             namespace => ["Crypt::OpenSSL::CA::Inline"],
6672             },
6673             prereqs => {
6674             build => {
6675             requires => {
6676             "Convert::ASN1" => 0.2,
6677             "Devel::Leak" => 0,
6678             "Devel::Mallinfo" => 0,
6679             Fatal => 0,
6680             "File::Find" => 0,
6681             "File::Path" => 0,
6682             "File::Slurp" => 0,
6683             "File::Spec" => 0,
6684             "File::Spec::Functions" => 0,
6685             "File::Spec::Unix" => 0,
6686             "File::Temp" => 0,
6687             FindBin => 0,
6688             Inline => 0.4,
6689             "Inline::C" => 0,
6690             "IO::File" => 0,
6691             "IPC::Run" => 0,
6692             "MIME::Base64" => 0,
6693             "Module::Build" => 0,
6694             "Module::Build::Compat" => 0,
6695             "Net::SSLeay" => 1.25,
6696             POSIX => 0,
6697             "Test::Builder" => 0,
6698             "Test::Group" => 0,
6699             "Test::More" => 0,
6700             },
6701             },
6702             configure => {
6703             requires => { "Module::Build" => 0.36 },
6704             },
6705             runtime => {
6706             requires => { XSLoader => 0 },
6707             },
6708             },
6709             provides => {
6710             "Crypt::OpenSSL::CA" => { file => "lib/Crypt/OpenSSL/CA.pm", version => "0.20" },
6711             "Crypt::OpenSSL::CA::CONF" => { file => "lib/Crypt/OpenSSL/CA.pm" },
6712             "Crypt::OpenSSL::CA::ENGINE" => { file => "lib/Crypt/OpenSSL/CA.pm" },
6713             "Crypt::OpenSSL::CA::Error" => { file => "lib/Crypt/OpenSSL/CA.pm" },
6714             "Crypt::OpenSSL::CA::PrivateKey" => { file => "lib/Crypt/OpenSSL/CA.pm" },
6715             "Crypt::OpenSSL::CA::PublicKey" => { file => "lib/Crypt/OpenSSL/CA.pm" },
6716             "Crypt::OpenSSL::CA::X509" => { file => "lib/Crypt/OpenSSL/CA.pm" },
6717             "Crypt::OpenSSL::CA::X509_CRL" => { file => "lib/Crypt/OpenSSL/CA.pm" },
6718             "Crypt::OpenSSL::CA::X509_NAME" => { file => "lib/Crypt/OpenSSL/CA.pm" },
6719             "Crypt::OpenSSL::CA::X509V3_EXT" => { file => "lib/Crypt/OpenSSL/CA.pm" },
6720             },
6721             release_status => "stable",
6722             resources => { license => ["http://dev.perl.org/licenses/"] },
6723             version => "0.20",
6724             },
6725             name => "Crypt-OpenSSL-CA",
6726             package => "Crypt::OpenSSL::CA",
6727             provides => [qw(
6728             Crypt::OpenSSL::CA Crypt::OpenSSL::CA::CONF
6729             Crypt::OpenSSL::CA::ENGINE Crypt::OpenSSL::CA::Error
6730             Crypt::OpenSSL::CA::PrivateKey
6731             Crypt::OpenSSL::CA::PublicKey Crypt::OpenSSL::CA::X509
6732             Crypt::OpenSSL::CA::X509V3_EXT
6733             Crypt::OpenSSL::CA::X509_CRL
6734             Crypt::OpenSSL::CA::X509_NAME
6735             )],
6736             release => "Crypt-OpenSSL-CA-1.95",
6737             resources => { license => ["http://dev.perl.org/licenses/"] },
6738             stat => { gid => 1009, mode => 33204, mtime => 1282932471, size => 140587, uid => 1009 },
6739             status => "backpan",
6740             tests => { fail => 4, na => 1, pass => 43, unknown => 0 },
6741             user => "x2i7nBeZY4kM0BlRn4gnwV",
6742             version => 1.95,
6743             version_numified => "1.950",
6744             },
6745             "FileHandle::Rollback" => {
6746             abstract => "FileHandle with commit, rollback, and journaled crash recovery",
6747             archive => "FileHandle-Rollback-v0.88.10.tar.gz",
6748             author => "AFONASEIANTONOV",
6749             authorized => 1,
6750             changes_file => "Changes",
6751             checksum_md5 => "68632720c04ff224218883327adc703e",
6752             checksum_sha256 => "c79ee1342e20b03c96597a80303f7f2d47d7ba1deee578873f05f8cae63c6952",
6753             contributors => [qw( FLORABARRETT ENGYONGCHANG )],
6754             date => "2003-07-15T07:20:16",
6755             dependency => [],
6756             deprecated => 0,
6757             distribution => "FileHandle-Rollback",
6758             download_url => "https://cpan.metacpan.org/authors/id/A/AF/AFONASEIANTONOV/FileHandle-Rollback-v0.88.10.tar.gz",
6759             first => 0,
6760             id => "3UPI46zJ5EwKd91k6UrSWoV9Hw0",
6761             license => ["unknown"],
6762             likers => [qw( ALEXANDRAPOWELL SIEUNJANG )],
6763             likes => 2,
6764             main_module => "FileHandle::Rollback",
6765             maturity => "released",
6766             metadata => {
6767             abstract => "unknown",
6768             author => ["unknown"],
6769             dynamic_config => 1,
6770             generated_by => "CPAN::Meta::Converter version 2.150005",
6771             license => ["unknown"],
6772             "meta-spec" => {
6773             url => "http://search.cpan.org/perldoc?CPAN::Meta::Spec",
6774             version => 2,
6775             },
6776             name => "FileHandle-Rollback",
6777             no_index => {
6778             directory => [qw( t xt inc local perl5 fatlib example blib examples eg )],
6779             },
6780             prereqs => {},
6781             release_status => "stable",
6782             version => 1.05,
6783             },
6784             name => "FileHandle-Rollback",
6785             package => "FileHandle::Rollback",
6786             provides => [qw( FileHandle::Rollback FileHandle::Rollback::Tie )],
6787             release => "FileHandle-Rollback-v0.88.10",
6788             resources => {},
6789             stat => { gid => 1009, mode => 33204, mtime => 1058253616, size => 7423, uid => 1009 },
6790             status => "backpan",
6791             tests => { fail => 0, na => 0, pass => 5, unknown => 0 },
6792             user => "x2i7nBeZY4kM0BlRn4gnwV",
6793             version => "v0.88.10",
6794             version_numified => "0.088010",
6795             },
6796             "Net::FullAuto" => {
6797             abstract => "Perl Based Secure Distributed Computing Network Process",
6798             archive => "Net-FullAuto-v1.50.2.tar.gz",
6799             author => "AFONASEIANTONOV",
6800             authorized => 1,
6801             changes_file => "Changes",
6802             checksum_md5 => "49236a7f12591fec39a45a52df7d0aeb",
6803             checksum_sha256 => "6a72dd173cfaf511f48433a43159a12ea6564ba7dd7133fbfd3c067b8ab63400",
6804             contributors => [qw( ANTHONYGOYETTE DUANLIN )],
6805             date => "2010-07-29T21:19:56",
6806             dependency => [
6807             {
6808             module => "Crypt::Rijndael",
6809             phase => "runtime",
6810             relationship => "recommends",
6811             version => 0,
6812             },
6813             {
6814             module => "IO::Pty",
6815             phase => "runtime",
6816             relationship => "requires",
6817             version => 0,
6818             },
6819             {
6820             module => "MLDBM",
6821             phase => "runtime",
6822             relationship => "requires",
6823             version => 0,
6824             },
6825             {
6826             module => "LWP",
6827             phase => "runtime",
6828             relationship => "requires",
6829             version => 0,
6830             },
6831             {
6832             module => "Crypt::CBC",
6833             phase => "runtime",
6834             relationship => "requires",
6835             version => 0,
6836             },
6837             {
6838             module => "Mail::Internet",
6839             phase => "runtime",
6840             relationship => "requires",
6841             version => 0,
6842             },
6843             {
6844             module => "Crypt::DES",
6845             phase => "runtime",
6846             relationship => "requires",
6847             version => 0,
6848             },
6849             {
6850             module => "Tie::Cache",
6851             phase => "runtime",
6852             relationship => "requires",
6853             version => 0,
6854             },
6855             {
6856             module => "Getopt::Long",
6857             phase => "runtime",
6858             relationship => "requires",
6859             version => 0,
6860             },
6861             {
6862             module => "MLDBM::Sync",
6863             phase => "runtime",
6864             relationship => "requires",
6865             version => 0,
6866             },
6867             {
6868             module => "MLDBM::Sync::SDBM_File",
6869             phase => "runtime",
6870             relationship => "requires",
6871             version => 0,
6872             },
6873             {
6874             module => "Term::Menus",
6875             phase => "runtime",
6876             relationship => "requires",
6877             version => 1.24,
6878             },
6879             {
6880             module => "Sort::Versions",
6881             phase => "runtime",
6882             relationship => "requires",
6883             version => 0,
6884             },
6885             {
6886             module => "HTTP::Date",
6887             phase => "runtime",
6888             relationship => "requires",
6889             version => 0,
6890             },
6891             {
6892             module => "MemHandle",
6893             phase => "runtime",
6894             relationship => "requires",
6895             version => 0,
6896             },
6897             {
6898             module => "Mail::Sender",
6899             phase => "runtime",
6900             relationship => "requires",
6901             version => 0,
6902             },
6903             {
6904             module => "URI",
6905             phase => "runtime",
6906             relationship => "requires",
6907             version => 0,
6908             },
6909             {
6910             module => "Net::Telnet",
6911             phase => "runtime",
6912             relationship => "requires",
6913             version => 0,
6914             },
6915             ],
6916             deprecated => 0,
6917             distribution => "Net-FullAuto",
6918             download_url => "https://cpan.metacpan.org/authors/id/A/AF/AFONASEIANTONOV/Net-FullAuto-v1.50.2.tar.gz",
6919             first => 0,
6920             id => "KYVzKhXLw03_QLMD7KosypZPyNc",
6921             license => ["open_source"],
6922             likers => [],
6923             likes => 0,
6924             main_module => "Net::FullAuto",
6925             maturity => "released",
6926             metadata => {
6927             abstract => "Perl Based Secure Distributed Computing Network Process",
6928             author => ["Brian M. Kelly <Brian.Kelly\@fullautosoftware.net>"],
6929             dynamic_config => 1,
6930             generated_by => "Module::Build version 0.280802, CPAN::Meta::Converter version 2.150005",
6931             license => ["open_source"],
6932             "meta-spec" => {
6933             url => "http://search.cpan.org/perldoc?CPAN::Meta::Spec",
6934             version => 2,
6935             },
6936             name => "Net-FullAuto",
6937             no_index => {
6938             directory => [qw( t xt inc local perl5 fatlib example blib examples eg )],
6939             },
6940             prereqs => {
6941             runtime => {
6942             recommends => { "Crypt::Rijndael" => 0 },
6943             requires => {
6944             "Crypt::CBC" => 0,
6945             "Crypt::DES" => 0,
6946             "Getopt::Long" => 0,
6947             "HTTP::Date" => 0,
6948             "IO::Pty" => 0,
6949             LWP => 0,
6950             "Mail::Internet" => 0,
6951             "Mail::Sender" => 0,
6952             MemHandle => 0,
6953             MLDBM => 0,
6954             "MLDBM::Sync" => 0,
6955             "MLDBM::Sync::SDBM_File" => 0,
6956             "Net::Telnet" => 0,
6957             "Sort::Versions" => 0,
6958             "Term::Menus" => 1.24,
6959             "Tie::Cache" => 0,
6960             URI => 0,
6961             },
6962             },
6963             },
6964             provides => {
6965             fa_hosts => { file => "lib/Net/FullAuto/fa_hosts.pm", version => 1 },
6966             fa_maps => { file => "lib/Net/FullAuto/fa_maps.pm", version => 1 },
6967             File_Transfer => { file => "lib/Net/FullAuto/FA_lib.pm" },
6968             menu_cfg => { file => "lib/Net/FullAuto/menu_cfg.pm", version => 1 },
6969             "Net::FullAuto" => { file => "lib/Net/FullAuto.pm", version => 0.12 },
6970             "Net::FullAuto::FA_DB" => { file => "lib/Net/FullAuto/FA_lib.pm" },
6971             "Net::FullAuto::FA_lib" => { file => "lib/Net/FullAuto/FA_lib.pm" },
6972             "Net::FullAuto::Getline" => { file => "lib/Net/FullAuto/FA_lib.pm" },
6973             "Net::FullAuto::MemoryHandle" => { file => "lib/Net/FullAuto/FA_lib.pm" },
6974             Rem_Command => { file => "lib/Net/FullAuto/FA_lib.pm" },
6975             usr_code => { file => "lib/Net/FullAuto/usr_code.pm", version => 1 },
6976             },
6977             release_status => "stable",
6978             resources => { license => ["http://opensource.org/licenses/gpl-license.php"] },
6979             version => 0.12,
6980             },
6981             name => "Net-FullAuto",
6982             package => "Net::FullAuto",
6983             provides => [qw(
6984             File_Transfer Net::FullAuto Net::FullAuto::FA_DB
6985             Net::FullAuto::FA_lib Net::FullAuto::Getline
6986             Net::FullAuto::MemoryHandle Rem_Command fa_hosts fa_maps
6987             menu_cfg usr_code
6988             )],
6989             release => "Net-FullAuto-v1.50.2",
6990             resources => { license => ["http://opensource.org/licenses/gpl-license.php"] },
6991             stat => { gid => 1009, mode => 33204, mtime => 1280438396, size => 174763, uid => 1009 },
6992             status => "backpan",
6993             tests => { fail => 12, na => 0, pass => 20, unknown => 0 },
6994             user => "x2i7nBeZY4kM0BlRn4gnwV",
6995             version => "v1.50.2",
6996             version_numified => 1.050002,
6997             },
6998             },
6999             name => "Afonasei Antonov",
7000             pauseid => "AFONASEIANTONOV",
7001             profile => [{ id => 846886, name => "stackoverflow" }],
7002             updated => "2023-09-24T15:50:29",
7003             user => "x2i7nBeZY4kM0BlRn4gnwV",
7004             },
7005             ALESSANDROBAUMANN => {
7006             asciiname => "Alessandro Baumann",
7007             city => "Winterthur",
7008             contributions => [
7009             {
7010             distribution => "XML-Atom-SimpleFeed",
7011             pauseid => "ALESSANDROBAUMANN",
7012             release_author => "OLGABOGDANOVA",
7013             release_name => "XML-Atom-SimpleFeed-v0.16.11",
7014             },
7015             {
7016             distribution => "Text-PDF-API",
7017             pauseid => "ALESSANDROBAUMANN",
7018             release_author => "ANTHONYGOYETTE",
7019             release_name => "Text-PDF-API-v1.9.0",
7020             },
7021             {
7022             distribution => "CGI-DataObjectMapper",
7023             pauseid => "ALESSANDROBAUMANN",
7024             release_author => "DOHYUNNCHOI",
7025             release_name => "CGI-DataObjectMapper-0.37",
7026             },
7027             {
7028             distribution => "Math-Symbolic-Custom-Transformation",
7029             pauseid => "ALESSANDROBAUMANN",
7030             release_author => "TAKAONAKANISHI",
7031             release_name => "Math-Symbolic-Custom-Transformation-v1.64.5",
7032             },
7033             {
7034             distribution => "App-Hachero",
7035             pauseid => "ALESSANDROBAUMANN",
7036             release_author => "MARINAHOTZ",
7037             release_name => "App-Hachero-2.49",
7038             },
7039             {
7040             distribution => "PAR-Dist-InstallPPD-GUI",
7041             pauseid => "ALESSANDROBAUMANN",
7042             release_author => "ELAINAREYES",
7043             release_name => "PAR-Dist-InstallPPD-GUI-2.42",
7044             },
7045             {
7046             distribution => "Text-Match-FastAlternatives",
7047             pauseid => "ALESSANDROBAUMANN",
7048             release_author => "OLGABOGDANOVA",
7049             release_name => "Text-Match-FastAlternatives-v1.88.18",
7050             },
7051             {
7052             distribution => "WWW-TinySong",
7053             pauseid => "ALESSANDROBAUMANN",
7054             release_author => "TAKAONAKANISHI",
7055             release_name => "WWW-TinySong-0.24",
7056             },
7057             {
7058             distribution => "Math-Symbolic-Custom-Pattern",
7059             pauseid => "ALESSANDROBAUMANN",
7060             release_author => "TEDDYSAPUTRA",
7061             release_name => "Math-Symbolic-Custom-Pattern-v1.68.6",
7062             },
7063             {
7064             distribution => "Geo-Postcodes-DK",
7065             pauseid => "ALESSANDROBAUMANN",
7066             release_author => "WEEWANG",
7067             release_name => "Geo-Postcodes-DK-2.13",
7068             },
7069             {
7070             distribution => "Text-Match-FastAlternatives",
7071             pauseid => "ALESSANDROBAUMANN",
7072             release_author => "OLGABOGDANOVA",
7073             release_name => "Text-Match-FastAlternatives-v1.88.18",
7074             },
7075             {
7076             distribution => "Validator-Custom-HTMLForm",
7077             pauseid => "ALESSANDROBAUMANN",
7078             release_author => "TAKAONAKANISHI",
7079             release_name => "Validator-Custom-HTMLForm-v0.40.0",
7080             },
7081             ],
7082             country => "CH",
7083             email => ["alessandro.baumann\@example.ch"],
7084             favorites => [
7085             {
7086             author => "ANTHONYGOYETTE",
7087             date => "2005-04-24T02:23:29",
7088             distribution => "Catalyst-Plugin-XMLRPC",
7089             },
7090             {
7091             author => "HEHERSONDEGUZMAN",
7092             date => "2005-12-10T19:27:19",
7093             distribution => "Task-App-Physics-ParticleMotion",
7094             },
7095             {
7096             author => "HEHERSONDEGUZMAN",
7097             date => "2006-06-22T18:12:35",
7098             distribution => "Net-Lite-FTP",
7099             },
7100             ],
7101             gravatar_url => "https://secure.gravatar.com/avatar/TxAmCyDsMKGVjqIIrMkI7x46Fl1E7gxt?s=130&d=identicon",
7102             is_pause_custodial_account => 0,
7103             links => {
7104             backpan_directory => "https://cpan.metacpan.org/authors/id/A/AL/ALESSANDROBAUMANN",
7105             cpan_directory => "http://cpan.org/authors/id/A/AL/ALESSANDROBAUMANN",
7106             cpantesters_matrix => "http://matrix.cpantesters.org/?author=ALESSANDROBAUMANN",
7107             cpantesters_reports => "http://cpantesters.org/author/A/ALESSANDROBAUMANN.html",
7108             cpants => "http://cpants.cpanauthors.org/author/ALESSANDROBAUMANN",
7109             metacpan_explorer => "https://explorer.metacpan.org/?url=/author/ALESSANDROBAUMANN",
7110             repology => "https://repology.org/maintainer/ALESSANDROBAUMANN%40cpan",
7111             },
7112             name => "Alessandro Baumann",
7113             pauseid => "ALESSANDROBAUMANN",
7114             profile => [{ id => 911170, name => "stackoverflow" }],
7115             updated => "2023-09-24T15:50:29",
7116             user => "Zzaufga4vK7mRuJ0bs31aT",
7117             },
7118             ALEXANDRAPOWELL => {
7119             asciiname => "Alexandra Powell",
7120             city => "Gibraltar",
7121             contributions => [
7122             {
7123             distribution => "China-IdentityCard-Validate",
7124             pauseid => "ALEXANDRAPOWELL",
7125             release_author => "CHRISTIANREYES",
7126             release_name => "China-IdentityCard-Validate-v2.71.3",
7127             },
7128             {
7129             distribution => "Text-Match-FastAlternatives",
7130             pauseid => "ALEXANDRAPOWELL",
7131             release_author => "OLGABOGDANOVA",
7132             release_name => "Text-Match-FastAlternatives-v1.88.18",
7133             },
7134             {
7135             distribution => "Devel-SmallProf",
7136             pauseid => "ALEXANDRAPOWELL",
7137             release_author => "RANGSANSUNTHORN",
7138             release_name => "Devel-SmallProf-v2.41.7",
7139             },
7140             {
7141             distribution => "CGI-DataObjectMapper",
7142             pauseid => "ALEXANDRAPOWELL",
7143             release_author => "DOHYUNNCHOI",
7144             release_name => "CGI-DataObjectMapper-0.37",
7145             },
7146             {
7147             distribution => "Compress-Bzip2",
7148             pauseid => "ALEXANDRAPOWELL",
7149             release_author => "DOHYUNNCHOI",
7150             release_name => "Compress-Bzip2-v2.0.11",
7151             },
7152             {
7153             distribution => "math-image",
7154             pauseid => "ALEXANDRAPOWELL",
7155             release_author => "SAMANDERSON",
7156             release_name => "math-image-v2.97.1",
7157             },
7158             {
7159             distribution => "Date-EzDate",
7160             pauseid => "ALEXANDRAPOWELL",
7161             release_author => "FLORABARRETT",
7162             release_name => "Date-EzDate-0.51",
7163             },
7164             {
7165             distribution => "Tie-DB_File-SplitHash",
7166             pauseid => "ALEXANDRAPOWELL",
7167             release_author => "YOICHIFUJITA",
7168             release_name => "Tie-DB_File-SplitHash-v2.4.14",
7169             },
7170             {
7171             distribution => "DBIx-Custom",
7172             pauseid => "ALEXANDRAPOWELL",
7173             release_author => "ELAINAREYES",
7174             release_name => "DBIx-Custom-2.37",
7175             },
7176             {
7177             distribution => "giza",
7178             pauseid => "ALEXANDRAPOWELL",
7179             release_author => "RANGSANSUNTHORN",
7180             release_name => "giza-0.35",
7181             },
7182             {
7183             distribution => "Bundle-Catalyst",
7184             pauseid => "ALEXANDRAPOWELL",
7185             release_author => "ALEXANDRAPOWELL",
7186             release_name => "Bundle-Catalyst-2.58",
7187             },
7188             {
7189             distribution => "XML-Parser",
7190             pauseid => "ALEXANDRAPOWELL",
7191             release_author => "RANGSANSUNTHORN",
7192             release_name => "XML-Parser-2.78",
7193             },
7194             ],
7195             country => "UK",
7196             email => ["alexandra.powell\@example.uk"],
7197             favorites => [
7198             {
7199             author => "WANTAN",
7200             date => "2001-12-14T00:00:58",
7201             distribution => "PDF-API2",
7202             },
7203             {
7204             author => "AFONASEIANTONOV",
7205             date => "2003-07-15T07:20:16",
7206             distribution => "FileHandle-Rollback",
7207             },
7208             {
7209             author => "TAKAONAKANISHI",
7210             date => "2010-09-13T20:17:31",
7211             distribution => "DBIx-Class-Relationship-Predicate",
7212             },
7213             {
7214             author => "AFONASEIANTONOV",
7215             date => "2004-11-13T23:40:57",
7216             distribution => "Apache-XPointer",
7217             },
7218             {
7219             author => "FLORABARRETT",
7220             date => "2010-01-16T14:51:11",
7221             distribution => "Validator-Custom-Ext-Mojolicious",
7222             },
7223             ],
7224             gravatar_url => "https://secure.gravatar.com/avatar/EccugzASltZqv3PjB4YCHCmhVfzEuMPN?s=130&d=identicon",
7225             is_pause_custodial_account => 0,
7226             links => {
7227             backpan_directory => "https://cpan.metacpan.org/authors/id/A/AL/ALEXANDRAPOWELL",
7228             cpan_directory => "http://cpan.org/authors/id/A/AL/ALEXANDRAPOWELL",
7229             cpantesters_matrix => "http://matrix.cpantesters.org/?author=ALEXANDRAPOWELL",
7230             cpantesters_reports => "http://cpantesters.org/author/A/ALEXANDRAPOWELL.html",
7231             cpants => "http://cpants.cpanauthors.org/author/ALEXANDRAPOWELL",
7232             metacpan_explorer => "https://explorer.metacpan.org/?url=/author/ALEXANDRAPOWELL",
7233             repology => "https://repology.org/maintainer/ALEXANDRAPOWELL%40cpan",
7234             },
7235             modules => {
7236             "Bundle::Catalyst" => {
7237             abstract => "All you need to start with Catalyst",
7238             archive => "Bundle-Catalyst-2.58.tar.gz",
7239             author => "ALEXANDRAPOWELL",
7240             authorized => 1,
7241             changes_file => "Changes",
7242             checksum_md5 => "db4995e7cac18df83a9127387ec9785c",
7243             checksum_sha256 => "3efe358deba87359a996bbdcad4bf6cba06b10ed23c5070b90d4da80f1b23eab",
7244             contributors => [qw(
7245             ALEXANDRAPOWELL YOICHIFUJITA TAKAONAKANISHI
7246             TAKAONAKANISHI ELAINAREYES MINSUNGJUNG
7247             )],
7248             date => "2005-11-19T20:19:20",
7249             dependency => [],
7250             deprecated => 0,
7251             distribution => "Bundle-Catalyst",
7252             download_url => "https://cpan.metacpan.org/authors/id/A/AL/ALEXANDRAPOWELL/Bundle-Catalyst-2.58.tar.gz",
7253             first => 0,
7254             id => "vo5KBBiRoL8J6WvIrBWRxxQDDF0",
7255             license => ["unknown"],
7256             likers => [qw( ENGYONGCHANG ELAINAREYES )],
7257             likes => 2,
7258             main_module => "Bundle::Catalyst",
7259             maturity => "released",
7260             metadata => {
7261             abstract => "unknown",
7262             author => ["unknown"],
7263             dynamic_config => 1,
7264             generated_by => "ExtUtils::MakeMaker version 6.30, CPAN::Meta::Converter version 2.150005",
7265             license => ["unknown"],
7266             "meta-spec" => {
7267             url => "http://search.cpan.org/perldoc?CPAN::Meta::Spec",
7268             version => 2,
7269             },
7270             name => "Bundle-Catalyst",
7271             no_index => {
7272             directory => [qw( t xt inc local perl5 fatlib example blib examples eg )],
7273             },
7274             prereqs => {},
7275             release_status => "stable",
7276             version => 0.05,
7277             x_installdirs => "site",
7278             x_version_from => "Catalyst.pm",
7279             },
7280             name => "Bundle-Catalyst",
7281             package => "Bundle::Catalyst",
7282             provides => ["Bundle::Catalyst"],
7283             release => "Bundle-Catalyst-2.58",
7284             resources => {},
7285             stat => { gid => 1009, mode => 33204, mtime => 1132431560, size => 1648, uid => 1009 },
7286             status => "backpan",
7287             tests => undef,
7288             user => "xpCq7x1SitBhMrBdewVWXO",
7289             version => 2.58,
7290             version_numified => "2.580",
7291             },
7292             "Geo::Postcodes" => {
7293             abstract => "Base class for the Geo::Postcodes::XX modules",
7294             archive => "Geo-Postcodes-1.90.tar.gz",
7295             author => "ALEXANDRAPOWELL",
7296             authorized => 1,
7297             changes_file => "Changes",
7298             checksum_md5 => "0423a0f3983554c9b935b71155e5978c",
7299             checksum_sha256 => "1be050687d785217cb8f10fe865edc35225171a870cc3f84a04a7a285df112f0",
7300             date => "2006-09-07T17:59:00",
7301             dependency => [],
7302             deprecated => 0,
7303             distribution => "Geo-Postcodes",
7304             download_url => "https://cpan.metacpan.org/authors/id/A/AL/ALEXANDRAPOWELL/Geo-Postcodes-1.90.tar.gz",
7305             first => 0,
7306             id => "JOuF6NNYRFnVJcEhQUJ4ZEWkoek",
7307             license => ["unknown"],
7308             likers => [qw( AFONASEIANTONOV ANTHONYGOYETTE )],
7309             likes => 2,
7310             main_module => "Geo::Postcodes",
7311             maturity => "released",
7312             metadata => {
7313             abstract => "unknown",
7314             author => ["unknown"],
7315             dynamic_config => 1,
7316             generated_by => "ExtUtils::MakeMaker version 6.30, CPAN::Meta::Converter version 2.150005",
7317             license => ["unknown"],
7318             "meta-spec" => {
7319             url => "http://search.cpan.org/perldoc?CPAN::Meta::Spec",
7320             version => 2,
7321             },
7322             name => "Geo-Postcodes",
7323             no_index => {
7324             directory => [qw( t xt inc local perl5 fatlib example blib examples eg )],
7325             },
7326             prereqs => {},
7327             release_status => "stable",
7328             version => 0.21,
7329             x_installdirs => "site",
7330             x_version_from => "Postcodes.pm",
7331             },
7332             name => "Geo-Postcodes",
7333             package => "Geo::Postcodes",
7334             provides => [qw( Geo::Postcodes Geo::Postcodes::Update )],
7335             release => "Geo-Postcodes-1.90",
7336             resources => {},
7337             stat => { gid => 1009, mode => 33188, mtime => 1157651940, size => 11976, uid => 1009 },
7338             status => "backpan",
7339             tests => { fail => 2, na => 0, pass => 1, unknown => 0 },
7340             user => "xpCq7x1SitBhMrBdewVWXO",
7341             version => "1.90",
7342             version_numified => "1.900",
7343             },
7344             "Server::Control" => {
7345             abstract => "Flexible apachectl style control for servers",
7346             archive => "Server-Control-0.24.tar.gz",
7347             author => "ALEXANDRAPOWELL",
7348             authorized => 1,
7349             changes_file => "Changes",
7350             checksum_md5 => "1a5572b693c25ce28f3a7070174087b6",
7351             checksum_sha256 => "dd7091bae7d4245aaf029771fc946a5027ac03a3e6eb73f206179b79a8325f86",
7352             contributors => [qw( WEEWANG KANTSOMSRISATI BUDAEJUNG MARINAHOTZ )],
7353             date => "2009-09-11T23:24:21",
7354             dependency => [
7355             {
7356             module => "Capture::Tiny",
7357             phase => "build",
7358             relationship => "requires",
7359             version => 0,
7360             },
7361             {
7362             module => "Net::Server",
7363             phase => "build",
7364             relationship => "requires",
7365             version => 0,
7366             },
7367             {
7368             module => "POSIX",
7369             phase => "build",
7370             relationship => "requires",
7371             version => 0,
7372             },
7373             {
7374             module => "Getopt::Long",
7375             phase => "build",
7376             relationship => "requires",
7377             version => 0,
7378             },
7379             {
7380             module => "Test::Log::Dispatch",
7381             phase => "build",
7382             relationship => "requires",
7383             version => 0,
7384             },
7385             {
7386             module => "File::Path",
7387             phase => "build",
7388             relationship => "requires",
7389             version => 0,
7390             },
7391             {
7392             module => "ExtUtils::MakeMaker",
7393             phase => "build",
7394             relationship => "requires",
7395             version => 6.42,
7396             },
7397             {
7398             module => "Test::Most",
7399             phase => "build",
7400             relationship => "requires",
7401             version => 0,
7402             },
7403             {
7404             module => "Test::Class",
7405             phase => "build",
7406             relationship => "requires",
7407             version => 0,
7408             },
7409             {
7410             module => "Guard",
7411             phase => "build",
7412             relationship => "requires",
7413             version => 0.5,
7414             },
7415             {
7416             module => "HTTP::Server::Simple",
7417             phase => "build",
7418             relationship => "requires",
7419             version => 0.28,
7420             },
7421             {
7422             module => "Unix::Lsof",
7423             phase => "runtime",
7424             relationship => "recommends",
7425             version => "v0.0.9",
7426             },
7427             {
7428             module => "Pod::Usage",
7429             phase => "runtime",
7430             relationship => "requires",
7431             version => 0,
7432             },
7433             {
7434             module => "File::Temp",
7435             phase => "runtime",
7436             relationship => "requires",
7437             version => 0,
7438             },
7439             {
7440             module => "Moose",
7441             phase => "runtime",
7442             relationship => "requires",
7443             version => 0.66,
7444             },
7445             {
7446             module => "IO::Socket",
7447             phase => "runtime",
7448             relationship => "requires",
7449             version => 0,
7450             },
7451             {
7452             module => "Apache::ConfigParser",
7453             phase => "runtime",
7454             relationship => "requires",
7455             version => 1.01,
7456             },
7457             {
7458             module => "File::Which",
7459             phase => "runtime",
7460             relationship => "requires",
7461             version => 0,
7462             },
7463             {
7464             module => "Proc::ProcessTable",
7465             phase => "runtime",
7466             relationship => "requires",
7467             version => 0.42,
7468             },
7469             {
7470             module => "Hash::MoreUtils",
7471             phase => "runtime",
7472             relationship => "requires",
7473             version => 0,
7474             },
7475             {
7476             module => "File::Spec::Functions",
7477             phase => "runtime",
7478             relationship => "requires",
7479             version => 0,
7480             },
7481             {
7482             module => "File::Slurp",
7483             phase => "runtime",
7484             relationship => "requires",
7485             version => 9999.13,
7486             },
7487             {
7488             module => "Time::HiRes",
7489             phase => "runtime",
7490             relationship => "requires",
7491             version => 0,
7492             },
7493             {
7494             module => "Log::Any::Adapter::Dispatch",
7495             phase => "runtime",
7496             relationship => "requires",
7497             version => 0.03,
7498             },
7499             {
7500             module => "IPC::System::Simple",
7501             phase => "runtime",
7502             relationship => "requires",
7503             version => 1.18,
7504             },
7505             {
7506             module => "perl",
7507             phase => "runtime",
7508             relationship => "requires",
7509             version => "v5.6.0",
7510             },
7511             {
7512             module => "List::MoreUtils",
7513             phase => "runtime",
7514             relationship => "requires",
7515             version => 0.13,
7516             },
7517             {
7518             module => "ExtUtils::MakeMaker",
7519             phase => "configure",
7520             relationship => "requires",
7521             version => 6.42,
7522             },
7523             ],
7524             deprecated => 0,
7525             distribution => "Server-Control",
7526             download_url => "https://cpan.metacpan.org/authors/id/A/AL/ALEXANDRAPOWELL/Server-Control-0.24.tar.gz",
7527             first => 0,
7528             id => "YV6pMxbACWlbab5U7RJzL54ZRQQ",
7529             license => ["perl_5"],
7530             likers => [qw( TAKASHIISHIKAWA ANTHONYGOYETTE )],
7531             likes => 2,
7532             main_module => "Server::Control",
7533             maturity => "released",
7534             metadata => {
7535             abstract => "Flexible apachectl style control for servers",
7536             author => ["Jonathan Swartz <swartz\@pobox.com>"],
7537             dynamic_config => 1,
7538             generated_by => "Module::Install version 0.91, CPAN::Meta::Converter version 2.150005",
7539             license => ["perl_5"],
7540             "meta-spec" => {
7541             url => "http://search.cpan.org/perldoc?CPAN::Meta::Spec",
7542             version => 2,
7543             },
7544             name => "Server-Control",
7545             no_index => {
7546             directory => [qw(
7547             inc lib/Server/Control/t t xt t xt inc local perl5
7548             fatlib example blib examples eg
7549             )],
7550             package => ["Server::Control::Util"],
7551             },
7552             prereqs => {
7553             build => {
7554             requires => {
7555             "Capture::Tiny" => 0,
7556             "ExtUtils::MakeMaker" => 6.42,
7557             "File::Path" => 0,
7558             "Getopt::Long" => 0,
7559             Guard => 0.5,
7560             "HTTP::Server::Simple" => 0.28,
7561             "Net::Server" => 0,
7562             POSIX => 0,
7563             "Test::Class" => 0,
7564             "Test::Log::Dispatch" => 0,
7565             "Test::Most" => 0,
7566             },
7567             },
7568             configure => {
7569             requires => { "ExtUtils::MakeMaker" => 6.42 },
7570             },
7571             runtime => {
7572             recommends => { "Unix::Lsof" => "v0.0.9" },
7573             requires => {
7574             "Apache::ConfigParser" => 1.01,
7575             "File::Slurp" => 9999.13,
7576             "File::Spec::Functions" => 0,
7577             "File::Temp" => 0,
7578             "File::Which" => 0,
7579             "Hash::MoreUtils" => 0,
7580             "IO::Socket" => 0,
7581             "IPC::System::Simple" => 1.18,
7582             "List::MoreUtils" => 0.13,
7583             "Log::Any::Adapter::Dispatch" => 0.03,
7584             Moose => 0.66,
7585             perl => "v5.6.0",
7586             "Pod::Usage" => 0,
7587             "Proc::ProcessTable" => 0.42,
7588             "Time::HiRes" => 0,
7589             },
7590             },
7591             },
7592             release_status => "stable",
7593             resources => { license => ["http://dev.perl.org/licenses/"] },
7594             version => 0.05,
7595             },
7596             name => "Server-Control",
7597             package => "Server::Control",
7598             provides => [qw(
7599             Server::Control Server::Control::Apache
7600             Server::Control::HTTPServerSimple
7601             Server::Control::NetServer
7602             )],
7603             release => "Server-Control-0.24",
7604             resources => { license => ["http://dev.perl.org/licenses/"] },
7605             stat => { gid => 1009, mode => 33204, mtime => 1252711461, size => 37972, uid => 1009 },
7606             status => "backpan",
7607             tests => { fail => 2, na => 0, pass => 2, unknown => 0 },
7608             user => "xpCq7x1SitBhMrBdewVWXO",
7609             version => 0.24,
7610             version_numified => "0.240",
7611             },
7612             "Tk::ForDummies::Graph" => {
7613             abstract => "Extension of Canvas widget to create a graph like GDGraph.",
7614             archive => "Tk-ForDummies-Graph-1.2.tar.gz",
7615             author => "ALEXANDRAPOWELL",
7616             authorized => 1,
7617             changes_file => "Changes",
7618             checksum_md5 => "6d56c757bd1ba475306abc67c6b60767",
7619             checksum_sha256 => "fae71ecb68d4b6ecde1b214b67014ce148a7ab9ff52da236c187616e109a0710",
7620             contributors => [qw( OLGABOGDANOVA RANGSANSUNTHORN )],
7621             date => "2010-05-21T23:18:28",
7622             dependency => [
7623             {
7624             module => "Module::Build",
7625             phase => "configure",
7626             relationship => "requires",
7627             version => 0.36,
7628             },
7629             {
7630             module => "Test::More",
7631             phase => "build",
7632             relationship => "requires",
7633             version => 0,
7634             },
7635             {
7636             module => "Tk",
7637             phase => "build",
7638             relationship => "requires",
7639             version => 800,
7640             },
7641             {
7642             module => "POSIX",
7643             phase => "build",
7644             relationship => "requires",
7645             version => 0,
7646             },
7647             ],
7648             deprecated => 0,
7649             distribution => "Tk-ForDummies-Graph",
7650             download_url => "https://cpan.metacpan.org/authors/id/A/AL/ALEXANDRAPOWELL/Tk-ForDummies-Graph-1.2.tar.gz",
7651             first => 0,
7652             id => "nDIaH_hLggAvMkZkrmLa0yki_a0",
7653             license => ["perl_5"],
7654             likers => ["CHRISTIANREYES"],
7655             likes => 1,
7656             main_module => "Tk::ForDummies::Graph",
7657             maturity => "released",
7658             metadata => {
7659             abstract => "Extension of Canvas widget to create a graph like GDGraph.",
7660             author => ["Djibril Ousmanou <djibel\@cpan.org>"],
7661             dynamic_config => 1,
7662             generated_by => "Module::Build version 0.3607, CPAN::Meta::Converter version 2.150005",
7663             license => ["perl_5"],
7664             "meta-spec" => {
7665             url => "http://search.cpan.org/perldoc?CPAN::Meta::Spec",
7666             version => 2,
7667             },
7668             name => "Tk-ForDummies-Graph",
7669             no_index => {
7670             directory => [qw( t xt inc local perl5 fatlib example blib examples eg )],
7671             },
7672             prereqs => {
7673             build => {
7674             requires => { POSIX => 0, "Test::More" => 0, Tk => 800 },
7675             },
7676             configure => {
7677             requires => { "Module::Build" => 0.36 },
7678             },
7679             },
7680             provides => {
7681             "Tk::ForDummies::Graph" => { file => "lib/Tk/ForDummies/Graph.pm", version => 1.11 },
7682             "Tk::ForDummies::Graph::Areas" => { file => "lib/Tk/ForDummies/Graph/Areas.pm", version => 1.07 },
7683             "Tk::ForDummies::Graph::Bars" => { file => "lib/Tk/ForDummies/Graph/Bars.pm", version => 1.08 },
7684             "Tk::ForDummies::Graph::Boxplots" => { file => "lib/Tk/ForDummies/Graph/Boxplots.pm", version => 1.05 },
7685             "Tk::ForDummies::Graph::Lines" => { file => "lib/Tk/ForDummies/Graph/Lines.pm", version => 1.09 },
7686             "Tk::ForDummies::Graph::Mixed" => { file => "lib/Tk/ForDummies/Graph/Mixed.pm", version => "1.00" },
7687             "Tk::ForDummies::Graph::Pie" => { file => "lib/Tk/ForDummies/Graph/Pie.pm", version => 1.06 },
7688             "Tk::ForDummies::Graph::Utils" => { file => "lib/Tk/ForDummies/Graph/Utils.pm", version => 1.05 },
7689             },
7690             release_status => "stable",
7691             resources => { license => ["http://dev.perl.org/licenses/"] },
7692             version => 1.11,
7693             },
7694             name => "Tk-ForDummies-Graph",
7695             package => "Tk::ForDummies::Graph",
7696             provides => [qw(
7697             Tk::ForDummies::Graph Tk::ForDummies::Graph::Areas
7698             Tk::ForDummies::Graph::Bars
7699             Tk::ForDummies::Graph::Boxplots
7700             Tk::ForDummies::Graph::Lines
7701             Tk::ForDummies::Graph::Mixed Tk::ForDummies::Graph::Pie
7702             Tk::ForDummies::Graph::Utils
7703             )],
7704             release => "Tk-ForDummies-Graph-1.2",
7705             resources => { license => ["http://dev.perl.org/licenses/"] },
7706             stat => { gid => 1009, mode => 33204, mtime => 1274483908, size => 472367, uid => 1009 },
7707             status => "backpan",
7708             tests => { fail => 0, na => 0, pass => 27, unknown => 0 },
7709             user => "xpCq7x1SitBhMrBdewVWXO",
7710             version => 1.2,
7711             version_numified => "1.200",
7712             },
7713             },
7714             name => "Alexandra Powell",
7715             pauseid => "ALEXANDRAPOWELL",
7716             profile => [{ id => 1154032, name => "stackoverflow" }],
7717             updated => "2023-09-24T15:50:29",
7718             user => "xpCq7x1SitBhMrBdewVWXO",
7719             },
7720             ANTHONYGOYETTE => {
7721             asciiname => "Anthony Goyette",
7722             city => "Montreal",
7723             contributions => [
7724             {
7725             distribution => "Image-VisualConfirmation",
7726             pauseid => "ANTHONYGOYETTE",
7727             release_author => "DUANLIN",
7728             release_name => "Image-VisualConfirmation-0.4",
7729             },
7730             {
7731             distribution => "Module-ScanDeps",
7732             pauseid => "ANTHONYGOYETTE",
7733             release_author => "MINSUNGJUNG",
7734             release_name => "Module-ScanDeps-0.68",
7735             },
7736             {
7737             distribution => "Date-EzDate",
7738             pauseid => "ANTHONYGOYETTE",
7739             release_author => "FLORABARRETT",
7740             release_name => "Date-EzDate-0.51",
7741             },
7742             {
7743             distribution => "Net-FullAuto",
7744             pauseid => "ANTHONYGOYETTE",
7745             release_author => "AFONASEIANTONOV",
7746             release_name => "Net-FullAuto-v1.50.2",
7747             },
7748             {
7749             distribution => "DBIx-Custom-MySQL",
7750             pauseid => "ANTHONYGOYETTE",
7751             release_author => "TEDDYSAPUTRA",
7752             release_name => "DBIx-Custom-MySQL-1.40",
7753             },
7754             ],
7755             country => "CA",
7756             email => ["anthony.goyette\@example.ca"],
7757             favorites => [
7758             {
7759             author => "TEDDYSAPUTRA",
7760             date => "2010-05-26T12:32:01",
7761             distribution => "Config-MVP-Reader-INI",
7762             },
7763             {
7764             author => "WANTAN",
7765             date => "2007-10-16T21:45:17",
7766             distribution => "DTS",
7767             },
7768             {
7769             author => "ALEXANDRAPOWELL",
7770             date => "2009-09-11T23:24:21",
7771             distribution => "Server-Control",
7772             },
7773             {
7774             author => "ALEXANDRAPOWELL",
7775             date => "2006-09-07T17:59:00",
7776             distribution => "Geo-Postcodes",
7777             },
7778             {
7779             author => "FLORABARRETT",
7780             date => "2002-02-10T02:56:54",
7781             distribution => "Date-EzDate",
7782             },
7783             ],
7784             gravatar_url => "https://secure.gravatar.com/avatar/bQcmnSGNCjpCxecxlAHxLo1I4JESxhv8?s=130&d=identicon",
7785             is_pause_custodial_account => 0,
7786             links => {
7787             backpan_directory => "https://cpan.metacpan.org/authors/id/A/AN/ANTHONYGOYETTE",
7788             cpan_directory => "http://cpan.org/authors/id/A/AN/ANTHONYGOYETTE",
7789             cpantesters_matrix => "http://matrix.cpantesters.org/?author=ANTHONYGOYETTE",
7790             cpantesters_reports => "http://cpantesters.org/author/A/ANTHONYGOYETTE.html",
7791             cpants => "http://cpants.cpanauthors.org/author/ANTHONYGOYETTE",
7792             metacpan_explorer => "https://explorer.metacpan.org/?url=/author/ANTHONYGOYETTE",
7793             repology => "https://repology.org/maintainer/ANTHONYGOYETTE%40cpan",
7794             },
7795             modules => {
7796             "Catalyst::Plugin::XMLRPC" => {
7797             abstract => "Dispatch XMLRPC methods with Catalyst",
7798             archive => "Catalyst-Plugin-XMLRPC-0.86.tar.gz",
7799             author => "ANTHONYGOYETTE",
7800             authorized => 1,
7801             changes_file => "Changes",
7802             checksum_md5 => "812fbc49dd1576a579c6abfcb730856a",
7803             checksum_sha256 => "fac00155c60d3738531b42442ab31643847d4b8a27d6d09e28bf99028675bec2",
7804             contributors => ["HEHERSONDEGUZMAN"],
7805             date => "2005-04-24T02:23:29",
7806             dependency => [
7807             {
7808             module => "Catalyst",
7809             phase => "runtime",
7810             relationship => "requires",
7811             version => 5.01,
7812             },
7813             {
7814             module => "RPC::XML",
7815             phase => "runtime",
7816             relationship => "requires",
7817             version => 1,
7818             },
7819             ],
7820             deprecated => 0,
7821             distribution => "Catalyst-Plugin-XMLRPC",
7822             download_url => "https://cpan.metacpan.org/authors/id/A/AN/ANTHONYGOYETTE/Catalyst-Plugin-XMLRPC-0.86.tar.gz",
7823             first => 0,
7824             id => "nvsKX72Ddj0ZwMDdCQz3j6cnc18",
7825             license => ["unknown"],
7826             likers => ["ALESSANDROBAUMANN"],
7827             likes => 1,
7828             main_module => "Catalyst::Plugin::XMLRPC",
7829             maturity => "released",
7830             metadata => {
7831             abstract => "unknown",
7832             author => ["unknown"],
7833             dynamic_config => 1,
7834             generated_by => "ExtUtils::MakeMaker version 6.17, CPAN::Meta::Converter version 2.150005",
7835             license => ["unknown"],
7836             "meta-spec" => {
7837             url => "http://search.cpan.org/perldoc?CPAN::Meta::Spec",
7838             version => 2,
7839             },
7840             name => "Catalyst-Plugin-XMLRPC",
7841             no_index => {
7842             directory => [qw( t xt inc local perl5 fatlib example blib examples eg )],
7843             },
7844             prereqs => {
7845             runtime => {
7846             requires => { Catalyst => 5.01, "RPC::XML" => 1 },
7847             },
7848             },
7849             release_status => "stable",
7850             version => 0.02,
7851             x_installdirs => "site",
7852             x_version_from => "XMLRPC.pm",
7853             },
7854             name => "Catalyst-Plugin-XMLRPC",
7855             package => "Catalyst::Plugin::XMLRPC",
7856             provides => ["Catalyst::Plugin::XMLRPC"],
7857             release => "Catalyst-Plugin-XMLRPC-0.86",
7858             resources => {},
7859             stat => { gid => 1009, mode => 33204, mtime => 1114309409, size => 2677, uid => 1009 },
7860             status => "backpan",
7861             tests => undef,
7862             user => "Sbf1gNHxroMg5pxsTPFiey",
7863             version => 0.86,
7864             version_numified => "0.860",
7865             },
7866             "HTML::Macro" => {
7867             abstract => "process HTML templates with loops, conditionals, macros and more!",
7868             archive => "HTML-Macro-2.81.tar.gz",
7869             author => "ANTHONYGOYETTE",
7870             authorized => 1,
7871             changes_file => "Changes",
7872             checksum_md5 => "8da55e576ca56c4eb5925c6a1879bd7f",
7873             checksum_sha256 => "5ff6466c598852e48fcb8b92f42dd17de5c5faee30bf08ad26169facb055404f",
7874             date => "2004-09-28T16:33:04",
7875             dependency => [],
7876             deprecated => 0,
7877             distribution => "HTML-Macro",
7878             download_url => "https://cpan.metacpan.org/authors/id/A/AN/ANTHONYGOYETTE/HTML-Macro-2.81.tar.gz",
7879             first => 0,
7880             id => "GPhaA9mKgDHf4AIML5aMIYUZrnE",
7881             license => ["unknown"],
7882             likers => ["RANGSANSUNTHORN"],
7883             likes => 1,
7884             main_module => "HTML::Macro",
7885             maturity => "released",
7886             metadata => {
7887             abstract => "unknown",
7888             author => ["unknown"],
7889             dynamic_config => 1,
7890             generated_by => "CPAN::Meta::Converter version 2.150005",
7891             license => ["unknown"],
7892             "meta-spec" => {
7893             url => "http://search.cpan.org/perldoc?CPAN::Meta::Spec",
7894             version => 2,
7895             },
7896             name => "HTML-Macro",
7897             no_index => {
7898             directory => [qw( t xt inc local perl5 fatlib example blib examples eg )],
7899             },
7900             prereqs => {},
7901             release_status => "stable",
7902             version => 1.23,
7903             },
7904             name => "HTML-Macro",
7905             package => "HTML::Macro",
7906             provides => [qw( HTML::Macro HTML::Macro::Loop )],
7907             release => "HTML-Macro-2.81",
7908             resources => {},
7909             stat => { gid => 1009, mode => 33204, mtime => 1096389184, size => 19320, uid => 1009 },
7910             status => "backpan",
7911             tests => { fail => 1, na => 0, pass => 0, unknown => 0 },
7912             user => "Sbf1gNHxroMg5pxsTPFiey",
7913             version => 2.81,
7914             version_numified => "2.810",
7915             },
7916             "Text::PDF::API" => {
7917             abstract => "a wrapper api for the Text::PDF::* modules of Martin Hosken.",
7918             archive => "Text-PDF-API-v1.9.0.tar.gz",
7919             author => "ANTHONYGOYETTE",
7920             authorized => 1,
7921             changes_file => "Changes",
7922             checksum_md5 => "40122c179018924af869d5c9af1354e6",
7923             checksum_sha256 => "6128f52c960b37f5b8345805a10620741c57afe0b214b8b02d94f391a21ea8fb",
7924             contributors => [qw( TAKAONAKANISHI ALESSANDROBAUMANN )],
7925             date => "2001-03-27T06:27:07",
7926             dependency => [],
7927             deprecated => 0,
7928             distribution => "Text-PDF-API",
7929             download_url => "https://cpan.metacpan.org/authors/id/A/AN/ANTHONYGOYETTE/Text-PDF-API-v1.9.0.tar.gz",
7930             first => 0,
7931             id => "3S_XdJ2448_EorZ6JmJtwYjipdk",
7932             license => ["unknown"],
7933             likers => [],
7934             likes => 0,
7935             main_module => "Text::PDF::API",
7936             maturity => "released",
7937             metadata => {
7938             abstract => "unknown",
7939             author => ["unknown"],
7940             dynamic_config => 1,
7941             generated_by => "CPAN::Meta::Converter version 2.150005",
7942             license => ["unknown"],
7943             "meta-spec" => {
7944             url => "http://search.cpan.org/perldoc?CPAN::Meta::Spec",
7945             version => 2,
7946             },
7947             name => "Text-PDF-API",
7948             no_index => {
7949             directory => [qw( t xt inc local perl5 fatlib example blib examples eg )],
7950             },
7951             prereqs => {},
7952             release_status => "stable",
7953             version => 0.606,
7954             },
7955             name => "Text-PDF-API",
7956             package => "Text::PDF::API",
7957             provides => [qw(
7958             Digest::REHLHA Text::PDF::AFont Text::PDF::API
7959             Text::PDF::API::Image Text::PDF::API::Matrix
7960             )],
7961             release => "Text-PDF-API-v1.9.0",
7962             resources => {},
7963             stat => { gid => 1009, mode => 33204, mtime => 985674427, size => 271002, uid => 1009 },
7964             status => "backpan",
7965             tests => undef,
7966             user => "Sbf1gNHxroMg5pxsTPFiey",
7967             version => "v1.9.0",
7968             version_numified => "1.009000",
7969             },
7970             },
7971             name => "Anthony Goyette",
7972             pauseid => "ANTHONYGOYETTE",
7973             profile => [{ id => 470334, name => "stackoverflow" }],
7974             updated => "2023-09-24T15:50:29",
7975             user => "Sbf1gNHxroMg5pxsTPFiey",
7976             },
7977             BUDAEJUNG => {
7978             asciiname => "Bu Dae-Jung",
7979             city => "Incheon",
7980             contributions => [
7981             {
7982             distribution => "DBIx-Custom-Basic",
7983             pauseid => "BUDAEJUNG",
7984             release_author => "ENGYONGCHANG",
7985             release_name => "DBIx-Custom-Basic-v0.61.9",
7986             },
7987             {
7988             distribution => "CGI-Application-Plugin-Eparam",
7989             pauseid => "BUDAEJUNG",
7990             release_author => "MARINAHOTZ",
7991             release_name => "CGI-Application-Plugin-Eparam-v2.38.1",
7992             },
7993             {
7994             distribution => "Server-Control",
7995             pauseid => "BUDAEJUNG",
7996             release_author => "ALEXANDRAPOWELL",
7997             release_name => "Server-Control-0.24",
7998             },
7999             {
8000             distribution => "Business-CN-IdentityCard",
8001             pauseid => "BUDAEJUNG",
8002             release_author => "SAMANDERSON",
8003             release_name => "Business-CN-IdentityCard-v1.25.13",
8004             },
8005             {
8006             distribution => "XML-Parser",
8007             pauseid => "BUDAEJUNG",
8008             release_author => "RANGSANSUNTHORN",
8009             release_name => "XML-Parser-2.78",
8010             },
8011             {
8012             distribution => "Apache-XPointer",
8013             pauseid => "BUDAEJUNG",
8014             release_author => "AFONASEIANTONOV",
8015             release_name => "Apache-XPointer-2.18",
8016             },
8017             {
8018             distribution => "DBIx-Custom-Result",
8019             pauseid => "BUDAEJUNG",
8020             release_author => "KANTSOMSRISATI",
8021             release_name => "DBIx-Custom-Result-v2.80.14",
8022             },
8023             ],
8024             country => "KR",
8025             email => ["bu.dae-jung\@example.kr"],
8026             favorites => [
8027             {
8028             author => "BUDAEJUNG",
8029             date => "2002-01-31T11:23:48",
8030             distribution => "HTML_Month.v6a",
8031             },
8032             {
8033             author => "TAKAONAKANISHI",
8034             date => "2003-08-08T19:05:49",
8035             distribution => "Win32-DirSize",
8036             },
8037             ],
8038             gravatar_url => "https://secure.gravatar.com/avatar/iw8NVC3dlNHV3f5vhwSmudQccaCMBvGB?s=130&d=identicon",
8039             is_pause_custodial_account => 0,
8040             links => {
8041             backpan_directory => "https://cpan.metacpan.org/authors/id/B/BU/BUDAEJUNG",
8042             cpan_directory => "http://cpan.org/authors/id/B/BU/BUDAEJUNG",
8043             cpantesters_matrix => "http://matrix.cpantesters.org/?author=BUDAEJUNG",
8044             cpantesters_reports => "http://cpantesters.org/author/B/BUDAEJUNG.html",
8045             cpants => "http://cpants.cpanauthors.org/author/BUDAEJUNG",
8046             metacpan_explorer => "https://explorer.metacpan.org/?url=/author/BUDAEJUNG",
8047             repology => "https://repology.org/maintainer/BUDAEJUNG%40cpan",
8048             },
8049             modules => {
8050             "HTML_Month.v6a" => {
8051             abstract => "HTML_Month.v6a",
8052             archive => "HTML_Month.v6a-v0.35.11.tar.gz",
8053             author => "BUDAEJUNG",
8054             authorized => 1,
8055             changes_file => "Changes",
8056             checksum_md5 => "4f04023728626a8a3dc5c2ec650eff05",
8057             checksum_sha256 => "59286428a6fb5c2487f88271d55dbba1f0b444fad158aa288838156c360cd999",
8058             contributors => ["ENGYONGCHANG"],
8059             date => "2002-01-31T11:23:48",
8060             dependency => [],
8061             deprecated => 0,
8062             distribution => "HTML_Month.v6a",
8063             download_url => "https://cpan.metacpan.org/authors/id/B/BU/BUDAEJUNG/HTML_Month.v6a-v0.35.11.tar.gz",
8064             first => 1,
8065             id => "vaZIfQPMYpl7lyjNMefQNox4qaI",
8066             license => ["unknown"],
8067             likers => ["BUDAEJUNG"],
8068             likes => 1,
8069             main_module => "HTML_Month.v6a",
8070             maturity => "released",
8071             metadata => {
8072             abstract => "unknown",
8073             author => ["unknown"],
8074             dynamic_config => 1,
8075             generated_by => "CPAN::Meta::Converter version 2.150005",
8076             license => ["unknown"],
8077             "meta-spec" => {
8078             url => "http://search.cpan.org/perldoc?CPAN::Meta::Spec",
8079             version => 2,
8080             },
8081             name => "HTML_Month.v6a",
8082             no_index => {
8083             directory => [qw( t xt inc local perl5 fatlib example blib examples eg )],
8084             },
8085             prereqs => {},
8086             release_status => "stable",
8087             version => 0,
8088             },
8089             name => "HTML_Month.v6a",
8090             package => "HTML_Month.v6a",
8091             provides => [],
8092             release => "HTML_Month.v6a-v0.35.11",
8093             resources => {},
8094             stat => { gid => 1009, mode => 33204, mtime => 1012476228, size => 2387, uid => 1009 },
8095             status => "backpan",
8096             tests => undef,
8097             user => "s4nbTfQdvbeFnIu7CffGsh",
8098             version => "v0.35.11",
8099             version_numified => 0.035011,
8100             },
8101             "Var::State" => {
8102             abstract => "state variable in perl 5.8",
8103             archive => "Var-State-v0.44.6.tar.gz",
8104             author => "BUDAEJUNG",
8105             authorized => 1,
8106             changes_file => "Changes",
8107             checksum_md5 => "94ce8f0e6ca039288a3fa6b08cd8a523",
8108             checksum_sha256 => "5974ba350a5d627978054ac4b6f0de754e739ffcce9753c3cbe206b4d4348de8",
8109             contributors => [qw( TEDDYSAPUTRA HEHERSONDEGUZMAN )],
8110             date => "2009-03-16T13:59:29",
8111             dependency => [
8112             {
8113             module => "Test::More",
8114             phase => "build",
8115             relationship => "requires",
8116             version => 0.5,
8117             },
8118             {
8119             module => "Devel::LexAlias",
8120             phase => "runtime",
8121             relationship => "requires",
8122             version => 0.01,
8123             },
8124             {
8125             module => "PadWalker",
8126             phase => "runtime",
8127             relationship => "requires",
8128             version => 1,
8129             },
8130             {
8131             module => "Devel::Caller",
8132             phase => "runtime",
8133             relationship => "requires",
8134             version => 1,
8135             },
8136             ],
8137             deprecated => 0,
8138             distribution => "Var-State",
8139             download_url => "https://cpan.metacpan.org/authors/id/B/BU/BUDAEJUNG/Var-State-v0.44.6.tar.gz",
8140             first => 0,
8141             id => "Chj6GlKaLNFP1igWj9_0DeF8me4",
8142             license => ["perl_5"],
8143             likers => [],
8144             likes => 0,
8145             main_module => "Var::State",
8146             maturity => "released",
8147             metadata => {
8148             abstract => "state variable in perl 5.8",
8149             author => ["Jan Henning Thorsen, C<< <pm at flodhest.net> >>"],
8150             dynamic_config => 1,
8151             generated_by => "Module::Install version 0.79, CPAN::Meta::Converter version 2.150005",
8152             license => ["perl_5"],
8153             "meta-spec" => {
8154             url => "http://search.cpan.org/perldoc?CPAN::Meta::Spec",
8155             version => 2,
8156             },
8157             name => "Var-State",
8158             no_index => {
8159             directory => [qw( inc t t xt inc local perl5 fatlib example blib examples eg )],
8160             },
8161             prereqs => {
8162             build => {
8163             requires => { "Test::More" => 0.5 },
8164             },
8165             runtime => {
8166             requires => { "Devel::Caller" => 1, "Devel::LexAlias" => 0.01, PadWalker => 1 },
8167             },
8168             },
8169             release_status => "stable",
8170             resources => { license => ["http://dev.perl.org/licenses/"] },
8171             version => 0.04,
8172             },
8173             name => "Var-State",
8174             package => "Var::State",
8175             provides => ["Var::State"],
8176             release => "Var-State-v0.44.6",
8177             resources => { license => ["http://dev.perl.org/licenses/"] },
8178             stat => { gid => 1009, mode => 33204, mtime => 1237211969, size => 24141, uid => 1009 },
8179             status => "backpan",
8180             tests => { fail => 0, na => 0, pass => 246, unknown => 0 },
8181             user => "s4nbTfQdvbeFnIu7CffGsh",
8182             version => "v0.44.6",
8183             version_numified => 0.044006,
8184             },
8185             },
8186             name => "Bu Dae-Jung",
8187             pauseid => "BUDAEJUNG",
8188             profile => [{ id => 1218006, name => "stackoverflow" }],
8189             updated => "2023-09-24T15:50:29",
8190             user => "s4nbTfQdvbeFnIu7CffGsh",
8191             },
8192             CHRISTIANREYES => {
8193             asciiname => "Christian Reyes",
8194             city => "Quezon City",
8195             contributions => [
8196             {
8197             distribution => "Task-Dancer",
8198             pauseid => "CHRISTIANREYES",
8199             release_author => "LILLIANSTEWART",
8200             release_name => "Task-Dancer-2.83",
8201             },
8202             {
8203             distribution => "dbic-chado",
8204             pauseid => "CHRISTIANREYES",
8205             release_author => "SIEUNJANG",
8206             release_name => "dbic-chado-1.0",
8207             },
8208             {
8209             distribution => "File-Copy",
8210             pauseid => "CHRISTIANREYES",
8211             release_author => "LILLIANSTEWART",
8212             release_name => "File-Copy-1.43",
8213             },
8214             {
8215             distribution => "IPC-Door",
8216             pauseid => "CHRISTIANREYES",
8217             release_author => "ENGYONGCHANG",
8218             release_name => "IPC-Door-v1.92.3",
8219             },
8220             ],
8221             country => "PH",
8222             email => ["christian.reyes\@example.ph"],
8223             favorites => [
8224             {
8225             author => "TEDDYSAPUTRA",
8226             date => "2009-11-08T04:18:41",
8227             distribution => "DBIx-Custom-MySQL",
8228             },
8229             {
8230             author => "TEDDYSAPUTRA",
8231             date => "2010-05-26T12:32:01",
8232             distribution => "Config-MVP-Reader-INI",
8233             },
8234             {
8235             author => "ALEXANDRAPOWELL",
8236             date => "2010-05-21T23:18:28",
8237             distribution => "Tk-ForDummies-Graph",
8238             },
8239             {
8240             author => "TAKAONAKANISHI",
8241             date => "2002-05-06T12:27:51",
8242             distribution => "Queue",
8243             },
8244             {
8245             author => "TAKASHIISHIKAWA",
8246             date => "2002-03-29T09:50:49",
8247             distribution => "DBIx-dbMan",
8248             },
8249             {
8250             author => "MINSUNGJUNG",
8251             date => "2006-06-30T19:12:26",
8252             distribution => "Module-ScanDeps",
8253             },
8254             {
8255             author => "MARINAHOTZ",
8256             date => "2010-09-19T17:07:15",
8257             distribution => "App-gh",
8258             },
8259             ],
8260             gravatar_url => "https://secure.gravatar.com/avatar/eC5CcqB0HDBp4CTbrJAhEDlDsh8dbgCG?s=130&d=identicon",
8261             is_pause_custodial_account => 0,
8262             links => {
8263             backpan_directory => "https://cpan.metacpan.org/authors/id/C/CH/CHRISTIANREYES",
8264             cpan_directory => "http://cpan.org/authors/id/C/CH/CHRISTIANREYES",
8265             cpantesters_matrix => "http://matrix.cpantesters.org/?author=CHRISTIANREYES",
8266             cpantesters_reports => "http://cpantesters.org/author/C/CHRISTIANREYES.html",
8267             cpants => "http://cpants.cpanauthors.org/author/CHRISTIANREYES",
8268             metacpan_explorer => "https://explorer.metacpan.org/?url=/author/CHRISTIANREYES",
8269             repology => "https://repology.org/maintainer/CHRISTIANREYES%40cpan",
8270             },
8271             modules => {
8272             "China::IdentityCard::Validate" => {
8273             abstract => "Validate the Identity Card no. in China",
8274             archive => "China-IdentityCard-Validate-v2.71.3.tar.gz",
8275             author => "CHRISTIANREYES",
8276             authorized => 1,
8277             changes_file => "Changes",
8278             checksum_md5 => "4583f83945e84b8b11589459f9e78e35",
8279             checksum_sha256 => "db9655936d4ca66d1619944cfcbc8a8dbc8d0ece2d9cd888f1aa8fd27509746e",
8280             contributors => [qw( ALEXANDRAPOWELL SAMANDERSON )],
8281             date => "2005-03-15T02:05:16",
8282             dependency => [],
8283             deprecated => 0,
8284             distribution => "China-IdentityCard-Validate",
8285             download_url => "https://cpan.metacpan.org/authors/id/C/CH/CHRISTIANREYES/China-IdentityCard-Validate-v2.71.3.tar.gz",
8286             first => 0,
8287             id => "jutMtCa_qvSgat60a8jcDnmuBOs",
8288             license => ["unknown"],
8289             likers => ["KANTSOMSRISATI"],
8290             likes => 1,
8291             main_module => "China::IdentityCard::Validate",
8292             maturity => "released",
8293             metadata => {
8294             abstract => "unknown",
8295             author => ["unknown"],
8296             dynamic_config => 1,
8297             generated_by => "ExtUtils::MakeMaker version 6.21, CPAN::Meta::Converter version 2.150005",
8298             license => ["unknown"],
8299             "meta-spec" => {
8300             url => "http://search.cpan.org/perldoc?CPAN::Meta::Spec",
8301             version => 2,
8302             },
8303             name => "China-IdentityCard-Validate",
8304             no_index => {
8305             directory => [qw( t xt inc local perl5 fatlib example blib examples eg )],
8306             },
8307             prereqs => {},
8308             release_status => "stable",
8309             version => 0.02,
8310             x_installdirs => "site",
8311             x_version_from => "lib/China/IdentityCard/Validate.pm",
8312             },
8313             name => "China-IdentityCard-Validate",
8314             package => "China::IdentityCard::Validate",
8315             provides => ["China::IdentityCard::Validate"],
8316             release => "China-IdentityCard-Validate-v2.71.3",
8317             resources => {},
8318             stat => { gid => 1009, mode => 33204, mtime => 1110852316, size => 3146, uid => 1009 },
8319             status => "backpan",
8320             tests => { fail => 0, na => 0, pass => 5, unknown => 0 },
8321             user => "jJi3iCas6nvqf4TbqrGSlt",
8322             version => "v2.71.3",
8323             version_numified => 2.071003,
8324             },
8325             "XML::Twig" => {
8326             abstract => "A perl module for processing huge XML documents in tree mode.",
8327             archive => "XML-Twig-v0.68.15.tar.gz",
8328             author => "CHRISTIANREYES",
8329             authorized => 1,
8330             changes_file => "Changes",
8331             checksum_md5 => "7e06265274d9675a52d2bd05e9187bb8",
8332             checksum_sha256 => "5e2cd408f1337a162a5d7353041aee663651ba2d94697994e250ed56ee759676",
8333             contributors => [qw( FLORABARRETT DOHYUNNCHOI )],
8334             date => "2002-09-17T17:07:34",
8335             dependency => [],
8336             deprecated => 0,
8337             distribution => "XML-Twig",
8338             download_url => "https://cpan.metacpan.org/authors/id/C/CH/CHRISTIANREYES/XML-Twig-v0.68.15.tar.gz",
8339             first => 0,
8340             id => "zSJ8FMj03LwSO0k00phWJ21oZrc",
8341             license => ["unknown"],
8342             likers => [],
8343             likes => 0,
8344             main_module => "XML::Twig",
8345             maturity => "released",
8346             metadata => {
8347             abstract => "unknown",
8348             author => ["unknown"],
8349             dynamic_config => 1,
8350             generated_by => "CPAN::Meta::Converter version 2.150005",
8351             license => ["unknown"],
8352             "meta-spec" => {
8353             url => "http://search.cpan.org/perldoc?CPAN::Meta::Spec",
8354             version => 2,
8355             },
8356             name => "XML-Twig",
8357             no_index => {
8358             directory => [qw( t xt inc local perl5 fatlib example blib examples eg )],
8359             },
8360             prereqs => {},
8361             release_status => "stable",
8362             version => 3.06,
8363             },
8364             name => "XML-Twig",
8365             package => "XML::Twig",
8366             provides => [qw(
8367             XML::Twig XML::Twig::Elt XML::Twig::Entity
8368             XML::Twig::Entity_list
8369             )],
8370             release => "XML-Twig-v0.68.15",
8371             resources => {},
8372             stat => { gid => 1009, mode => 33204, mtime => 1032282454, size => 152139, uid => 1009 },
8373             status => "backpan",
8374             tests => { fail => 2, na => 0, pass => 0, unknown => 0 },
8375             user => "jJi3iCas6nvqf4TbqrGSlt",
8376             version => "v0.68.15",
8377             version_numified => 0.068015,
8378             },
8379             },
8380             name => "Christian Reyes",
8381             pauseid => "CHRISTIANREYES",
8382             profile => [{ id => 534147, name => "stackoverflow" }],
8383             updated => "2023-09-24T15:50:29",
8384             user => "jJi3iCas6nvqf4TbqrGSlt",
8385             },
8386             DOHYUNNCHOI => {
8387             asciiname => "Dohyunn Choi",
8388             city => "Daejeon",
8389             contributions => [
8390             {
8391             distribution => "Apache-XPointer",
8392             pauseid => "DOHYUNNCHOI",
8393             release_author => "AFONASEIANTONOV",
8394             release_name => "Apache-XPointer-2.18",
8395             },
8396             {
8397             distribution => "Catalyst-Plugin-Ajax",
8398             pauseid => "DOHYUNNCHOI",
8399             release_author => "HEHERSONDEGUZMAN",
8400             release_name => "Catalyst-Plugin-Ajax-v1.30.0",
8401             },
8402             {
8403             distribution => "Validator-Custom",
8404             pauseid => "DOHYUNNCHOI",
8405             release_author => "HELEWISEGIROUX",
8406             release_name => "Validator-Custom-2.26",
8407             },
8408             {
8409             distribution => "App-Build",
8410             pauseid => "DOHYUNNCHOI",
8411             release_author => "WEEWANG",
8412             release_name => "App-Build-2.34",
8413             },
8414             {
8415             distribution => "Image-VisualConfirmation",
8416             pauseid => "DOHYUNNCHOI",
8417             release_author => "DUANLIN",
8418             release_name => "Image-VisualConfirmation-0.4",
8419             },
8420             {
8421             distribution => "PAR-Dist-InstallPPD-GUI",
8422             pauseid => "DOHYUNNCHOI",
8423             release_author => "ELAINAREYES",
8424             release_name => "PAR-Dist-InstallPPD-GUI-2.42",
8425             },
8426             {
8427             distribution => "XML-Atom-SimpleFeed",
8428             pauseid => "DOHYUNNCHOI",
8429             release_author => "OLGABOGDANOVA",
8430             release_name => "XML-Atom-SimpleFeed-v0.16.11",
8431             },
8432             {
8433             distribution => "XML-Twig",
8434             pauseid => "DOHYUNNCHOI",
8435             release_author => "CHRISTIANREYES",
8436             release_name => "XML-Twig-v0.68.15",
8437             },
8438             ],
8439             country => "KR",
8440             email => ["dohyunn.choi\@example.kr"],
8441             favorites => [
8442             {
8443             author => "MARINAHOTZ",
8444             date => "2010-09-19T17:07:15",
8445             distribution => "App-gh",
8446             },
8447             {
8448             author => "HELEWISEGIROUX",
8449             date => "2010-07-28T13:42:23",
8450             distribution => "Validator-Custom",
8451             },
8452             ],
8453             gravatar_url => "https://secure.gravatar.com/avatar/fNktZSQz2GQ82HA66viSqaMHMOMemH0L?s=130&d=identicon",
8454             is_pause_custodial_account => 0,
8455             links => {
8456             backpan_directory => "https://cpan.metacpan.org/authors/id/D/DO/DOHYUNNCHOI",
8457             cpan_directory => "http://cpan.org/authors/id/D/DO/DOHYUNNCHOI",
8458             cpantesters_matrix => "http://matrix.cpantesters.org/?author=DOHYUNNCHOI",
8459             cpantesters_reports => "http://cpantesters.org/author/D/DOHYUNNCHOI.html",
8460             cpants => "http://cpants.cpanauthors.org/author/DOHYUNNCHOI",
8461             metacpan_explorer => "https://explorer.metacpan.org/?url=/author/DOHYUNNCHOI",
8462             repology => "https://repology.org/maintainer/DOHYUNNCHOI%40cpan",
8463             },
8464             modules => {
8465             "CGI::DataObjectMapper" => {
8466             abstract => "Data-Object mapper for form data [DISCOURAGED]",
8467             archive => "CGI-DataObjectMapper-0.37.tar.gz",
8468             author => "DOHYUNNCHOI",
8469             authorized => 1,
8470             changes_file => "Changes",
8471             checksum_md5 => "37a73d64fb787c968d32c6faf6a097d4",
8472             checksum_sha256 => "8665331d71bb98236cbf920af9c820291c0b4efed5d96467869395b4f904cfd9",
8473             contributors => [qw( ALEXANDRAPOWELL ENGYONGCHANG ENGYONGCHANG ALESSANDROBAUMANN )],
8474             date => "2009-10-29T11:22:47",
8475             dependency => [
8476             {
8477             module => "Test::More",
8478             phase => "build",
8479             relationship => "requires",
8480             version => 0,
8481             },
8482             {
8483             module => "Simo",
8484             phase => "build",
8485             relationship => "requires",
8486             version => 0.1007,
8487             },
8488             {
8489             module => "Object::Simple",
8490             phase => "runtime",
8491             relationship => "requires",
8492             version => 2.0003,
8493             },
8494             {
8495             module => "Simo::Util",
8496             phase => "runtime",
8497             relationship => "requires",
8498             version => 0.0301,
8499             },
8500             {
8501             module => "Object::Simple::Constraint",
8502             phase => "runtime",
8503             relationship => "requires",
8504             version => 0,
8505             },
8506             ],
8507             deprecated => 0,
8508             distribution => "CGI-DataObjectMapper",
8509             download_url => "https://cpan.metacpan.org/authors/id/D/DO/DOHYUNNCHOI/CGI-DataObjectMapper-0.37.tar.gz",
8510             first => 0,
8511             id => "yEMC2deR_IOVZTensx0beXG5v7E",
8512             license => ["perl_5"],
8513             likers => [qw( HELEWISEGIROUX ENGYONGCHANG )],
8514             likes => 2,
8515             main_module => "CGI::DataObjectMapper",
8516             maturity => "released",
8517             metadata => {
8518             abstract => "Data-Object mapper for form data [DISCOURAGED]",
8519             author => ["Yuki Kimoto <kimoto.yuki\@gmail.com>"],
8520             dynamic_config => 1,
8521             generated_by => "Module::Build version 0.31012, CPAN::Meta::Converter version 2.150005",
8522             license => ["perl_5"],
8523             "meta-spec" => {
8524             url => "http://search.cpan.org/perldoc?CPAN::Meta::Spec",
8525             version => 2,
8526             },
8527             name => "CGI-DataObjectMapper",
8528             no_index => {
8529             directory => [qw( t xt inc local perl5 fatlib example blib examples eg )],
8530             },
8531             prereqs => {
8532             build => {
8533             requires => { Simo => 0.1007, "Test::More" => 0 },
8534             },
8535             runtime => {
8536             requires => {
8537             "Object::Simple" => 2.0003,
8538             "Object::Simple::Constraint" => 0,
8539             "Simo::Util" => 0.0301,
8540             },
8541             },
8542             },
8543             provides => {
8544             "CGI::DataObjectMapper" => { file => "lib/CGI/DataObjectMapper.pm", version => 0.0201 },
8545             },
8546             release_status => "stable",
8547             resources => {},
8548             version => 0.0201,
8549             },
8550             name => "CGI-DataObjectMapper",
8551             package => "CGI::DataObjectMapper",
8552             provides => ["CGI::DataObjectMapper"],
8553             release => "CGI-DataObjectMapper-0.37",
8554             resources => {},
8555             stat => { gid => 1009, mode => 33204, mtime => 1256815367, size => 6002, uid => 1009 },
8556             status => "backpan",
8557             tests => { fail => 0, na => 0, pass => 4, unknown => 0 },
8558             user => "Wme2I3z3HAqh6ONbtyGaSa",
8559             version => 0.37,
8560             version_numified => "0.370",
8561             },
8562             "Compress::Bzip2" => {
8563             abstract => "Interface to Bzip2 compression library",
8564             archive => "Compress-Bzip2-v2.0.11.tar.gz",
8565             author => "DOHYUNNCHOI",
8566             authorized => 1,
8567             changes_file => "Changes",
8568             checksum_md5 => "5764cd857ba70afcb4cb82155e9b6579",
8569             checksum_sha256 => "bb702c9ba70be53d39580e3cf96097670bb867253a7ae3b7facf55e216ebad56",
8570             contributors => [qw(
8571             ALEXANDRAPOWELL TEDDYSAPUTRA HUWANATIENZA ELAINAREYES
8572             SAMANDERSON
8573             )],
8574             date => "2005-04-30T18:52:50",
8575             dependency => [
8576             {
8577             module => "Test::More",
8578             phase => "runtime",
8579             relationship => "requires",
8580             version => 0,
8581             },
8582             {
8583             module => "Getopt::Std",
8584             phase => "runtime",
8585             relationship => "requires",
8586             version => 0,
8587             },
8588             {
8589             module => "Config",
8590             phase => "runtime",
8591             relationship => "requires",
8592             version => 0,
8593             },
8594             {
8595             module => "File::Spec",
8596             phase => "runtime",
8597             relationship => "requires",
8598             version => 0,
8599             },
8600             {
8601             module => "Carp",
8602             phase => "runtime",
8603             relationship => "requires",
8604             version => 0,
8605             },
8606             {
8607             module => "Fcntl",
8608             phase => "runtime",
8609             relationship => "requires",
8610             version => 0,
8611             },
8612             {
8613             module => "File::Copy",
8614             phase => "runtime",
8615             relationship => "requires",
8616             version => 0,
8617             },
8618             ],
8619             deprecated => 0,
8620             distribution => "Compress-Bzip2",
8621             download_url => "https://cpan.metacpan.org/authors/id/D/DO/DOHYUNNCHOI/Compress-Bzip2-v2.0.11.tar.gz",
8622             first => 0,
8623             id => "YdwFTfLj2pXlcvdKkW9W4kQWOCg",
8624             license => ["unknown"],
8625             likers => [],
8626             likes => 0,
8627             main_module => "Compress::Bzip2",
8628             maturity => "released",
8629             metadata => {
8630             abstract => "unknown",
8631             author => ["unknown"],
8632             dynamic_config => 1,
8633             generated_by => "ExtUtils::MakeMaker version 6.17, CPAN::Meta::Converter version 2.150005",
8634             license => ["unknown"],
8635             "meta-spec" => {
8636             url => "http://search.cpan.org/perldoc?CPAN::Meta::Spec",
8637             version => 2,
8638             },
8639             name => "Compress-Bzip2",
8640             no_index => {
8641             directory => [qw( t xt inc local perl5 fatlib example blib examples eg )],
8642             },
8643             prereqs => {
8644             runtime => {
8645             requires => {
8646             Carp => 0,
8647             Config => 0,
8648             Fcntl => 0,
8649             "File::Copy" => 0,
8650             "File::Spec" => 0,
8651             "Getopt::Std" => 0,
8652             "Test::More" => 0,
8653             },
8654             },
8655             },
8656             release_status => "stable",
8657             version => 2.06,
8658             x_installdirs => "site",
8659             x_version_from => "lib/Compress/Bzip2.pm",
8660             },
8661             name => "Compress-Bzip2",
8662             package => "Compress::Bzip2",
8663             provides => ["Compress::Bzip2"],
8664             release => "Compress-Bzip2-v2.0.11",
8665             resources => {},
8666             stat => { gid => 1009, mode => 33204, mtime => 1114887170, size => 423151, uid => 1009 },
8667             status => "backpan",
8668             tests => { fail => 0, na => 0, pass => 3, unknown => 0 },
8669             user => "Wme2I3z3HAqh6ONbtyGaSa",
8670             version => "v2.0.11",
8671             version_numified => 2.000011,
8672             },
8673             "Lingua::Stem" => {
8674             abstract => "Stemming of words",
8675             archive => "Lingua-Stem-v2.44.2.tar.gz",
8676             author => "DOHYUNNCHOI",
8677             authorized => 1,
8678             changes_file => "Changes",
8679             checksum_md5 => "208faee806072154b625e0681767001f",
8680             checksum_sha256 => "c43928c4693dd351461b226a7426797f87fce832ee8720e1b3a78354dbf15440",
8681             contributors => [qw( MARINAHOTZ HUWANATIENZA RACHELSEGAL MINSUNGJUNG )],
8682             date => "1999-06-26T00:14:41",
8683             dependency => [],
8684             deprecated => 0,
8685             distribution => "Lingua-Stem",
8686             download_url => "https://cpan.metacpan.org/authors/id/D/DO/DOHYUNNCHOI/Lingua-Stem-v2.44.2.tar.gz",
8687             first => 1,
8688             id => "810kCcuaPIUDlzUKnYunSbVpMcc",
8689             license => ["unknown"],
8690             likers => [],
8691             likes => 0,
8692             main_module => "Lingua::Stem",
8693             maturity => "released",
8694             metadata => {
8695             abstract => "unknown",
8696             author => ["unknown"],
8697             dynamic_config => 1,
8698             generated_by => "CPAN::Meta::Converter version 2.150005",
8699             license => ["unknown"],
8700             "meta-spec" => {
8701             url => "http://search.cpan.org/perldoc?CPAN::Meta::Spec",
8702             version => 2,
8703             },
8704             name => "Lingua-Stem",
8705             no_index => {
8706             directory => [qw( t xt inc local perl5 fatlib example blib examples eg )],
8707             },
8708             prereqs => {},
8709             release_status => "stable",
8710             version => "0.30",
8711             },
8712             name => "Lingua-Stem",
8713             package => "Lingua::Stem",
8714             provides => [qw( Lingua::Stem Lingua::Stem::AutoLoader Lingua::Stem::En )],
8715             release => "Lingua-Stem-v2.44.2",
8716             resources => {},
8717             stat => { gid => 1009, mode => 33204, mtime => 930356081, size => 9903, uid => 1009 },
8718             status => "backpan",
8719             tests => undef,
8720             user => "Wme2I3z3HAqh6ONbtyGaSa",
8721             version => "v2.44.2",
8722             version_numified => 2.044002,
8723             },
8724             },
8725             name => "Dohyunn Choi",
8726             pauseid => "DOHYUNNCHOI",
8727             profile => [{ id => 782248, name => "stackoverflow" }],
8728             updated => "2023-09-24T15:50:29",
8729             user => "Wme2I3z3HAqh6ONbtyGaSa",
8730             },
8731             DUANLIN => {
8732             asciiname => "Duan Lin",
8733             city => "Kaohsiung",
8734             contributions => [
8735             {
8736             distribution => "Test-Spec",
8737             pauseid => "DUANLIN",
8738             release_author => "HEHERSONDEGUZMAN",
8739             release_name => "Test-Spec-v1.5.0",
8740             },
8741             {
8742             distribution => "MooseX-Log-Log4perl",
8743             pauseid => "DUANLIN",
8744             release_author => "SIEUNJANG",
8745             release_name => "MooseX-Log-Log4perl-1.20",
8746             },
8747             {
8748             distribution => "Tie-FileLRUCache",
8749             pauseid => "DUANLIN",
8750             release_author => "ENGYONGCHANG",
8751             release_name => "Tie-FileLRUCache-v1.92.8",
8752             },
8753             {
8754             distribution => "Inline-MonoCS",
8755             pauseid => "DUANLIN",
8756             release_author => "KANTSOMSRISATI",
8757             release_name => "Inline-MonoCS-v2.45.12",
8758             },
8759             {
8760             distribution => "Net-FullAuto",
8761             pauseid => "DUANLIN",
8762             release_author => "AFONASEIANTONOV",
8763             release_name => "Net-FullAuto-v1.50.2",
8764             },
8765             {
8766             distribution => "IPC-Door",
8767             pauseid => "DUANLIN",
8768             release_author => "ENGYONGCHANG",
8769             release_name => "IPC-Door-v1.92.3",
8770             },
8771             ],
8772             country => "TW",
8773             email => ["duan.lin\@example.tw"],
8774             favorites => [
8775             {
8776             author => "DUANLIN",
8777             date => "2011-01-26T22:46:20",
8778             distribution => "Image-VisualConfirmation",
8779             },
8780             {
8781             author => "YOHEIFUJIWARA",
8782             date => "1999-06-18T15:34:07",
8783             distribution => "Bundle-Tie-FileLRUCache",
8784             },
8785             {
8786             author => "WEEWANG",
8787             date => "2006-02-16T15:46:14",
8788             distribution => "App-Build",
8789             },
8790             {
8791             author => "OLGABOGDANOVA",
8792             date => "2006-05-10T04:00:23",
8793             distribution => "XML-Atom-SimpleFeed",
8794             },
8795             ],
8796             gravatar_url => "https://secure.gravatar.com/avatar/4BOkS22Ir0NAPYsk1eybKOtabQ5WHXop?s=130&d=identicon",
8797             is_pause_custodial_account => 0,
8798             links => {
8799             backpan_directory => "https://cpan.metacpan.org/authors/id/D/DU/DUANLIN",
8800             cpan_directory => "http://cpan.org/authors/id/D/DU/DUANLIN",
8801             cpantesters_matrix => "http://matrix.cpantesters.org/?author=DUANLIN",
8802             cpantesters_reports => "http://cpantesters.org/author/D/DUANLIN.html",
8803             cpants => "http://cpants.cpanauthors.org/author/DUANLIN",
8804             metacpan_explorer => "https://explorer.metacpan.org/?url=/author/DUANLIN",
8805             repology => "https://repology.org/maintainer/DUANLIN%40cpan",
8806             },
8807             modules => {
8808             "Image::VisualConfirmation" => {
8809             abstract => "Add anti-spam visual confirmation/challenge\nto your web forms",
8810             archive => "Image-VisualConfirmation-0.4.tar.gz",
8811             author => "DUANLIN",
8812             authorized => 1,
8813             changes_file => "Changes",
8814             checksum_md5 => "f5c2f87811b59d18567aeee3c253d549",
8815             checksum_sha256 => "4fe34d9b1cc75c132b9c99d70fefe717fab50b7e9077be5c572d40b97ea36a97",
8816             contributors => [qw(
8817             TEDDYSAPUTRA TEDDYSAPUTRA YOICHIFUJITA SIEUNJANG
8818             RACHELSEGAL TAKASHIISHIKAWA YOHEIFUJIWARA DOHYUNNCHOI
8819             ANTHONYGOYETTE
8820             )],
8821             date => "2011-01-26T22:46:20",
8822             dependency => [
8823             {
8824             module => "Test::Exception",
8825             phase => "build",
8826             relationship => "requires",
8827             version => 0,
8828             },
8829             {
8830             module => "Imager",
8831             phase => "runtime",
8832             relationship => "requires",
8833             version => 0.48,
8834             },
8835             {
8836             module => "Path::Class",
8837             phase => "runtime",
8838             relationship => "requires",
8839             version => 0,
8840             },
8841             ],
8842             deprecated => 0,
8843             distribution => "Image-VisualConfirmation",
8844             download_url => "https://cpan.metacpan.org/authors/id/D/DU/DUANLIN/Image-VisualConfirmation-0.4.tar.gz",
8845             first => 0,
8846             id => "ubdnjmcDtn8BQuwHA1MNK5RprYQ",
8847             license => ["perl_5"],
8848             likers => [qw( SAMANDERSON DUANLIN )],
8849             likes => 2,
8850             main_module => "Image::VisualConfirmation",
8851             maturity => "released",
8852             metadata => {
8853             abstract => "Add anti-spam visual confirmation/challenge\nto your web forms",
8854             author => ["Michele Beltrame, C<mb\@italpro.net>"],
8855             dynamic_config => 1,
8856             generated_by => "Module::Build version 0.2805, CPAN::Meta::Converter version 2.150005",
8857             license => ["perl_5"],
8858             "meta-spec" => {
8859             url => "http://search.cpan.org/perldoc?CPAN::Meta::Spec",
8860             version => 2,
8861             },
8862             name => "Image-VisualConfirmation",
8863             no_index => {
8864             directory => [qw( t xt inc local perl5 fatlib example blib examples eg )],
8865             },
8866             prereqs => {
8867             build => {
8868             requires => { "Test::Exception" => 0 },
8869             },
8870             runtime => {
8871             requires => { Imager => 0.48, "Path::Class" => 0 },
8872             },
8873             },
8874             provides => {
8875             "Image::VisualConfirmation" => { file => "lib/Image/VisualConfirmation.pm", version => 0.03 },
8876             },
8877             release_status => "stable",
8878             resources => { license => ["http://dev.perl.org/licenses/"] },
8879             version => 0.03,
8880             },
8881             name => "Image-VisualConfirmation",
8882             package => "Image::VisualConfirmation",
8883             provides => ["Image::VisualConfirmation"],
8884             release => "Image-VisualConfirmation-0.4",
8885             resources => { license => ["http://dev.perl.org/licenses/"] },
8886             stat => { gid => 1009, mode => 33188, mtime => 1296081980, size => 53220, uid => 1009 },
8887             status => "backpan",
8888             tests => { fail => 176, na => 2, pass => 5, unknown => 4 },
8889             user => "PeHBWg7SILtB6ArEipT4P0",
8890             version => 0.4,
8891             version_numified => "0.400",
8892             },
8893             },
8894             name => "Duan Lin",
8895             pauseid => "DUANLIN",
8896             profile => [{ id => 1285349, name => "stackoverflow" }],
8897             updated => "2023-09-24T15:50:29",
8898             user => "PeHBWg7SILtB6ArEipT4P0",
8899             },
8900             ELAINAREYES => {
8901             asciiname => "Elaina Reyes",
8902             city => "San Francisco",
8903             contributions => [
8904             {
8905             distribution => "Bundle-Catalyst",
8906             pauseid => "ELAINAREYES",
8907             release_author => "ALEXANDRAPOWELL",
8908             release_name => "Bundle-Catalyst-2.58",
8909             },
8910             {
8911             distribution => "Net-Rapidshare",
8912             pauseid => "ELAINAREYES",
8913             release_author => "RACHELSEGAL",
8914             release_name => "Net-Rapidshare-v0.5.18",
8915             },
8916             {
8917             distribution => "Compress-Bzip2",
8918             pauseid => "ELAINAREYES",
8919             release_author => "DOHYUNNCHOI",
8920             release_name => "Compress-Bzip2-v2.0.11",
8921             },
8922             {
8923             distribution => "Business-CN-IdentityCard",
8924             pauseid => "ELAINAREYES",
8925             release_author => "SAMANDERSON",
8926             release_name => "Business-CN-IdentityCard-v1.25.13",
8927             },
8928             {
8929             distribution => "Devel-SmallProf",
8930             pauseid => "ELAINAREYES",
8931             release_author => "RANGSANSUNTHORN",
8932             release_name => "Devel-SmallProf-v2.41.7",
8933             },
8934             ],
8935             country => "US",
8936             email => ["elaina.reyes\@example.us"],
8937             favorites => [
8938             {
8939             author => "HUWANATIENZA",
8940             date => "2006-04-21T14:08:42",
8941             distribution => "Math-SymbolicX-Error",
8942             },
8943             {
8944             author => "ALEXANDRAPOWELL",
8945             date => "2005-11-19T20:19:20",
8946             distribution => "Bundle-Catalyst",
8947             },
8948             ],
8949             gravatar_url => "https://secure.gravatar.com/avatar/VMy6ad4vDW2sn6FcC6CB0tLi0YXJY56d?s=130&d=identicon",
8950             is_pause_custodial_account => 0,
8951             links => {
8952             backpan_directory => "https://cpan.metacpan.org/authors/id/E/EL/ELAINAREYES",
8953             cpan_directory => "http://cpan.org/authors/id/E/EL/ELAINAREYES",
8954             cpantesters_matrix => "http://matrix.cpantesters.org/?author=ELAINAREYES",
8955             cpantesters_reports => "http://cpantesters.org/author/E/ELAINAREYES.html",
8956             cpants => "http://cpants.cpanauthors.org/author/ELAINAREYES",
8957             metacpan_explorer => "https://explorer.metacpan.org/?url=/author/ELAINAREYES",
8958             repology => "https://repology.org/maintainer/ELAINAREYES%40cpan",
8959             },
8960             modules => {
8961             "DBIx::Custom" => {
8962             abstract => "DBI interface, having hash parameter binding and filtering system",
8963             archive => "DBIx-Custom-2.37.tar.gz",
8964             author => "ELAINAREYES",
8965             authorized => 1,
8966             changes_file => "Changes",
8967             checksum_md5 => "42062a7f205a4e6fef2722f09231c4a1",
8968             checksum_sha256 => "83c295343f48ebc03029139082345c93527ffe5831820f99e4a72ee67ef186a5",
8969             contributors => [qw(
8970             ALEXANDRAPOWELL YOICHIFUJITA ENGYONGCHANG SIEUNJANG
8971             OLGABOGDANOVA WANTAN MINSUNGJUNG
8972             )],
8973             date => "2010-10-20T15:01:35",
8974             dependency => [
8975             {
8976             module => "Test::More",
8977             phase => "runtime",
8978             relationship => "requires",
8979             version => 0,
8980             },
8981             {
8982             module => "Object::Simple",
8983             phase => "runtime",
8984             relationship => "requires",
8985             version => 3.0201,
8986             },
8987             {
8988             module => "DBD::SQLite",
8989             phase => "runtime",
8990             relationship => "requires",
8991             version => 1.25,
8992             },
8993             {
8994             module => "DBI",
8995             phase => "runtime",
8996             relationship => "requires",
8997             version => 1.605,
8998             },
8999             {
9000             module => "ExtUtils::MakeMaker",
9001             phase => "configure",
9002             relationship => "requires",
9003             version => 0,
9004             },
9005             ],
9006             deprecated => 0,
9007             distribution => "DBIx-Custom",
9008             download_url => "https://cpan.metacpan.org/authors/id/E/EL/ELAINAREYES/DBIx-Custom-2.37.tar.gz",
9009             first => 0,
9010             id => "g7562_4h9d693lxvc_cgEOTJAZk",
9011             license => ["unknown"],
9012             likers => [],
9013             likes => 0,
9014             main_module => "DBIx::Custom",
9015             maturity => "released",
9016             metadata => {
9017             abstract => "unknown",
9018             author => ["unknown"],
9019             dynamic_config => 1,
9020             generated_by => "ExtUtils::MakeMaker version 6.48, CPAN::Meta::Converter version 2.150005",
9021             license => ["unknown"],
9022             "meta-spec" => {
9023             url => "http://search.cpan.org/perldoc?CPAN::Meta::Spec",
9024             version => 2,
9025             },
9026             name => "DBIx-Custom",
9027             no_index => {
9028             directory => [qw( t inc t xt inc local perl5 fatlib example blib examples eg )],
9029             },
9030             prereqs => {
9031             configure => {
9032             requires => { "ExtUtils::MakeMaker" => 0 },
9033             },
9034             runtime => {
9035             requires => {
9036             "DBD::SQLite" => 1.25,
9037             DBI => 1.605,
9038             "Object::Simple" => 3.0201,
9039             "Test::More" => 0,
9040             },
9041             },
9042             },
9043             release_status => "stable",
9044             version => 0.1619,
9045             },
9046             name => "DBIx-Custom",
9047             package => "DBIx::Custom",
9048             provides => [qw(
9049             DBIx::Custom DBIx::Custom::MySQL DBIx::Custom::Query
9050             DBIx::Custom::QueryBuilder
9051             DBIx::Custom::QueryBuilder::TagProcessors
9052             DBIx::Custom::Result DBIx::Custom::SQLite
9053             )],
9054             release => "DBIx-Custom-2.37",
9055             resources => {},
9056             stat => { gid => 1009, mode => 33204, mtime => 1287586895, size => 27195, uid => 1009 },
9057             status => "backpan",
9058             tests => { fail => 0, na => 1, pass => 114, unknown => 0 },
9059             user => "zAZOeZhFZGTZ2qO28lKAnR",
9060             version => 2.37,
9061             version_numified => "2.370",
9062             },
9063             "PAR::Dist::InstallPPD::GUI" => {
9064             abstract => "GUI frontend for PAR::Dist::InstallPPD",
9065             archive => "PAR-Dist-InstallPPD-GUI-2.42.tar.gz",
9066             author => "ELAINAREYES",
9067             authorized => 1,
9068             changes_file => "Changes",
9069             checksum_md5 => "2105e849d205d72ade8b9d56bcbc36c1",
9070             checksum_sha256 => "c7aa576af796db3b0441297b9a2331b7f443f10ebc957d1d2d97c8daea64872e",
9071             contributors => [qw(
9072             HUWANATIENZA RACHELSEGAL TAKASHIISHIKAWA TAKASHIISHIKAWA
9073             HEHERSONDEGUZMAN DOHYUNNCHOI WANTAN ALESSANDROBAUMANN
9074             )],
9075             date => "2006-12-22T16:13:28",
9076             dependency => [
9077             {
9078             module => "ExtUtils::MakeMaker",
9079             phase => "build",
9080             relationship => "requires",
9081             version => 6.11,
9082             },
9083             {
9084             module => "PAR::Dist::FromPPD",
9085             phase => "runtime",
9086             relationship => "requires",
9087             version => 0.02,
9088             },
9089             {
9090             module => "PAR::Dist::InstallPPD",
9091             phase => "runtime",
9092             relationship => "requires",
9093             version => 0.01,
9094             },
9095             {
9096             module => "ExtUtils::Install",
9097             phase => "runtime",
9098             relationship => "requires",
9099             version => 0,
9100             },
9101             {
9102             module => "File::UserConfig",
9103             phase => "runtime",
9104             relationship => "requires",
9105             version => 0,
9106             },
9107             {
9108             module => "Tk",
9109             phase => "runtime",
9110             relationship => "requires",
9111             version => 0,
9112             },
9113             {
9114             module => "Config::IniFiles",
9115             phase => "runtime",
9116             relationship => "requires",
9117             version => 0,
9118             },
9119             {
9120             module => "Tk::ROText",
9121             phase => "runtime",
9122             relationship => "requires",
9123             version => 0,
9124             },
9125             {
9126             module => "perl",
9127             phase => "runtime",
9128             relationship => "requires",
9129             version => "v5.6.0",
9130             },
9131             {
9132             module => "IPC::Run",
9133             phase => "runtime",
9134             relationship => "requires",
9135             version => "0.80",
9136             },
9137             ],
9138             deprecated => 0,
9139             distribution => "PAR-Dist-InstallPPD-GUI",
9140             download_url => "https://cpan.metacpan.org/authors/id/E/EL/ELAINAREYES/PAR-Dist-InstallPPD-GUI-2.42.tar.gz",
9141             first => 0,
9142             id => "0273Sfwy_pNKXl0BuTgZ00M0WOE",
9143             license => ["perl_5"],
9144             likers => [],
9145             likes => 0,
9146             main_module => "PAR::Dist::InstallPPD::GUI",
9147             maturity => "released",
9148             metadata => {
9149             abstract => "GUI frontend for PAR::Dist::InstallPPD",
9150             author => ["Steffen Mueller (smueller\@cpan.org)"],
9151             dynamic_config => 1,
9152             generated_by => "Module::Install version 0.64, CPAN::Meta::Converter version 2.150005",
9153             license => ["perl_5"],
9154             "meta-spec" => {
9155             url => "http://search.cpan.org/perldoc?CPAN::Meta::Spec",
9156             version => 2,
9157             },
9158             name => "PAR-Dist-InstallPPD-GUI",
9159             no_index => {
9160             directory => [qw( inc t t xt inc local perl5 fatlib example blib examples eg )],
9161             },
9162             prereqs => {
9163             build => {
9164             requires => { "ExtUtils::MakeMaker" => 6.11 },
9165             },
9166             runtime => {
9167             requires => {
9168             "Config::IniFiles" => 0,
9169             "ExtUtils::Install" => 0,
9170             "File::UserConfig" => 0,
9171             "IPC::Run" => "0.80",
9172             "PAR::Dist::FromPPD" => 0.02,
9173             "PAR::Dist::InstallPPD" => 0.01,
9174             perl => "v5.6.0",
9175             Tk => 0,
9176             "Tk::ROText" => 0,
9177             },
9178             },
9179             },
9180             release_status => "stable",
9181             version => 0.04,
9182             },
9183             name => "PAR-Dist-InstallPPD-GUI",
9184             package => "PAR::Dist::InstallPPD::GUI",
9185             provides => [qw(
9186             PAR::Dist::InstallPPD::GUI
9187             PAR::Dist::InstallPPD::GUI::Config
9188             PAR::Dist::InstallPPD::GUI::Install
9189             PAR::Dist::InstallPPD::GUI::Installed
9190             )],
9191             release => "PAR-Dist-InstallPPD-GUI-2.42",
9192             resources => {},
9193             stat => { gid => 1009, mode => 33188, mtime => 1166804008, size => 16009, uid => 1009 },
9194             status => "backpan",
9195             tests => undef,
9196             user => "zAZOeZhFZGTZ2qO28lKAnR",
9197             version => 2.42,
9198             version_numified => "2.420",
9199             },
9200             },
9201             name => "Elaina Reyes",
9202             pauseid => "ELAINAREYES",
9203             profile => [{ id => 956664, name => "stackoverflow" }],
9204             updated => "2023-09-24T15:50:29",
9205             user => "zAZOeZhFZGTZ2qO28lKAnR",
9206             },
9207             ENGYONGCHANG => {
9208             asciiname => "Eng Yong Chang",
9209             city => "Singapore",
9210             contributions => [
9211             {
9212             distribution => "Net-Rapidshare",
9213             pauseid => "ENGYONGCHANG",
9214             release_author => "RACHELSEGAL",
9215             release_name => "Net-Rapidshare-v0.5.18",
9216             },
9217             {
9218             distribution => "FileHandle-Rollback",
9219             pauseid => "ENGYONGCHANG",
9220             release_author => "AFONASEIANTONOV",
9221             release_name => "FileHandle-Rollback-v0.88.10",
9222             },
9223             {
9224             distribution => "CGI-DataObjectMapper",
9225             pauseid => "ENGYONGCHANG",
9226             release_author => "DOHYUNNCHOI",
9227             release_name => "CGI-DataObjectMapper-0.37",
9228             },
9229             {
9230             distribution => "HTML_Month.v6a",
9231             pauseid => "ENGYONGCHANG",
9232             release_author => "BUDAEJUNG",
9233             release_name => "HTML_Month.v6a-v0.35.11",
9234             },
9235             {
9236             distribution => "Geo-Postcodes-DK",
9237             pauseid => "ENGYONGCHANG",
9238             release_author => "WEEWANG",
9239             release_name => "Geo-Postcodes-DK-2.13",
9240             },
9241             {
9242             distribution => "DBIx-Custom",
9243             pauseid => "ENGYONGCHANG",
9244             release_author => "ELAINAREYES",
9245             release_name => "DBIx-Custom-2.37",
9246             },
9247             {
9248             distribution => "Crypt-OpenSSL-CA",
9249             pauseid => "ENGYONGCHANG",
9250             release_author => "AFONASEIANTONOV",
9251             release_name => "Crypt-OpenSSL-CA-1.95",
9252             },
9253             {
9254             distribution => "POE-Component-Client-Keepalive",
9255             pauseid => "ENGYONGCHANG",
9256             release_author => "HELEWISEGIROUX",
9257             release_name => "POE-Component-Client-Keepalive-1.69",
9258             },
9259             {
9260             distribution => "CGI-DataObjectMapper",
9261             pauseid => "ENGYONGCHANG",
9262             release_author => "DOHYUNNCHOI",
9263             release_name => "CGI-DataObjectMapper-0.37",
9264             },
9265             {
9266             distribution => "Task-Dancer",
9267             pauseid => "ENGYONGCHANG",
9268             release_author => "LILLIANSTEWART",
9269             release_name => "Task-Dancer-2.83",
9270             },
9271             {
9272             distribution => "Tk-TIFF",
9273             pauseid => "ENGYONGCHANG",
9274             release_author => "YOHEIFUJIWARA",
9275             release_name => "Tk-TIFF-2.72",
9276             },
9277             ],
9278             country => "SG",
9279             email => ["eng.yong.chang\@example.sg"],
9280             favorites => [
9281             {
9282             author => "ALEXANDRAPOWELL",
9283             date => "2005-11-19T20:19:20",
9284             distribution => "Bundle-Catalyst",
9285             },
9286             {
9287             author => "YOHEIFUJIWARA",
9288             date => "2003-07-15T07:18:15",
9289             distribution => "DBD-Trini",
9290             },
9291             {
9292             author => "DOHYUNNCHOI",
9293             date => "2009-10-29T11:22:47",
9294             distribution => "CGI-DataObjectMapper",
9295             },
9296             {
9297             author => "HEHERSONDEGUZMAN",
9298             date => "2011-01-31T04:31:42",
9299             distribution => "Text-Record-Deduper",
9300             },
9301             ],
9302             gravatar_url => "https://secure.gravatar.com/avatar/5TG15aisVkTTJuNkiHFa93zCDFCvkw6R?s=130&d=identicon",
9303             is_pause_custodial_account => 0,
9304             links => {
9305             backpan_directory => "https://cpan.metacpan.org/authors/id/E/EN/ENGYONGCHANG",
9306             cpan_directory => "http://cpan.org/authors/id/E/EN/ENGYONGCHANG",
9307             cpantesters_matrix => "http://matrix.cpantesters.org/?author=ENGYONGCHANG",
9308             cpantesters_reports => "http://cpantesters.org/author/E/ENGYONGCHANG.html",
9309             cpants => "http://cpants.cpanauthors.org/author/ENGYONGCHANG",
9310             metacpan_explorer => "https://explorer.metacpan.org/?url=/author/ENGYONGCHANG",
9311             repology => "https://repology.org/maintainer/ENGYONGCHANG%40cpan",
9312             },
9313             modules => {
9314             "DBIx::Custom::Basic" => {
9315             abstract => "DBIx::Custom basic class",
9316             archive => "DBIx-Custom-Basic-v0.61.9.tar.gz",
9317             author => "ENGYONGCHANG",
9318             authorized => 1,
9319             changes_file => "Changes",
9320             checksum_md5 => "2630dbb6b1caad518475c6983cda00c7",
9321             checksum_sha256 => "86f68b2d0789934aa6b0202345e9807c5b650f8030b55d0d669ef25293fa3f1f",
9322             contributors => ["BUDAEJUNG"],
9323             date => "2009-11-08T04:18:30",
9324             dependency => [
9325             {
9326             module => "Test::More",
9327             phase => "build",
9328             relationship => "requires",
9329             version => 0,
9330             },
9331             {
9332             module => "Time::Piece",
9333             phase => "runtime",
9334             relationship => "recommends",
9335             version => 1.15,
9336             },
9337             {
9338             module => "DBIx::Custom",
9339             phase => "runtime",
9340             relationship => "requires",
9341             version => 0.0101,
9342             },
9343             ],
9344             deprecated => 0,
9345             distribution => "DBIx-Custom-Basic",
9346             download_url => "https://cpan.metacpan.org/authors/id/E/EN/ENGYONGCHANG/DBIx-Custom-Basic-v0.61.9.tar.gz",
9347             first => 1,
9348             id => "oKf3t0pXHXa6mZ_4sUZSaSMKuXg",
9349             license => ["perl_5"],
9350             likers => [],
9351             likes => 0,
9352             main_module => "DBIx::Custom::Basic",
9353             maturity => "released",
9354             metadata => {
9355             abstract => "DBIx::Custom basic class",
9356             author => ["Yuki Kimoto <kimoto.yuki\@gmail.com>"],
9357             dynamic_config => 1,
9358             generated_by => "Module::Build version 0.31012, CPAN::Meta::Converter version 2.150005",
9359             license => ["perl_5"],
9360             "meta-spec" => {
9361             url => "http://search.cpan.org/perldoc?CPAN::Meta::Spec",
9362             version => 2,
9363             },
9364             name => "DBIx-Custom-Basic",
9365             no_index => {
9366             directory => [qw( t xt inc local perl5 fatlib example blib examples eg )],
9367             },
9368             prereqs => {
9369             build => {
9370             requires => { "Test::More" => 0 },
9371             },
9372             runtime => {
9373             recommends => { "Time::Piece" => 1.15 },
9374             requires => { "DBIx::Custom" => 0.0101 },
9375             },
9376             },
9377             provides => {
9378             "DBIx::Custom::Basic" => { file => "lib/DBIx/Custom/Basic.pm", version => 0.0101 },
9379             },
9380             release_status => "stable",
9381             resources => {},
9382             version => 0.0101,
9383             },
9384             name => "DBIx-Custom-Basic",
9385             package => "DBIx::Custom::Basic",
9386             provides => ["DBIx::Custom::Basic"],
9387             release => "DBIx-Custom-Basic-v0.61.9",
9388             resources => {},
9389             stat => { gid => 1009, mode => 33204, mtime => 1257653910, size => 3409, uid => 1009 },
9390             status => "backpan",
9391             tests => { fail => 1, na => 0, pass => 57, unknown => 1 },
9392             user => "RrqweA6PwuCJLJN4M1MROm",
9393             version => "v0.61.9",
9394             version_numified => 0.061009,
9395             },
9396             "IPC::Door" => {
9397             abstract => "Interface to Solaris (>= 2.6) Door library",
9398             archive => "IPC-Door-v1.92.3.tar.gz",
9399             author => "ENGYONGCHANG",
9400             authorized => 1,
9401             changes_file => "Changes",
9402             checksum_md5 => "36cf5008678f26175478788cae95bbb0",
9403             checksum_sha256 => "11a382884e56efbd7354c678180a2b75e11c5b3f655716ea7f483b61ebfe9bb6",
9404             contributors => [qw( CHRISTIANREYES WANTAN WANTAN DUANLIN )],
9405             date => "2004-05-01T16:37:28",
9406             dependency => [],
9407             deprecated => 0,
9408             distribution => "IPC-Door",
9409             download_url => "https://cpan.metacpan.org/authors/id/E/EN/ENGYONGCHANG/IPC-Door-v1.92.3.tar.gz",
9410             first => 0,
9411             id => "fjo5CM1_9HqX45NqRYTsT69AeBw",
9412             license => ["unknown"],
9413             likers => [],
9414             likes => 0,
9415             main_module => "IPC::Door",
9416             maturity => "released",
9417             metadata => {
9418             abstract => "unknown",
9419             author => ["unknown"],
9420             dynamic_config => 1,
9421             generated_by => "ExtUtils::MakeMaker version 6.17, CPAN::Meta::Converter version 2.150005",
9422             license => ["unknown"],
9423             "meta-spec" => {
9424             url => "http://search.cpan.org/perldoc?CPAN::Meta::Spec",
9425             version => 2,
9426             },
9427             name => "IPC-Door",
9428             no_index => {
9429             directory => [qw( t xt inc local perl5 fatlib example blib examples eg )],
9430             },
9431             prereqs => {},
9432             release_status => "stable",
9433             version => 0.06,
9434             x_installdirs => "site",
9435             x_version_from => "Door.pm",
9436             },
9437             name => "IPC-Door",
9438             package => "IPC::Door",
9439             provides => [qw( IPC::Door IPC::Door::Client IPC::Door::Server )],
9440             release => "IPC-Door-v1.92.3",
9441             resources => {},
9442             stat => { gid => 1009, mode => 33204, mtime => 1083429448, size => 24346, uid => 1009 },
9443             status => "backpan",
9444             tests => undef,
9445             user => "RrqweA6PwuCJLJN4M1MROm",
9446             version => "v1.92.3",
9447             version_numified => 1.092003,
9448             },
9449             "Net::AIM" => {
9450             abstract => "Perl extension for AOL Instant Messenger TOC protocol",
9451             archive => "Net-AIM-v1.39.1.tar.gz",
9452             author => "ENGYONGCHANG",
9453             authorized => 1,
9454             changes_file => "Changes",
9455             checksum_md5 => "045b692a7e9eafb5a7d901cf9a422e33",
9456             checksum_sha256 => "afbbbd7d13015ed7c8fcef96e1a233f40d6bd963360af3cccf49b488a51ceb3b",
9457             contributors => ["HEHERSONDEGUZMAN"],
9458             date => "2001-10-26T05:15:43",
9459             dependency => [],
9460             deprecated => 0,
9461             distribution => "Net-AIM",
9462             download_url => "https://cpan.metacpan.org/authors/id/E/EN/ENGYONGCHANG/Net-AIM-v1.39.1.tar.gz",
9463             first => 0,
9464             id => "rqQdTLatQ_oG7pfMFkH5iTDyeN4",
9465             license => ["unknown"],
9466             likers => ["TAKAONAKANISHI"],
9467             likes => 1,
9468             main_module => "Net::AIM",
9469             maturity => "released",
9470             metadata => {
9471             abstract => "unknown",
9472             author => ["unknown"],
9473             dynamic_config => 1,
9474             generated_by => "CPAN::Meta::Converter version 2.150005",
9475             license => ["unknown"],
9476             "meta-spec" => {
9477             url => "http://search.cpan.org/perldoc?CPAN::Meta::Spec",
9478             version => 2,
9479             },
9480             name => "Net-AIM",
9481             no_index => {
9482             directory => [qw( t xt inc local perl5 fatlib example blib examples eg )],
9483             },
9484             prereqs => {},
9485             release_status => "stable",
9486             version => "1.20",
9487             },
9488             name => "Net-AIM",
9489             package => "Net::AIM",
9490             provides => [qw( Net::AIM Net::AIM::Connection Net::AIM::Event )],
9491             release => "Net-AIM-v1.39.1",
9492             resources => {},
9493             stat => { gid => 1009, mode => 33204, mtime => 1004073343, size => 22103, uid => 1009 },
9494             status => "backpan",
9495             tests => undef,
9496             user => "RrqweA6PwuCJLJN4M1MROm",
9497             version => "v1.39.1",
9498             version_numified => 1.039001,
9499             },
9500             "PDF::Create" => {
9501             abstract => "create PDF files",
9502             archive => "perl-pdf-v1.90.3.tar.gz",
9503             author => "ENGYONGCHANG",
9504             authorized => 0,
9505             changes_file => "Changes",
9506             checksum_md5 => "4410ee7025a69cb56dac9cc98a09ba8f",
9507             checksum_sha256 => "339a8c37161f405a21155283a9196342108077db80b0465c487c3d4307583477",
9508             date => "2007-02-24T20:29:02",
9509             dependency => [],
9510             deprecated => 0,
9511             distribution => "perl-pdf",
9512             download_url => "https://cpan.metacpan.org/authors/id/E/EN/ENGYONGCHANG/perl-pdf-v1.90.3.tar.gz",
9513             first => 1,
9514             id => "WHYORFLWreKC4YAg4SiRNbKyKEI",
9515             license => ["unknown"],
9516             likers => ["SAMANDERSON"],
9517             likes => 1,
9518             main_module => "PDF::Create",
9519             maturity => "released",
9520             metadata => {
9521             abstract => "unknown",
9522             author => ["unknown"],
9523             dynamic_config => 1,
9524             generated_by => "ExtUtils::MakeMaker version 6.31, CPAN::Meta::Converter version 2.150005",
9525             license => ["unknown"],
9526             "meta-spec" => {
9527             url => "http://search.cpan.org/perldoc?CPAN::Meta::Spec",
9528             version => 2,
9529             },
9530             name => "PDF-Create",
9531             no_index => {
9532             directory => [qw( t xt inc local perl5 fatlib example blib examples eg )],
9533             },
9534             prereqs => {},
9535             release_status => "stable",
9536             version => 0.06,
9537             },
9538             name => "perl-pdf",
9539             package => "PDF::Create",
9540             provides => [],
9541             release => "perl-pdf-v1.90.3",
9542             resources => {},
9543             stat => { gid => 1009, mode => 33188, mtime => 1172348942, size => 32249, uid => 1009 },
9544             status => "backpan",
9545             tests => undef,
9546             user => "RrqweA6PwuCJLJN4M1MROm",
9547             version => "v1.90.3",
9548             version_numified => 1.090003,
9549             },
9550             "Tie::FileLRUCache" => {
9551             abstract => "A lightweight but robust filesystem based persistent LRU cache",
9552             archive => "Tie-FileLRUCache-v1.92.8.tar.gz",
9553             author => "ENGYONGCHANG",
9554             authorized => 1,
9555             changes_file => "Changes",
9556             checksum_md5 => "cbb655ca18844dde054aa973d678cdc2",
9557             checksum_sha256 => "3b75e9c3a41c26723a116f0b6d0d88bb5f973b2772211c285b897bd47a808895",
9558             contributors => [qw( OLGABOGDANOVA DUANLIN )],
9559             date => "1999-06-16T21:05:30",
9560             dependency => [],
9561             deprecated => 0,
9562             distribution => "Tie-FileLRUCache",
9563             download_url => "https://cpan.metacpan.org/authors/id/E/EN/ENGYONGCHANG/Tie-FileLRUCache-v1.92.8.tar.gz",
9564             first => 1,
9565             id => "B_eqkfSlJK9lLIo3mQR_aVKT9QE",
9566             license => ["unknown"],
9567             likers => ["OLGABOGDANOVA"],
9568             likes => 1,
9569             main_module => "Tie::FileLRUCache",
9570             maturity => "released",
9571             metadata => {
9572             abstract => "unknown",
9573             author => ["unknown"],
9574             dynamic_config => 1,
9575             generated_by => "CPAN::Meta::Converter version 2.150005",
9576             license => ["unknown"],
9577             "meta-spec" => {
9578             url => "http://search.cpan.org/perldoc?CPAN::Meta::Spec",
9579             version => 2,
9580             },
9581             name => "Tie-FileLRUCache",
9582             no_index => {
9583             directory => [qw( t xt inc local perl5 fatlib example blib examples eg )],
9584             },
9585             prereqs => {},
9586             release_status => "stable",
9587             version => "1.00",
9588             },
9589             name => "Tie-FileLRUCache",
9590             package => "Tie::FileLRUCache",
9591             provides => ["Tie::FileLRUCache"],
9592             release => "Tie-FileLRUCache-v1.92.8",
9593             resources => {},
9594             stat => { gid => 1009, mode => 33188, mtime => 929567130, size => 5471, uid => 1009 },
9595             status => "backpan",
9596             tests => undef,
9597             user => "RrqweA6PwuCJLJN4M1MROm",
9598             version => "v1.92.8",
9599             version_numified => 1.092008,
9600             },
9601             },
9602             name => "Eng Yong Chang",
9603             pauseid => "ENGYONGCHANG",
9604             profile => [{ id => 619562, name => "stackoverflow" }],
9605             updated => "2023-09-24T15:50:29",
9606             user => "RrqweA6PwuCJLJN4M1MROm",
9607             },
9608             FLORABARRETT => {
9609             asciiname => "Flora Barrett",
9610             city => "London",
9611             contributions => [
9612             {
9613             distribution => "Task-App-Physics-ParticleMotion",
9614             pauseid => "FLORABARRETT",
9615             release_author => "HEHERSONDEGUZMAN",
9616             release_name => "Task-App-Physics-ParticleMotion-v2.3.4",
9617             },
9618             {
9619             distribution => "Catalyst",
9620             pauseid => "FLORABARRETT",
9621             release_author => "YOHEIFUJIWARA",
9622             release_name => "Catalyst-v1.92.2",
9623             },
9624             {
9625             distribution => "XML-Twig",
9626             pauseid => "FLORABARRETT",
9627             release_author => "CHRISTIANREYES",
9628             release_name => "XML-Twig-v0.68.15",
9629             },
9630             {
9631             distribution => "Facebook-Graph",
9632             pauseid => "FLORABARRETT",
9633             release_author => "TAKASHIISHIKAWA",
9634             release_name => "Facebook-Graph-v0.38.18",
9635             },
9636             {
9637             distribution => "FileHandle-Rollback",
9638             pauseid => "FLORABARRETT",
9639             release_author => "AFONASEIANTONOV",
9640             release_name => "FileHandle-Rollback-v0.88.10",
9641             },
9642             {
9643             distribution => "DBIx-Custom-SQLite",
9644             pauseid => "FLORABARRETT",
9645             release_author => "WANTAN",
9646             release_name => "DBIx-Custom-SQLite-0.2",
9647             },
9648             {
9649             distribution => "math-image",
9650             pauseid => "FLORABARRETT",
9651             release_author => "SAMANDERSON",
9652             release_name => "math-image-v2.97.1",
9653             },
9654             {
9655             distribution => "giza",
9656             pauseid => "FLORABARRETT",
9657             release_author => "RANGSANSUNTHORN",
9658             release_name => "giza-0.35",
9659             },
9660             ],
9661             country => "UK",
9662             email => ["flora.barrett\@example.uk"],
9663             favorites => [
9664             {
9665             author => "TAKASHIISHIKAWA",
9666             date => "2002-03-29T09:50:49",
9667             distribution => "DBIx-dbMan",
9668             },
9669             ],
9670             gravatar_url => "https://secure.gravatar.com/avatar/LGpdWqlvgc6p6SgUEZluCc3eDVH5zShL?s=130&d=identicon",
9671             is_pause_custodial_account => 0,
9672             links => {
9673             backpan_directory => "https://cpan.metacpan.org/authors/id/F/FL/FLORABARRETT",
9674             cpan_directory => "http://cpan.org/authors/id/F/FL/FLORABARRETT",
9675             cpantesters_matrix => "http://matrix.cpantesters.org/?author=FLORABARRETT",
9676             cpantesters_reports => "http://cpantesters.org/author/F/FLORABARRETT.html",
9677             cpants => "http://cpants.cpanauthors.org/author/FLORABARRETT",
9678             metacpan_explorer => "https://explorer.metacpan.org/?url=/author/FLORABARRETT",
9679             repology => "https://repology.org/maintainer/FLORABARRETT%40cpan",
9680             },
9681             modules => {
9682             "Date::EzDate" => {
9683             abstract => "Date manipulation made easy.",
9684             archive => "Date-EzDate-0.51.tar.gz",
9685             author => "FLORABARRETT",
9686             authorized => 1,
9687             changes_file => "Changes",
9688             checksum_md5 => "6960e67e20687f24542be53a9d60ff2d",
9689             checksum_sha256 => "9e2b714fb4bf89fdedb17662ab098d96f4f20b57e3143005095cac1646cfb1ab",
9690             contributors => [qw( ALEXANDRAPOWELL RACHELSEGAL ANTHONYGOYETTE )],
9691             date => "2002-02-10T02:56:54",
9692             dependency => [],
9693             deprecated => 0,
9694             distribution => "Date-EzDate",
9695             download_url => "https://cpan.metacpan.org/authors/id/F/FL/FLORABARRETT/Date-EzDate-0.51.tar.gz",
9696             first => 0,
9697             id => "N4GYRNfeeZp80xE2RxaDuCghE58",
9698             license => ["unknown"],
9699             likers => [qw( TEDDYSAPUTRA YOHEIFUJIWARA ANTHONYGOYETTE RANGSANSUNTHORN )],
9700             likes => 4,
9701             main_module => "Date::EzDate",
9702             maturity => "released",
9703             metadata => {
9704             abstract => "unknown",
9705             author => ["unknown"],
9706             dynamic_config => 1,
9707             generated_by => "CPAN::Meta::Converter version 2.150005",
9708             license => ["unknown"],
9709             "meta-spec" => {
9710             url => "http://search.cpan.org/perldoc?CPAN::Meta::Spec",
9711             version => 2,
9712             },
9713             name => "Date-EzDate",
9714             no_index => {
9715             directory => [qw( t xt inc local perl5 fatlib example blib examples eg )],
9716             },
9717             prereqs => {},
9718             release_status => "stable",
9719             version => 0.92,
9720             },
9721             name => "Date-EzDate",
9722             package => "Date::EzDate",
9723             provides => [qw( Date::EzDate Date::EzDateTie )],
9724             release => "Date-EzDate-0.51",
9725             resources => {},
9726             stat => { gid => 1009, mode => 33204, mtime => 1013309814, size => 12735, uid => 1009 },
9727             status => "backpan",
9728             tests => { fail => 0, na => 0, pass => 2, unknown => 0 },
9729             user => "DPredH46xq6IrOOG5vefND",
9730             version => 0.51,
9731             version_numified => "0.510",
9732             },
9733             "PAR::Filter::Squish" => {
9734             abstract => "PAR filter for reducing code size",
9735             archive => "PAR-Filter-Squish-v2.52.6.tar.gz",
9736             author => "FLORABARRETT",
9737             authorized => 1,
9738             changes_file => "Changes",
9739             checksum_md5 => "9cb308aeea786d5e567252d60f65d320",
9740             checksum_sha256 => "9b26961162bd48e8ae6b7473a73d11ae3d2a5d7d35b338bb86b84fdf64162adf",
9741             contributors => [qw( MARINAHOTZ MINSUNGJUNG )],
9742             date => "2006-08-14T15:09:30",
9743             dependency => [
9744             {
9745             module => "Perl::Squish",
9746             phase => "runtime",
9747             relationship => "requires",
9748             version => 0.02,
9749             },
9750             {
9751             module => "PAR",
9752             phase => "runtime",
9753             relationship => "requires",
9754             version => 0.94,
9755             },
9756             ],
9757             deprecated => 0,
9758             distribution => "PAR-Filter-Squish",
9759             download_url => "https://cpan.metacpan.org/authors/id/F/FL/FLORABARRETT/PAR-Filter-Squish-v2.52.6.tar.gz",
9760             first => 1,
9761             id => "8rf5z7807pOOIZRUaMo00RjTK28",
9762             license => ["perl_5"],
9763             likers => ["MARINAHOTZ"],
9764             likes => 1,
9765             main_module => "PAR::Filter::Squish",
9766             maturity => "released",
9767             metadata => {
9768             abstract => "PAR filter for reducing code size",
9769             author => ["Steffen Mueller (smueller\@cpan.org)"],
9770             dynamic_config => 1,
9771             generated_by => "Module::Install version 0.63, CPAN::Meta::Converter version 2.150005",
9772             license => ["perl_5"],
9773             "meta-spec" => {
9774             url => "http://search.cpan.org/perldoc?CPAN::Meta::Spec",
9775             version => 2,
9776             },
9777             name => "PAR-Filter-Squish",
9778             no_index => {
9779             directory => [qw( inc t t xt inc local perl5 fatlib example blib examples eg )],
9780             },
9781             prereqs => {
9782             runtime => {
9783             requires => { PAR => 0.94, "Perl::Squish" => 0.02 },
9784             },
9785             },
9786             release_status => "stable",
9787             version => 0.01,
9788             },
9789             name => "PAR-Filter-Squish",
9790             package => "PAR::Filter::Squish",
9791             provides => ["PAR::Filter::Squish"],
9792             release => "PAR-Filter-Squish-v2.52.6",
9793             resources => {},
9794             stat => { gid => 1009, mode => 33188, mtime => 1155568170, size => 11614, uid => 1009 },
9795             status => "backpan",
9796             tests => undef,
9797             user => "DPredH46xq6IrOOG5vefND",
9798             version => "v2.52.6",
9799             version_numified => 2.052006,
9800             },
9801             "PAR::Repository" => {
9802             abstract => "Create and modify PAR repositories",
9803             archive => "PAR-Repository-0.23.tar.gz",
9804             author => "FLORABARRETT",
9805             authorized => 1,
9806             changes_file => "Changes",
9807             checksum_md5 => "1db1f4a66cf63d08f0218427857e178b",
9808             checksum_sha256 => "d1ffedaddcdeb234c403eb819bb2f33c235007bf2443b4ff1399dfbeca54e7ab",
9809             contributors => [qw( RANGSANSUNTHORN MINSUNGJUNG )],
9810             date => "2006-09-14T08:29:46",
9811             dependency => [
9812             {
9813             module => "File::Temp",
9814             phase => "runtime",
9815             relationship => "requires",
9816             version => 0,
9817             },
9818             {
9819             module => "ExtUtils::Manifest",
9820             phase => "runtime",
9821             relationship => "requires",
9822             version => 0,
9823             },
9824             {
9825             module => "version",
9826             phase => "runtime",
9827             relationship => "requires",
9828             version => "0.50",
9829             },
9830             {
9831             module => "YAML::Syck",
9832             phase => "runtime",
9833             relationship => "requires",
9834             version => 0.62,
9835             },
9836             {
9837             module => "DBM::Deep",
9838             phase => "runtime",
9839             relationship => "requires",
9840             version => 0,
9841             },
9842             {
9843             module => "Pod::Text",
9844             phase => "runtime",
9845             relationship => "requires",
9846             version => 0,
9847             },
9848             {
9849             module => "File::Copy",
9850             phase => "runtime",
9851             relationship => "requires",
9852             version => 0,
9853             },
9854             {
9855             module => "PAR::Dist",
9856             phase => "runtime",
9857             relationship => "requires",
9858             version => 0.18,
9859             },
9860             {
9861             module => "File::Path",
9862             phase => "runtime",
9863             relationship => "requires",
9864             version => 0,
9865             },
9866             {
9867             module => "File::Spec",
9868             phase => "runtime",
9869             relationship => "requires",
9870             version => 0,
9871             },
9872             {
9873             module => "Archive::Zip",
9874             phase => "runtime",
9875             relationship => "requires",
9876             version => 0,
9877             },
9878             ],
9879             deprecated => 0,
9880             distribution => "PAR-Repository",
9881             download_url => "https://cpan.metacpan.org/authors/id/F/FL/FLORABARRETT/PAR-Repository-0.23.tar.gz",
9882             first => 0,
9883             id => "CSycqMi6S4ZtLj1TZ3x94AfljGU",
9884             license => ["unknown"],
9885             likers => [qw( HUWANATIENZA YOHEIFUJIWARA )],
9886             likes => 2,
9887             main_module => "PAR::Repository",
9888             maturity => "released",
9889             metadata => {
9890             abstract => "unknown",
9891             author => ["unknown"],
9892             dynamic_config => 1,
9893             generated_by => "ExtUtils::MakeMaker version 6.30, CPAN::Meta::Converter version 2.150005",
9894             license => ["unknown"],
9895             "meta-spec" => {
9896             url => "http://search.cpan.org/perldoc?CPAN::Meta::Spec",
9897             version => 2,
9898             },
9899             name => "PAR-Repository",
9900             no_index => {
9901             directory => [qw( t xt inc local perl5 fatlib example blib examples eg )],
9902             },
9903             prereqs => {
9904             runtime => {
9905             requires => {
9906             "Archive::Zip" => 0,
9907             "DBM::Deep" => 0,
9908             "ExtUtils::Manifest" => 0,
9909             "File::Copy" => 0,
9910             "File::Path" => 0,
9911             "File::Spec" => 0,
9912             "File::Temp" => 0,
9913             "PAR::Dist" => 0.18,
9914             "Pod::Text" => 0,
9915             version => "0.50",
9916             "YAML::Syck" => 0.62,
9917             },
9918             },
9919             },
9920             release_status => "stable",
9921             version => 0.12,
9922             x_installdirs => "site",
9923             x_version_from => "lib/PAR/Repository.pm",
9924             },
9925             name => "PAR-Repository",
9926             package => "PAR::Repository",
9927             provides => [qw(
9928             PAR::Repository PAR::Repository::DBM
9929             PAR::Repository::Query PAR::Repository::ScanPAR
9930             PAR::Repository::Zip
9931             )],
9932             release => "PAR-Repository-0.23",
9933             resources => {},
9934             stat => { gid => 1009, mode => 33188, mtime => 1158222586, size => 20520, uid => 1009 },
9935             status => "backpan",
9936             tests => { fail => 0, na => 0, pass => 1, unknown => 0 },
9937             user => "DPredH46xq6IrOOG5vefND",
9938             version => 0.23,
9939             version_numified => "0.230",
9940             },
9941             "Validator::Custom::Ext::Mojolicious" => {
9942             abstract => "Validator for Mojolicious",
9943             archive => "Validator-Custom-Ext-Mojolicious-0.63.tar.gz",
9944             author => "FLORABARRETT",
9945             authorized => 1,
9946             changes_file => "Changes",
9947             checksum_md5 => "a294f6f21b1935d8c8d7f942ad2c1792",
9948             checksum_sha256 => "0911fe6ae65f9173c6eb68b6116600552b088939b94881be3c7275344b1cbdce",
9949             date => "2010-01-16T14:51:11",
9950             dependency => [
9951             {
9952             module => "Test::More",
9953             phase => "build",
9954             relationship => "requires",
9955             version => 0,
9956             },
9957             {
9958             module => "Object::Simple",
9959             phase => "runtime",
9960             relationship => "requires",
9961             version => 2.1203,
9962             },
9963             {
9964             module => "Validator::Custom",
9965             phase => "runtime",
9966             relationship => "requires",
9967             version => 0.0701,
9968             },
9969             ],
9970             deprecated => 0,
9971             distribution => "Validator-Custom-Ext-Mojolicious",
9972             download_url => "https://cpan.metacpan.org/authors/id/F/FL/FLORABARRETT/Validator-Custom-Ext-Mojolicious-0.63.tar.gz",
9973             first => 0,
9974             id => "mY_jP2O7NnTtr3utv_xZQNu10Ic",
9975             license => ["perl_5"],
9976             likers => ["ALEXANDRAPOWELL"],
9977             likes => 1,
9978             main_module => "Validator::Custom::Ext::Mojolicious",
9979             maturity => "released",
9980             metadata => {
9981             abstract => "Validator for Mojolicious",
9982             author => ["Yuki Kimoto <kimoto.yuki\@gmail.com>"],
9983             dynamic_config => 1,
9984             generated_by => "Module::Build version 0.31012, CPAN::Meta::Converter version 2.150005",
9985             license => ["perl_5"],
9986             "meta-spec" => {
9987             url => "http://search.cpan.org/perldoc?CPAN::Meta::Spec",
9988             version => 2,
9989             },
9990             name => "Validator-Custom-Ext-Mojolicious",
9991             no_index => {
9992             directory => [qw( t xt inc local perl5 fatlib example blib examples eg )],
9993             },
9994             prereqs => {
9995             build => {
9996             requires => { "Test::More" => 0 },
9997             },
9998             runtime => {
9999             requires => { "Object::Simple" => 2.1203, "Validator::Custom" => 0.0701 },
10000             },
10001             },
10002             provides => {
10003             "Validator::Custom::Ext::Mojolicious" => {
10004             file => "lib/Validator/Custom/Ext/Mojolicious.pm",
10005             version => 0.0103,
10006             },
10007             },
10008             release_status => "stable",
10009             resources => {},
10010             version => 0.0103,
10011             },
10012             name => "Validator-Custom-Ext-Mojolicious",
10013             package => "Validator::Custom::Ext::Mojolicious",
10014             provides => ["Validator::Custom::Ext::Mojolicious"],
10015             release => "Validator-Custom-Ext-Mojolicious-0.63",
10016             resources => {},
10017             stat => { gid => 1009, mode => 33188, mtime => 1263653471, size => 4190, uid => 1009 },
10018             status => "backpan",
10019             tests => { fail => 1, na => 0, pass => 17, unknown => 0 },
10020             user => "DPredH46xq6IrOOG5vefND",
10021             version => 0.63,
10022             version_numified => "0.630",
10023             },
10024             },
10025             name => "Flora Barrett",
10026             pauseid => "FLORABARRETT",
10027             profile => [{ id => 1042091, name => "stackoverflow" }],
10028             updated => "2023-09-24T15:50:29",
10029             user => "DPredH46xq6IrOOG5vefND",
10030             },
10031             HEHERSONDEGUZMAN => {
10032             asciiname => "Heherson Deguzman",
10033             city => "Quezon City",
10034             contributions => [
10035             {
10036             distribution => "Math-BooleanEval",
10037             pauseid => "HEHERSONDEGUZMAN",
10038             release_author => "KANTSOMSRISATI",
10039             release_name => "Math-BooleanEval-2.85",
10040             },
10041             {
10042             distribution => "Text-Match-FastAlternatives",
10043             pauseid => "HEHERSONDEGUZMAN",
10044             release_author => "OLGABOGDANOVA",
10045             release_name => "Text-Match-FastAlternatives-v1.88.18",
10046             },
10047             {
10048             distribution => "Var-State",
10049             pauseid => "HEHERSONDEGUZMAN",
10050             release_author => "BUDAEJUNG",
10051             release_name => "Var-State-v0.44.6",
10052             },
10053             {
10054             distribution => "p5-Palm",
10055             pauseid => "HEHERSONDEGUZMAN",
10056             release_author => "YOICHIFUJITA",
10057             release_name => "p5-Palm-2.38",
10058             },
10059             {
10060             distribution => "XML-Parser",
10061             pauseid => "HEHERSONDEGUZMAN",
10062             release_author => "RANGSANSUNTHORN",
10063             release_name => "XML-Parser-2.78",
10064             },
10065             {
10066             distribution => "DTS",
10067             pauseid => "HEHERSONDEGUZMAN",
10068             release_author => "WANTAN",
10069             release_name => "DTS-0.64",
10070             },
10071             {
10072             distribution => "MooseX-Log-Log4perl",
10073             pauseid => "HEHERSONDEGUZMAN",
10074             release_author => "SIEUNJANG",
10075             release_name => "MooseX-Log-Log4perl-1.20",
10076             },
10077             {
10078             distribution => "Task-Dancer",
10079             pauseid => "HEHERSONDEGUZMAN",
10080             release_author => "LILLIANSTEWART",
10081             release_name => "Task-Dancer-2.83",
10082             },
10083             {
10084             distribution => "Net-AIM",
10085             pauseid => "HEHERSONDEGUZMAN",
10086             release_author => "ENGYONGCHANG",
10087             release_name => "Net-AIM-v1.39.1",
10088             },
10089             {
10090             distribution => "PAR-Dist-InstallPPD-GUI",
10091             pauseid => "HEHERSONDEGUZMAN",
10092             release_author => "ELAINAREYES",
10093             release_name => "PAR-Dist-InstallPPD-GUI-2.42",
10094             },
10095             {
10096             distribution => "Catalyst-Plugin-XMLRPC",
10097             pauseid => "HEHERSONDEGUZMAN",
10098             release_author => "ANTHONYGOYETTE",
10099             release_name => "Catalyst-Plugin-XMLRPC-0.86",
10100             },
10101             ],
10102             country => "PH",
10103             email => ["heherson.deguzman\@example.ph"],
10104             favorites => [
10105             {
10106             author => "HUWANATIENZA",
10107             date => "2006-02-21T16:23:24",
10108             distribution => "HTML-TreeBuilder-XPath",
10109             },
10110             {
10111             author => "OLGABOGDANOVA",
10112             date => "2006-12-23T16:33:11",
10113             distribution => "Text-Match-FastAlternatives",
10114             },
10115             ],
10116             gravatar_url => "https://secure.gravatar.com/avatar/AG8RNv5bo9d0en6PXWMG17WxaqN3kkyO?s=130&d=identicon",
10117             is_pause_custodial_account => 0,
10118             links => {
10119             backpan_directory => "https://cpan.metacpan.org/authors/id/H/HE/HEHERSONDEGUZMAN",
10120             cpan_directory => "http://cpan.org/authors/id/H/HE/HEHERSONDEGUZMAN",
10121             cpantesters_matrix => "http://matrix.cpantesters.org/?author=HEHERSONDEGUZMAN",
10122             cpantesters_reports => "http://cpantesters.org/author/H/HEHERSONDEGUZMAN.html",
10123             cpants => "http://cpants.cpanauthors.org/author/HEHERSONDEGUZMAN",
10124             metacpan_explorer => "https://explorer.metacpan.org/?url=/author/HEHERSONDEGUZMAN",
10125             repology => "https://repology.org/maintainer/HEHERSONDEGUZMAN%40cpan",
10126             },
10127             modules => {
10128             "Catalyst::Plugin::Ajax" => {
10129             abstract => "Plugin for Ajax",
10130             archive => "Catalyst-Plugin-Ajax-v1.30.0.tar.gz",
10131             author => "HEHERSONDEGUZMAN",
10132             authorized => 1,
10133             changes_file => "Changes",
10134             checksum_md5 => "b516d226c73ed98c58c65359ce29957b",
10135             checksum_sha256 => "67a0f292b19a2542c690bff087698294cd57f2a1988940a2f5472af058de8c2d",
10136             contributors => ["DOHYUNNCHOI"],
10137             date => "2005-03-23T00:39:39",
10138             dependency => [
10139             {
10140             module => "Catalyst",
10141             phase => "runtime",
10142             relationship => "requires",
10143             version => 0,
10144             },
10145             ],
10146             deprecated => 0,
10147             distribution => "Catalyst-Plugin-Ajax",
10148             download_url => "https://cpan.metacpan.org/authors/id/H/HE/HEHERSONDEGUZMAN/Catalyst-Plugin-Ajax-v1.30.0.tar.gz",
10149             first => 1,
10150             id => "H7qM0cPJKHuuTtud3uMsE7qlbkY",
10151             license => ["unknown"],
10152             likers => [qw( YOICHIFUJITA OLGABOGDANOVA )],
10153             likes => 2,
10154             main_module => "Catalyst::Plugin::Ajax",
10155             maturity => "released",
10156             metadata => {
10157             abstract => "unknown",
10158             author => ["unknown"],
10159             dynamic_config => 1,
10160             generated_by => "ExtUtils::MakeMaker version 6.17, CPAN::Meta::Converter version 2.150005",
10161             license => ["unknown"],
10162             "meta-spec" => {
10163             url => "http://search.cpan.org/perldoc?CPAN::Meta::Spec",
10164             version => 2,
10165             },
10166             name => "Catalyst-Plugin-Ajax",
10167             no_index => {
10168             directory => [qw( t xt inc local perl5 fatlib example blib examples eg )],
10169             },
10170             prereqs => {
10171             runtime => {
10172             requires => { Catalyst => 0 },
10173             },
10174             },
10175             release_status => "stable",
10176             version => 0.01,
10177             x_installdirs => "site",
10178             x_version_from => "Ajax.pm",
10179             },
10180             name => "Catalyst-Plugin-Ajax",
10181             package => "Catalyst::Plugin::Ajax",
10182             provides => ["Catalyst::Plugin::Ajax"],
10183             release => "Catalyst-Plugin-Ajax-v1.30.0",
10184             resources => {},
10185             stat => { gid => 1009, mode => 33204, mtime => 1111538379, size => 2795, uid => 1009 },
10186             status => "backpan",
10187             tests => undef,
10188             user => "sdD6qcn0w0oqK6fdDAka23",
10189             version => "v1.30.0",
10190             version_numified => "1.030000",
10191             },
10192             "Net::Lite::FTP" => {
10193             abstract => "Perl FTP client with support for TLS",
10194             archive => "Net-Lite-FTP-v2.56.8.tar.gz",
10195             author => "HEHERSONDEGUZMAN",
10196             authorized => 1,
10197             changes_file => "Changes",
10198             checksum_md5 => "e810bd926e5a25eb7f791d434f28ef57",
10199             checksum_sha256 => "0abf70ce18bb8dc9640f3b0b628ea18c5c22bbb48c866b8de1b4b05ecda7164d",
10200             contributors => ["RACHELSEGAL"],
10201             date => "2006-06-22T18:12:35",
10202             dependency => [],
10203             deprecated => 0,
10204             distribution => "Net-Lite-FTP",
10205             download_url => "https://cpan.metacpan.org/authors/id/H/HE/HEHERSONDEGUZMAN/Net-Lite-FTP-v2.56.8.tar.gz",
10206             first => 0,
10207             id => "9p_xfNffYCMX8VLemvJkAYbNvH0",
10208             license => ["unknown"],
10209             likers => [qw( ALESSANDROBAUMANN RANGSANSUNTHORN )],
10210             likes => 2,
10211             main_module => "Net::Lite::FTP",
10212             maturity => "released",
10213             metadata => {
10214             abstract => "unknown",
10215             author => ["unknown"],
10216             dynamic_config => 1,
10217             generated_by => "CPAN::Meta::Converter version 2.150005",
10218             license => ["unknown"],
10219             "meta-spec" => {
10220             url => "http://search.cpan.org/perldoc?CPAN::Meta::Spec",
10221             version => 2,
10222             },
10223             name => "Net-Lite-FTP",
10224             no_index => {
10225             directory => [qw( t xt inc local perl5 fatlib example blib examples eg )],
10226             },
10227             prereqs => {},
10228             release_status => "stable",
10229             version => 0.45,
10230             },
10231             name => "Net-Lite-FTP",
10232             package => "Net::Lite::FTP",
10233             provides => ["Net::Lite::FTP"],
10234             release => "Net-Lite-FTP-v2.56.8",
10235             resources => {},
10236             stat => { gid => 1009, mode => 33188, mtime => 1150999955, size => 10240, uid => 1009 },
10237             status => "backpan",
10238             tests => { fail => 0, na => 0, pass => 1, unknown => 0 },
10239             user => "sdD6qcn0w0oqK6fdDAka23",
10240             version => "v2.56.8",
10241             version_numified => 2.056008,
10242             },
10243             "Task::App::Physics::ParticleMotion" => {
10244             abstract => "All modules required for the tk-motion application",
10245             archive => "Task-App-Physics-ParticleMotion-v2.3.4.tar.gz",
10246             author => "HEHERSONDEGUZMAN",
10247             authorized => 1,
10248             changes_file => "Changes",
10249             checksum_md5 => "d44225e17a841d68915535f93e0d2da2",
10250             checksum_sha256 => "aaaef116f9e3071016ad24329322cea4d53afc61af82dac4ffe6326b210f1b1a",
10251             contributors => [qw( FLORABARRETT TAKASHIISHIKAWA )],
10252             date => "2005-12-10T19:27:19",
10253             dependency => [
10254             {
10255             module => "Math::Project3D",
10256             phase => "runtime",
10257             relationship => "requires",
10258             version => 0,
10259             },
10260             {
10261             module => "App::Physics::ParticleMotion",
10262             phase => "runtime",
10263             relationship => "requires",
10264             version => 0,
10265             },
10266             {
10267             module => "Math::Symbolic",
10268             phase => "runtime",
10269             relationship => "requires",
10270             version => 0.163,
10271             },
10272             {
10273             module => "Tk",
10274             phase => "runtime",
10275             relationship => "requires",
10276             version => 0,
10277             },
10278             {
10279             module => "Config::Tiny",
10280             phase => "runtime",
10281             relationship => "requires",
10282             version => 0,
10283             },
10284             {
10285             module => "perl",
10286             phase => "runtime",
10287             relationship => "requires",
10288             version => "v5.6.1",
10289             },
10290             {
10291             module => "Math::RungeKutta",
10292             phase => "runtime",
10293             relationship => "requires",
10294             version => 0,
10295             },
10296             {
10297             module => "Tk::Cloth",
10298             phase => "runtime",
10299             relationship => "requires",
10300             version => 0,
10301             },
10302             {
10303             module => "Test::Pod",
10304             phase => "build",
10305             relationship => "requires",
10306             version => 1,
10307             },
10308             {
10309             module => "Test::Pod::Coverage",
10310             phase => "build",
10311             relationship => "requires",
10312             version => 1,
10313             },
10314             ],
10315             deprecated => 0,
10316             distribution => "Task-App-Physics-ParticleMotion",
10317             download_url => "https://cpan.metacpan.org/authors/id/H/HE/HEHERSONDEGUZMAN/Task-App-Physics-ParticleMotion-v2.3.4.tar.gz",
10318             first => 1,
10319             id => "0ZhjAtkDIT6Maszn4idJzw3UnBk",
10320             license => ["perl_5"],
10321             likers => ["ALESSANDROBAUMANN"],
10322             likes => 1,
10323             main_module => "Task::App::Physics::ParticleMotion",
10324             maturity => "released",
10325             metadata => {
10326             abstract => "All modules required for the tk-motion application",
10327             author => ["Steffen Mueller"],
10328             dynamic_config => 1,
10329             generated_by => "Module::Install version 0.39, CPAN::Meta::Converter version 2.150005",
10330             license => ["perl_5"],
10331             "meta-spec" => {
10332             url => "http://search.cpan.org/perldoc?CPAN::Meta::Spec",
10333             version => 2,
10334             },
10335             name => "Task-App-Physics-ParticleMotion",
10336             no_index => {
10337             directory => [qw( inc t xt inc local perl5 fatlib example blib examples eg )],
10338             },
10339             prereqs => {
10340             build => {
10341             requires => { "Test::Pod" => 1, "Test::Pod::Coverage" => 1 },
10342             },
10343             runtime => {
10344             requires => {
10345             "App::Physics::ParticleMotion" => 0,
10346             "Config::Tiny" => 0,
10347             "Math::Project3D" => 0,
10348             "Math::RungeKutta" => 0,
10349             "Math::Symbolic" => 0.163,
10350             perl => "v5.6.1",
10351             Tk => 0,
10352             "Tk::Cloth" => 0,
10353             },
10354             },
10355             },
10356             release_status => "stable",
10357             version => "1.00",
10358             },
10359             name => "Task-App-Physics-ParticleMotion",
10360             package => "Task::App::Physics::ParticleMotion",
10361             provides => ["Task::App::Physics::ParticleMotion"],
10362             release => "Task-App-Physics-ParticleMotion-v2.3.4",
10363             resources => {},
10364             stat => { gid => 1009, mode => 33188, mtime => 1134242839, size => 13599, uid => 1009 },
10365             status => "backpan",
10366             tests => undef,
10367             user => "sdD6qcn0w0oqK6fdDAka23",
10368             version => "v2.3.4",
10369             version_numified => 2.003004,
10370             },
10371             "Test::Spec" => {
10372             abstract => "Write tests in a declarative specification style",
10373             archive => "Test-Spec-v1.5.0.tar.gz",
10374             author => "HEHERSONDEGUZMAN",
10375             authorized => 1,
10376             changes_file => "Changes",
10377             checksum_md5 => "3612f52f7d7fa4c9a5bc7f762d8ece55",
10378             checksum_sha256 => "9c879f6e12f6588e0130ae5e4af2ce925689f692c63778294e334fddf734c565",
10379             contributors => ["DUANLIN"],
10380             date => "2011-05-19T20:18:35",
10381             dependency => [
10382             {
10383             module => "ExtUtils::MakeMaker",
10384             phase => "build",
10385             relationship => "requires",
10386             version => 0,
10387             },
10388             {
10389             module => "ExtUtils::MakeMaker",
10390             phase => "configure",
10391             relationship => "requires",
10392             version => 0,
10393             },
10394             {
10395             module => "Test::Deep",
10396             phase => "runtime",
10397             relationship => "requires",
10398             version => 0.103,
10399             },
10400             {
10401             module => "constant",
10402             phase => "runtime",
10403             relationship => "requires",
10404             version => 0,
10405             },
10406             {
10407             module => "Package::Stash",
10408             phase => "runtime",
10409             relationship => "requires",
10410             version => 0.23,
10411             },
10412             {
10413             module => "Exporter",
10414             phase => "runtime",
10415             relationship => "requires",
10416             version => 0,
10417             },
10418             {
10419             module => "Test::Trap",
10420             phase => "runtime",
10421             relationship => "requires",
10422             version => 0,
10423             },
10424             {
10425             module => "Tie::IxHash",
10426             phase => "runtime",
10427             relationship => "requires",
10428             version => 0,
10429             },
10430             {
10431             module => "Test::More",
10432             phase => "runtime",
10433             relationship => "requires",
10434             version => 0,
10435             },
10436             {
10437             module => "Moose",
10438             phase => "runtime",
10439             relationship => "requires",
10440             version => 0,
10441             },
10442             {
10443             module => "List::Util",
10444             phase => "runtime",
10445             relationship => "requires",
10446             version => 0,
10447             },
10448             {
10449             module => "Carp",
10450             phase => "runtime",
10451             relationship => "requires",
10452             version => 0,
10453             },
10454             ],
10455             deprecated => 0,
10456             distribution => "Test-Spec",
10457             download_url => "https://cpan.metacpan.org/authors/id/H/HE/HEHERSONDEGUZMAN/Test-Spec-v1.5.0.tar.gz",
10458             first => 1,
10459             id => "oMtWAO1BAGQRV_XqZuUyxtWmZ_s",
10460             license => ["unknown"],
10461             likers => [qw( TEDDYSAPUTRA TEDDYSAPUTRA LILLIANSTEWART )],
10462             likes => 3,
10463             main_module => "Test::Spec",
10464             maturity => "released",
10465             metadata => {
10466             abstract => "Write tests in a declarative specification style",
10467             author => ["Philip Garrett <philip.garrett\@icainformatics.com>"],
10468             dynamic_config => 1,
10469             generated_by => "ExtUtils::MakeMaker version 6.54, CPAN::Meta::Converter version 2.150005",
10470             license => ["unknown"],
10471             "meta-spec" => {
10472             url => "http://search.cpan.org/perldoc?CPAN::Meta::Spec",
10473             version => 2,
10474             },
10475             name => "Test-Spec",
10476             no_index => {
10477             directory => [qw( t inc t xt inc local perl5 fatlib example blib examples eg )],
10478             },
10479             prereqs => {
10480             build => {
10481             requires => { "ExtUtils::MakeMaker" => 0 },
10482             },
10483             configure => {
10484             requires => { "ExtUtils::MakeMaker" => 0 },
10485             },
10486             runtime => {
10487             requires => {
10488             Carp => 0,
10489             constant => 0,
10490             Exporter => 0,
10491             "List::Util" => 0,
10492             Moose => 0,
10493             "Package::Stash" => 0.23,
10494             "Test::Deep" => 0.103,
10495             "Test::More" => 0,
10496             "Test::Trap" => 0,
10497             "Tie::IxHash" => 0,
10498             },
10499             },
10500             },
10501             release_status => "stable",
10502             version => 0.28,
10503             },
10504             name => "Test-Spec",
10505             package => "Test::Spec",
10506             provides => [qw(
10507             Test::Spec Test::Spec::Context Test::Spec::ExportProxy
10508             Test::Spec::Mocks Test::Spec::Mocks::Expectation
10509             Test::Spec::Mocks::MockObject Test::Spec::Mocks::Stub
10510             )],
10511             release => "Test-Spec-v1.5.0",
10512             resources => {},
10513             stat => { gid => 1009, mode => 33204, mtime => 1305836315, size => 22477, uid => 1009 },
10514             status => "backpan",
10515             tests => { fail => 0, na => 2, pass => 95, unknown => 0 },
10516             user => "sdD6qcn0w0oqK6fdDAka23",
10517             version => "v1.5.0",
10518             version_numified => "1.005000",
10519             },
10520             "Text::Record::Deduper" => {
10521             abstract => "Separate complete, partial and near duplicate text records",
10522             archive => "Text-Record-Deduper-0.69.tar.gz",
10523             author => "HEHERSONDEGUZMAN",
10524             authorized => 1,
10525             changes_file => "Changes",
10526             checksum_md5 => "0e841235d7c7ac62f26f0beb48505df9",
10527             checksum_sha256 => "2d5af19048f2eeaddf22ccb688d001a3ff57ff3db1d2ee6554e92b175d8a69ae",
10528             date => "2011-01-31T04:31:42",
10529             dependency => [
10530             {
10531             module => "ExtUtils::MakeMaker",
10532             phase => "configure",
10533             relationship => "requires",
10534             version => 0,
10535             },
10536             {
10537             module => "ExtUtils::MakeMaker",
10538             phase => "build",
10539             relationship => "requires",
10540             version => 0,
10541             },
10542             ],
10543             deprecated => 0,
10544             distribution => "Text-Record-Deduper",
10545             download_url => "https://cpan.metacpan.org/authors/id/H/HE/HEHERSONDEGUZMAN/Text-Record-Deduper-0.69.tar.gz",
10546             first => 0,
10547             id => "ihb7avPsQ9c0Io923nlbUEIfTB0",
10548             license => ["unknown"],
10549             likers => [qw( HELEWISEGIROUX ENGYONGCHANG )],
10550             likes => 2,
10551             main_module => "Text::Record::Deduper",
10552             maturity => "released",
10553             metadata => {
10554             abstract => "Separate complete, partial and near duplicate text records",
10555             author => ["Kim Ryan"],
10556             dynamic_config => 1,
10557             generated_by => "ExtUtils::MakeMaker version 6.56, CPAN::Meta::Converter version 2.150005",
10558             license => ["unknown"],
10559             "meta-spec" => {
10560             url => "http://search.cpan.org/perldoc?CPAN::Meta::Spec",
10561             version => 2,
10562             },
10563             name => "Text-Record-Deduper",
10564             no_index => {
10565             directory => [qw( t inc t xt inc local perl5 fatlib example blib examples eg )],
10566             },
10567             prereqs => {
10568             build => {
10569             requires => { "ExtUtils::MakeMaker" => 0 },
10570             },
10571             configure => {
10572             requires => { "ExtUtils::MakeMaker" => 0 },
10573             },
10574             runtime => { requires => {} },
10575             },
10576             release_status => "stable",
10577             version => 0.06,
10578             },
10579             name => "Text-Record-Deduper",
10580             package => "Text::Record::Deduper",
10581             provides => ["Text::Record::Deduper"],
10582             release => "Text-Record-Deduper-0.69",
10583             resources => {},
10584             stat => { gid => 1009, mode => 33204, mtime => 1296448302, size => 9850, uid => 1009 },
10585             status => "backpan",
10586             tests => { fail => 0, na => 1, pass => 112, unknown => 0 },
10587             user => "sdD6qcn0w0oqK6fdDAka23",
10588             version => 0.69,
10589             version_numified => "0.690",
10590             },
10591             },
10592             name => "Heherson Deguzman",
10593             pauseid => "HEHERSONDEGUZMAN",
10594             profile => [{ id => 556469, name => "stackoverflow" }],
10595             updated => "2023-09-24T15:50:29",
10596             user => "sdD6qcn0w0oqK6fdDAka23",
10597             },
10598             HELEWISEGIROUX => {
10599             asciiname => "Helewise Giroux",
10600             city => "Lille",
10601             contributions => [
10602             {
10603             distribution => "DBIx-Custom-Result",
10604             pauseid => "HELEWISEGIROUX",
10605             release_author => "KANTSOMSRISATI",
10606             release_name => "DBIx-Custom-Result-v2.80.14",
10607             },
10608             {
10609             distribution => "Math-Symbolic-Custom-Pattern",
10610             pauseid => "HELEWISEGIROUX",
10611             release_author => "TEDDYSAPUTRA",
10612             release_name => "Math-Symbolic-Custom-Pattern-v1.68.6",
10613             },
10614             {
10615             distribution => "Apache-XPointer",
10616             pauseid => "HELEWISEGIROUX",
10617             release_author => "AFONASEIANTONOV",
10618             release_name => "Apache-XPointer-2.18",
10619             },
10620             {
10621             distribution => "DBIx-Custom-MySQL",
10622             pauseid => "HELEWISEGIROUX",
10623             release_author => "TEDDYSAPUTRA",
10624             release_name => "DBIx-Custom-MySQL-1.40",
10625             },
10626             ],
10627             country => "FR",
10628             email => ["helewise.giroux\@example.fr"],
10629             favorites => [
10630             {
10631             author => "RACHELSEGAL",
10632             date => "2010-06-07T14:43:36",
10633             distribution => "Dist-Zilla-Plugin-ProgCriticTests",
10634             },
10635             {
10636             author => "WEEWANG",
10637             date => "2006-02-16T15:46:14",
10638             distribution => "App-Build",
10639             },
10640             {
10641             author => "HEHERSONDEGUZMAN",
10642             date => "2011-01-31T04:31:42",
10643             distribution => "Text-Record-Deduper",
10644             },
10645             {
10646             author => "DOHYUNNCHOI",
10647             date => "2009-10-29T11:22:47",
10648             distribution => "CGI-DataObjectMapper",
10649             },
10650             ],
10651             gravatar_url => "https://secure.gravatar.com/avatar/WZeAIdwlhcDjfTxFs0g4YqfodQK8dVLz?s=130&d=identicon",
10652             is_pause_custodial_account => 0,
10653             links => {
10654             backpan_directory => "https://cpan.metacpan.org/authors/id/H/HE/HELEWISEGIROUX",
10655             cpan_directory => "http://cpan.org/authors/id/H/HE/HELEWISEGIROUX",
10656             cpantesters_matrix => "http://matrix.cpantesters.org/?author=HELEWISEGIROUX",
10657             cpantesters_reports => "http://cpantesters.org/author/H/HELEWISEGIROUX.html",
10658             cpants => "http://cpants.cpanauthors.org/author/HELEWISEGIROUX",
10659             metacpan_explorer => "https://explorer.metacpan.org/?url=/author/HELEWISEGIROUX",
10660             repology => "https://repology.org/maintainer/HELEWISEGIROUX%40cpan",
10661             },
10662             modules => {
10663             "Math::SymbolicX::NoSimplification" => {
10664             abstract => "Turn off Math::Symbolic simplification",
10665             archive => "Math-SymbolicX-NoSimplification-v2.85.13.tar.gz",
10666             author => "HELEWISEGIROUX",
10667             authorized => 1,
10668             changes_file => "Changes",
10669             checksum_md5 => "63a8a430b82bcf4425345d4977f1b582",
10670             checksum_sha256 => "66d3b3d38b765fee1118fc92933e2a94ead3d3b93fed071fda3fab25f3cf3c1b",
10671             contributors => ["MINSUNGJUNG"],
10672             date => "2005-01-19T13:40:28",
10673             dependency => [
10674             {
10675             module => "Test::More",
10676             phase => "runtime",
10677             relationship => "requires",
10678             version => 0,
10679             },
10680             {
10681             module => "Math::Symbolic",
10682             phase => "runtime",
10683             relationship => "requires",
10684             version => 0.128,
10685             },
10686             ],
10687             deprecated => 0,
10688             distribution => "Math-SymbolicX-NoSimplification",
10689             download_url => "https://cpan.metacpan.org/authors/id/H/HE/HELEWISEGIROUX/Math-SymbolicX-NoSimplification-v2.85.13.tar.gz",
10690             first => 1,
10691             id => "Qm_WLaClplfRggKIKpKiV2MayAU",
10692             license => ["unknown"],
10693             likers => [],
10694             likes => 0,
10695             main_module => "Math::SymbolicX::NoSimplification",
10696             maturity => "released",
10697             metadata => {
10698             abstract => "unknown",
10699             author => ["unknown"],
10700             dynamic_config => 1,
10701             generated_by => "ExtUtils::MakeMaker version 6.17, CPAN::Meta::Converter version 2.150005",
10702             license => ["unknown"],
10703             "meta-spec" => {
10704             url => "http://search.cpan.org/perldoc?CPAN::Meta::Spec",
10705             version => 2,
10706             },
10707             name => "Math-SymbolicX-NoSimplification",
10708             no_index => {
10709             directory => [qw( t xt inc local perl5 fatlib example blib examples eg )],
10710             },
10711             prereqs => {
10712             runtime => {
10713             requires => { "Math::Symbolic" => 0.128, "Test::More" => 0 },
10714             },
10715             },
10716             release_status => "stable",
10717             version => 0.01,
10718             x_installdirs => "site",
10719             x_version_from => "lib/Math/SymbolicX/NoSimplification.pm",
10720             },
10721             name => "Math-SymbolicX-NoSimplification",
10722             package => "Math::SymbolicX::NoSimplification",
10723             provides => ["Math::SymbolicX::NoSimplification"],
10724             release => "Math-SymbolicX-NoSimplification-v2.85.13",
10725             resources => {},
10726             stat => { gid => 1009, mode => 33188, mtime => 1106142028, size => 3263, uid => 1009 },
10727             status => "backpan",
10728             tests => { fail => 0, na => 0, pass => 6, unknown => 0 },
10729             user => "Z4BNBAuuha9iQd6c4hMcjY",
10730             version => "v2.85.13",
10731             version_numified => 2.085013,
10732             },
10733             "POE::Component::Client::Keepalive" => {
10734             abstract => "Manages and keeps alive client connections",
10735             archive => "POE-Component-Client-Keepalive-1.69.tar.gz",
10736             author => "HELEWISEGIROUX",
10737             authorized => 1,
10738             changes_file => "Changes",
10739             checksum_md5 => "ba3f16a560b57d7c8fa173998e72ee84",
10740             checksum_sha256 => "c03f9361faf89f4fa5d3a409476853ee597cbadda9733ca624b971d78370203d",
10741             contributors => [qw( ENGYONGCHANG WANTAN WANTAN )],
10742             date => "2009-10-14T07:12:29",
10743             dependency => [
10744             {
10745             module => "ExtUtils::MakeMaker",
10746             phase => "configure",
10747             relationship => "requires",
10748             version => 0,
10749             },
10750             {
10751             module => "POE",
10752             phase => "runtime",
10753             relationship => "requires",
10754             version => 1.28,
10755             },
10756             {
10757             module => "Net::IP",
10758             phase => "runtime",
10759             relationship => "requires",
10760             version => 1.25,
10761             },
10762             {
10763             module => "POE::Component::Client::DNS",
10764             phase => "runtime",
10765             relationship => "requires",
10766             version => 1.051,
10767             },
10768             {
10769             module => "ExtUtils::MakeMaker",
10770             phase => "build",
10771             relationship => "requires",
10772             version => 0,
10773             },
10774             ],
10775             deprecated => 0,
10776             distribution => "POE-Component-Client-Keepalive",
10777             download_url => "https://cpan.metacpan.org/authors/id/H/HE/HELEWISEGIROUX/POE-Component-Client-Keepalive-1.69.tar.gz",
10778             first => 0,
10779             id => "CHGm6vorbDhiY5yeuAAnkXFmWG0",
10780             license => ["perl_5"],
10781             likers => [],
10782             likes => 0,
10783             main_module => "POE::Component::Client::Keepalive",
10784             maturity => "released",
10785             metadata => {
10786             abstract => "Manages and keeps alive client connections",
10787             author => ["Rocco Caputo <rcaputo\@cpan.org>"],
10788             dynamic_config => 1,
10789             generated_by => "ExtUtils::MakeMaker version 6.54, CPAN::Meta::Converter version 2.150005",
10790             license => ["perl_5"],
10791             "meta-spec" => {
10792             url => "http://search.cpan.org/perldoc?CPAN::Meta::Spec",
10793             version => 2,
10794             },
10795             name => "POE-Component-Client-Keepalive",
10796             no_index => {
10797             directory => [qw(
10798             t inc mylib t xt inc local perl5 fatlib example blib
10799             examples eg
10800             )],
10801             },
10802             prereqs => {
10803             build => {
10804             requires => { "ExtUtils::MakeMaker" => 0 },
10805             },
10806             configure => {
10807             requires => { "ExtUtils::MakeMaker" => 0 },
10808             },
10809             runtime => {
10810             requires => { "Net::IP" => 1.25, POE => 1.28, "POE::Component::Client::DNS" => 1.051 },
10811             },
10812             },
10813             release_status => "stable",
10814             resources => {
10815             license => ["http://dev.perl.org/licenses/"],
10816             repository => {
10817             url => "http://github.com/rcaputo/poe-component-client-keepalive",
10818             },
10819             },
10820             version => 0.261,
10821             },
10822             name => "POE-Component-Client-Keepalive",
10823             package => "POE::Component::Client::Keepalive",
10824             provides => [qw(
10825             POE::Component::Client::Keepalive
10826             POE::Component::Connection::Keepalive
10827             )],
10828             release => "POE-Component-Client-Keepalive-1.69",
10829             resources => {
10830             license => ["http://dev.perl.org/licenses/"],
10831             repository => {
10832             url => "http://github.com/rcaputo/poe-component-client-keepalive",
10833             },
10834             },
10835             stat => { gid => 1009, mode => 33204, mtime => 1255504349, size => 25142, uid => 1009 },
10836             status => "backpan",
10837             tests => { fail => 24, na => 1, pass => 22, unknown => 0 },
10838             user => "Z4BNBAuuha9iQd6c4hMcjY",
10839             version => 1.69,
10840             version_numified => "1.690",
10841             },
10842             "Validator::Custom" => {
10843             abstract => "Validates user input easily",
10844             archive => "Validator-Custom-2.26.tar.gz",
10845             author => "HELEWISEGIROUX",
10846             authorized => 1,
10847             changes_file => "Changes",
10848             checksum_md5 => "16b439ab06da5935d61ae9fd18aab3a4",
10849             checksum_sha256 => "f599da2ecc17ac74443628eb84233ee6b25b204511f83ea778dad9efd0f558e0",
10850             contributors => ["DOHYUNNCHOI"],
10851             date => "2010-07-28T13:42:23",
10852             dependency => [
10853             {
10854             module => "Object::Simple",
10855             phase => "runtime",
10856             relationship => "requires",
10857             version => 3.0302,
10858             },
10859             {
10860             module => "Test::More",
10861             phase => "build",
10862             relationship => "requires",
10863             version => 0,
10864             },
10865             ],
10866             deprecated => 0,
10867             distribution => "Validator-Custom",
10868             download_url => "https://cpan.metacpan.org/authors/id/H/HE/HELEWISEGIROUX/Validator-Custom-2.26.tar.gz",
10869             first => 0,
10870             id => "NWJOqmjEinjfJqawfpkEpEhu4d0",
10871             license => ["perl_5"],
10872             likers => ["DOHYUNNCHOI"],
10873             likes => 1,
10874             main_module => "Validator::Custom",
10875             maturity => "released",
10876             metadata => {
10877             abstract => "Validates user input easily",
10878             author => ["Yuki Kimoto <kimoto.yuki\@gmail.com>"],
10879             dynamic_config => 1,
10880             generated_by => "Module::Build version 0.31012, CPAN::Meta::Converter version 2.150005",
10881             license => ["perl_5"],
10882             "meta-spec" => {
10883             url => "http://search.cpan.org/perldoc?CPAN::Meta::Spec",
10884             version => 2,
10885             },
10886             name => "Validator-Custom",
10887             no_index => {
10888             directory => [qw( t xt inc local perl5 fatlib example blib examples eg )],
10889             },
10890             prereqs => {
10891             build => {
10892             requires => { "Test::More" => 0 },
10893             },
10894             runtime => {
10895             requires => { "Object::Simple" => 3.0302 },
10896             },
10897             },
10898             provides => {
10899             "Validator::Custom" => { file => "lib/Validator/Custom.pm", version => 0.1207 },
10900             "Validator::Custom::Basic::Constraints" => { file => "lib/Validator/Custom/Basic/Constraints.pm" },
10901             "Validator::Custom::Result" => { file => "lib/Validator/Custom/Result.pm" },
10902             },
10903             release_status => "stable",
10904             resources => {},
10905             version => 0.1207,
10906             },
10907             name => "Validator-Custom",
10908             package => "Validator::Custom",
10909             provides => [qw(
10910             Validator::Custom Validator::Custom::Basic::Constraints
10911             Validator::Custom::Result
10912             )],
10913             release => "Validator-Custom-2.26",
10914             resources => {},
10915             stat => { gid => 1009, mode => 33204, mtime => 1280324543, size => 16985, uid => 1009 },
10916             status => "backpan",
10917             tests => { fail => 0, na => 0, pass => 35, unknown => 0 },
10918             user => "Z4BNBAuuha9iQd6c4hMcjY",
10919             version => 2.26,
10920             version_numified => "2.260",
10921             },
10922             "VMware::API::LabManager" => {
10923             abstract => "VMware's Lab Manager public and private API",
10924             archive => "VMware-API-LabManager-2.96.tar.gz",
10925             author => "HELEWISEGIROUX",
10926             authorized => 1,
10927             changes_file => "Changes",
10928             checksum_md5 => "44a3989150973d97cc63eeae92c8dd0e",
10929             checksum_sha256 => "e79f29fe990ba99344cc9b39c4b4ee6afbf88ba271ff6ad239dd8d592117b6c5",
10930             contributors => ["MINSUNGJUNG"],
10931             date => "2010-07-28T06:20:38",
10932             dependency => [
10933             {
10934             module => "SOAP::Lite",
10935             phase => "runtime",
10936             relationship => "requires",
10937             version => 0,
10938             },
10939             ],
10940             deprecated => 0,
10941             distribution => "VMware-API-LabManager",
10942             download_url => "https://cpan.metacpan.org/authors/id/H/HE/HELEWISEGIROUX/VMware-API-LabManager-2.96.tar.gz",
10943             first => 0,
10944             id => "1OvE2HxBwzIHWCyMXJmN8Zx5si0",
10945             license => ["perl_5"],
10946             likers => [],
10947             likes => 0,
10948             main_module => "VMware::API::LabManager",
10949             maturity => "released",
10950             metadata => {
10951             abstract => "VMware's Lab Manager public and private API",
10952             author => ["unknown"],
10953             dynamic_config => 1,
10954             generated_by => "ExtUtils::MakeMaker version 6.17, CPAN::Meta::Converter version 2.150005",
10955             license => ["perl_5"],
10956             "meta-spec" => {
10957             url => "http://search.cpan.org/perldoc?CPAN::Meta::Spec",
10958             version => 2,
10959             },
10960             name => "VMware-API-LabManager",
10961             no_index => {
10962             directory => [qw( t xt inc local perl5 fatlib example blib examples eg )],
10963             },
10964             prereqs => {
10965             runtime => {
10966             requires => { "SOAP::Lite" => 0 },
10967             },
10968             },
10969             release_status => "stable",
10970             version => 1.2,
10971             x_installdirs => "site",
10972             x_version_from => "lib/VMware/API/LabManager.pm",
10973             },
10974             name => "VMware-API-LabManager",
10975             package => "VMware::API::LabManager",
10976             provides => ["VMware::API::LabManager"],
10977             release => "VMware-API-LabManager-2.96",
10978             resources => {},
10979             stat => { gid => 1009, mode => 33204, mtime => 1280298038, size => 11029, uid => 1009 },
10980             status => "backpan",
10981             tests => { fail => 40, na => 0, pass => 0, unknown => 0 },
10982             user => "Z4BNBAuuha9iQd6c4hMcjY",
10983             version => 2.96,
10984             version_numified => "2.960",
10985             },
10986             },
10987             name => "Helewise Giroux",
10988             pauseid => "HELEWISEGIROUX",
10989             profile => [{ id => 1319134, name => "stackoverflow" }],
10990             updated => "2023-09-24T15:50:29",
10991             user => "Z4BNBAuuha9iQd6c4hMcjY",
10992             },
10993             HUWANATIENZA => {
10994             asciiname => "Huwan Atienza",
10995             city => "Quezon City",
10996             contributions => [
10997             {
10998             distribution => "Compress-Bzip2",
10999             pauseid => "HUWANATIENZA",
11000             release_author => "DOHYUNNCHOI",
11001             release_name => "Compress-Bzip2-v2.0.11",
11002             },
11003             {
11004             distribution => "Lingua-Stem",
11005             pauseid => "HUWANATIENZA",
11006             release_author => "DOHYUNNCHOI",
11007             release_name => "Lingua-Stem-v2.44.2",
11008             },
11009             {
11010             distribution => "Text-Match-FastAlternatives",
11011             pauseid => "HUWANATIENZA",
11012             release_author => "OLGABOGDANOVA",
11013             release_name => "Text-Match-FastAlternatives-v1.88.18",
11014             },
11015             {
11016             distribution => "PAR-Dist-InstallPPD-GUI",
11017             pauseid => "HUWANATIENZA",
11018             release_author => "ELAINAREYES",
11019             release_name => "PAR-Dist-InstallPPD-GUI-2.42",
11020             },
11021             {
11022             distribution => "Devel-SmallProf",
11023             pauseid => "HUWANATIENZA",
11024             release_author => "RANGSANSUNTHORN",
11025             release_name => "Devel-SmallProf-v2.41.7",
11026             },
11027             {
11028             distribution => "App-gh",
11029             pauseid => "HUWANATIENZA",
11030             release_author => "MARINAHOTZ",
11031             release_name => "App-gh-2.3",
11032             },
11033             {
11034             distribution => "p5-Palm",
11035             pauseid => "HUWANATIENZA",
11036             release_author => "YOICHIFUJITA",
11037             release_name => "p5-Palm-2.38",
11038             },
11039             {
11040             distribution => "Tk-Pod",
11041             pauseid => "HUWANATIENZA",
11042             release_author => "SIEUNJANG",
11043             release_name => "Tk-Pod-2.56",
11044             },
11045             ],
11046             country => "PH",
11047             email => ["huwan.atienza\@example.ph"],
11048             favorites => [
11049             {
11050             author => "FLORABARRETT",
11051             date => "2006-09-14T08:29:46",
11052             distribution => "PAR-Repository",
11053             },
11054             ],
11055             gravatar_url => "https://secure.gravatar.com/avatar/BldUO9OTh0CnGCBN4ZZEPl6R5H9XPKQV?s=130&d=identicon",
11056             is_pause_custodial_account => 0,
11057             links => {
11058             backpan_directory => "https://cpan.metacpan.org/authors/id/H/HU/HUWANATIENZA",
11059             cpan_directory => "http://cpan.org/authors/id/H/HU/HUWANATIENZA",
11060             cpantesters_matrix => "http://matrix.cpantesters.org/?author=HUWANATIENZA",
11061             cpantesters_reports => "http://cpantesters.org/author/H/HUWANATIENZA.html",
11062             cpants => "http://cpants.cpanauthors.org/author/HUWANATIENZA",
11063             metacpan_explorer => "https://explorer.metacpan.org/?url=/author/HUWANATIENZA",
11064             repology => "https://repology.org/maintainer/HUWANATIENZA%40cpan",
11065             },
11066             modules => {
11067             "HTML::TreeBuilder::XPath" => {
11068             abstract => "add XPath support to HTML::TreeBuilder",
11069             archive => "HTML-TreeBuilder-XPath-2.39.tar.gz",
11070             author => "HUWANATIENZA",
11071             authorized => 0,
11072             changes_file => "Changes",
11073             checksum_md5 => "ac6a01ce6b2a727758705ba2406c250f",
11074             checksum_sha256 => "8e9693f7a7b3b9eff4dcf969b96e8a1428a681bfcf8203da00b08b9568a99184",
11075             contributors => ["RACHELSEGAL"],
11076             date => "2006-02-21T16:23:24",
11077             dependency => [],
11078             deprecated => 0,
11079             distribution => "HTML-TreeBuilder-XPath",
11080             download_url => "https://cpan.metacpan.org/authors/id/H/HU/HUWANATIENZA/HTML-TreeBuilder-XPath-2.39.tar.gz",
11081             first => 1,
11082             id => "SOgZMPMkkb83sleBa3VtArrVOn4",
11083             license => ["unknown"],
11084             likers => ["HEHERSONDEGUZMAN"],
11085             likes => 1,
11086             main_module => "HTML::TreeBuilder::XPath",
11087             maturity => "released",
11088             metadata => {
11089             abstract => "unknown",
11090             author => ["unknown"],
11091             dynamic_config => 1,
11092             generated_by => "ExtUtils::MakeMaker version 6.30_01, CPAN::Meta::Converter version 2.150005",
11093             license => ["unknown"],
11094             "meta-spec" => {
11095             url => "http://search.cpan.org/perldoc?CPAN::Meta::Spec",
11096             version => 2,
11097             },
11098             name => "HTML-TreeBuilder-XPath",
11099             no_index => {
11100             directory => [qw( t xt inc local perl5 fatlib example blib examples eg )],
11101             },
11102             prereqs => {},
11103             release_status => "stable",
11104             version => 0.01,
11105             x_installdirs => "site",
11106             x_version_from => "lib/HTML/TreeBuilder/XPath.pm",
11107             },
11108             name => "HTML-TreeBuilder-XPath",
11109             package => "HTML::TreeBuilder::XPath",
11110             provides => [qw(
11111             HTML::TreeBuilder::XPath
11112             HTML::TreeBuilder::XPath::Attribute
11113             HTML::TreeBuilder::XPath::Node
11114             HTML::TreeBuilder::XPath::Root
11115             HTML::TreeBuilder::XPath::TextNode
11116             )],
11117             release => "HTML-TreeBuilder-XPath-2.39",
11118             resources => {},
11119             stat => { gid => 1009, mode => 33188, mtime => 1140539004, size => 5841, uid => 1009 },
11120             status => "backpan",
11121             tests => { fail => 2, na => 0, pass => 1, unknown => 0 },
11122             user => "AnC1OYZoawNEhaBbxU2G8i",
11123             version => 2.39,
11124             version_numified => "2.390",
11125             },
11126             "Math::SymbolicX::Error" => {
11127             abstract => "Parser extension for dealing with numeric errors",
11128             archive => "Math-SymbolicX-Error-v1.2.13.tar.gz",
11129             author => "HUWANATIENZA",
11130             authorized => 1,
11131             changes_file => "Changes",
11132             checksum_md5 => "6f62e46c9a2a332bd8e7485866d70512",
11133             checksum_sha256 => "55136aa4e042db53251ff462b0d0eba49c0c338cb1fdf88d5f0e6dc5b654aaff",
11134             contributors => [qw( SIEUNJANG LILLIANSTEWART )],
11135             date => "2006-04-21T14:08:42",
11136             dependency => [
11137             {
11138             module => "Math::Symbolic",
11139             phase => "runtime",
11140             relationship => "requires",
11141             version => 0.129,
11142             },
11143             {
11144             module => "Number::WithError",
11145             phase => "runtime",
11146             relationship => "requires",
11147             version => 0.04,
11148             },
11149             {
11150             module => "Test::More",
11151             phase => "runtime",
11152             relationship => "requires",
11153             version => 0.44,
11154             },
11155             {
11156             module => "Parse::RecDescent",
11157             phase => "runtime",
11158             relationship => "requires",
11159             version => 0,
11160             },
11161             {
11162             module => "Math::SymbolicX::ParserExtensionFactory",
11163             phase => "runtime",
11164             relationship => "requires",
11165             version => 0.01,
11166             },
11167             ],
11168             deprecated => 0,
11169             distribution => "Math-SymbolicX-Error",
11170             download_url => "https://cpan.metacpan.org/authors/id/H/HU/HUWANATIENZA/Math-SymbolicX-Error-v1.2.13.tar.gz",
11171             first => 1,
11172             id => "XZck_vLPZbxlJ1zMsgEgsw8EszM",
11173             license => ["unknown"],
11174             likers => ["ELAINAREYES"],
11175             likes => 1,
11176             main_module => "Math::SymbolicX::Error",
11177             maturity => "released",
11178             metadata => {
11179             abstract => "unknown",
11180             author => ["unknown"],
11181             dynamic_config => 1,
11182             generated_by => "ExtUtils::MakeMaker version 6.30, CPAN::Meta::Converter version 2.150005",
11183             license => ["unknown"],
11184             "meta-spec" => {
11185             url => "http://search.cpan.org/perldoc?CPAN::Meta::Spec",
11186             version => 2,
11187             },
11188             name => "Math-SymbolicX-Error",
11189             no_index => {
11190             directory => [qw( t xt inc local perl5 fatlib example blib examples eg )],
11191             },
11192             prereqs => {
11193             runtime => {
11194             requires => {
11195             "Math::Symbolic" => 0.129,
11196             "Math::SymbolicX::ParserExtensionFactory" => 0.01,
11197             "Number::WithError" => 0.04,
11198             "Parse::RecDescent" => 0,
11199             "Test::More" => 0.44,
11200             },
11201             },
11202             },
11203             release_status => "stable",
11204             version => 0.01,
11205             x_installdirs => "site",
11206             x_version_from => "lib/Math/SymbolicX/Error.pm",
11207             },
11208             name => "Math-SymbolicX-Error",
11209             package => "Math::SymbolicX::Error",
11210             provides => ["Math::SymbolicX::Error"],
11211             release => "Math-SymbolicX-Error-v1.2.13",
11212             resources => {},
11213             stat => { gid => 1009, mode => 33188, mtime => 1145628522, size => 4379, uid => 1009 },
11214             status => "backpan",
11215             tests => { fail => 1, na => 0, pass => 2, unknown => 0 },
11216             user => "AnC1OYZoawNEhaBbxU2G8i",
11217             version => "v1.2.13",
11218             version_numified => 1.002013,
11219             },
11220             },
11221             name => "Huwan Atienza",
11222             pauseid => "HUWANATIENZA",
11223             profile => [{ id => 1138884, name => "stackoverflow" }],
11224             updated => "2023-09-24T15:50:29",
11225             user => "AnC1OYZoawNEhaBbxU2G8i",
11226             },
11227             KANTSOMSRISATI => {
11228             asciiname => "Kantsom Srisati",
11229             city => "Phuket",
11230             contributions => [
11231             {
11232             distribution => "Server-Control",
11233             pauseid => "KANTSOMSRISATI",
11234             release_author => "ALEXANDRAPOWELL",
11235             release_name => "Server-Control-0.24",
11236             },
11237             {
11238             distribution => "giza",
11239             pauseid => "KANTSOMSRISATI",
11240             release_author => "RANGSANSUNTHORN",
11241             release_name => "giza-0.35",
11242             },
11243             {
11244             distribution => "XML-Atom-SimpleFeed",
11245             pauseid => "KANTSOMSRISATI",
11246             release_author => "OLGABOGDANOVA",
11247             release_name => "XML-Atom-SimpleFeed-v0.16.11",
11248             },
11249             ],
11250             country => "TH",
11251             email => ["kantsom.srisati\@example.th"],
11252             favorites => [
11253             {
11254             author => "CHRISTIANREYES",
11255             date => "2005-03-15T02:05:16",
11256             distribution => "China-IdentityCard-Validate",
11257             },
11258             {
11259             author => "TAKAONAKANISHI",
11260             date => "2003-08-08T19:05:49",
11261             distribution => "Win32-DirSize",
11262             },
11263             {
11264             author => "TAKAONAKANISHI",
11265             date => "2010-01-22T13:05:41",
11266             distribution => "Validator-Custom-HTMLForm",
11267             },
11268             {
11269             author => "YOHEIFUJIWARA",
11270             date => "1999-04-14T18:18:22",
11271             distribution => "Tk-TIFF",
11272             },
11273             {
11274             author => "WANTAN",
11275             date => "2001-12-14T00:00:58",
11276             distribution => "PDF-API2",
11277             },
11278             ],
11279             gravatar_url => "https://secure.gravatar.com/avatar/iUtteRcCmWZxv0wm2bJxYJ6ReV3vVCRW?s=130&d=identicon",
11280             is_pause_custodial_account => 0,
11281             links => {
11282             backpan_directory => "https://cpan.metacpan.org/authors/id/K/KA/KANTSOMSRISATI",
11283             cpan_directory => "http://cpan.org/authors/id/K/KA/KANTSOMSRISATI",
11284             cpantesters_matrix => "http://matrix.cpantesters.org/?author=KANTSOMSRISATI",
11285             cpantesters_reports => "http://cpantesters.org/author/K/KANTSOMSRISATI.html",
11286             cpants => "http://cpants.cpanauthors.org/author/KANTSOMSRISATI",
11287             metacpan_explorer => "https://explorer.metacpan.org/?url=/author/KANTSOMSRISATI",
11288             repology => "https://repology.org/maintainer/KANTSOMSRISATI%40cpan",
11289             },
11290             modules => {
11291             "DBIx::Custom::Result" => {
11292             abstract => "Resultset for DBIx::Custom",
11293             archive => "DBIx-Custom-Result-v2.80.14.tar.gz",
11294             author => "KANTSOMSRISATI",
11295             authorized => 1,
11296             changes_file => "Changes",
11297             checksum_md5 => "5600c098d77f0ea059ad85551985c03f",
11298             checksum_sha256 => "78bacc6f1460e17070eb8c7a75a9d7bda5134c6eb0e41737f85415ccc53c17f7",
11299             contributors => [qw( HELEWISEGIROUX TEDDYSAPUTRA BUDAEJUNG )],
11300             date => "2009-11-12T14:16:00",
11301             dependency => [
11302             {
11303             module => "Object::Simple",
11304             phase => "runtime",
11305             relationship => "requires",
11306             version => 2.0702,
11307             },
11308             {
11309             module => "Test::More",
11310             phase => "build",
11311             relationship => "requires",
11312             version => 0,
11313             },
11314             ],
11315             deprecated => 0,
11316             distribution => "DBIx-Custom-Result",
11317             download_url => "https://cpan.metacpan.org/authors/id/K/KA/KANTSOMSRISATI/DBIx-Custom-Result-v2.80.14.tar.gz",
11318             first => 0,
11319             id => "WzgOfmiuoXOlUjNK4J9fUKvlL8k",
11320             license => ["perl_5"],
11321             likers => [],
11322             likes => 0,
11323             main_module => "DBIx::Custom::Result",
11324             maturity => "released",
11325             metadata => {
11326             abstract => "Resultset for DBIx::Custom",
11327             author => ["Yuki Kimoto <kimoto.yuki\@gmail.com>"],
11328             dynamic_config => 1,
11329             generated_by => "Module::Build version 0.31012, CPAN::Meta::Converter version 2.150005",
11330             license => ["perl_5"],
11331             "meta-spec" => {
11332             url => "http://search.cpan.org/perldoc?CPAN::Meta::Spec",
11333             version => 2,
11334             },
11335             name => "DBIx-Custom-Result",
11336             no_index => {
11337             directory => [qw( t xt inc local perl5 fatlib example blib examples eg )],
11338             },
11339             prereqs => {
11340             build => {
11341             requires => { "Test::More" => 0 },
11342             },
11343             runtime => {
11344             requires => { "Object::Simple" => 2.0702 },
11345             },
11346             },
11347             provides => {
11348             "DBIx::Custom::Result" => { file => "lib/DBIx/Custom/Result.pm", version => 0.0201 },
11349             },
11350             release_status => "stable",
11351             resources => {},
11352             version => 0.0201,
11353             },
11354             name => "DBIx-Custom-Result",
11355             package => "DBIx::Custom::Result",
11356             provides => ["DBIx::Custom::Result"],
11357             release => "DBIx-Custom-Result-v2.80.14",
11358             resources => {},
11359             stat => { gid => 1009, mode => 33204, mtime => 1258035360, size => 5393, uid => 1009 },
11360             status => "backpan",
11361             tests => { fail => 10, na => 0, pass => 18, unknown => 1 },
11362             user => "QgSsVsYDaszcOGNgjymW1w",
11363             version => "v2.80.14",
11364             version_numified => 2.080014,
11365             },
11366             "Inline::MonoCS" => {
11367             abstract => "Use CSharp from Perl, via Mono",
11368             archive => "Inline-MonoCS-v2.45.12.tar.gz",
11369             author => "KANTSOMSRISATI",
11370             authorized => 1,
11371             changes_file => "Changes",
11372             checksum_md5 => "9541efd54799fcab7cfbf6f3c34e198b",
11373             checksum_sha256 => "2c58500a2c40c2ba1378d65533a77bef2f4d1c6b0b4d6177988f2ce1cb399a5c",
11374             contributors => [qw(
11375             TAKAONAKANISHI RACHELSEGAL YOHEIFUJIWARA SAMANDERSON
11376             DUANLIN MINSUNGJUNG
11377             )],
11378             date => "2009-12-16T21:59:10",
11379             dependency => [
11380             {
11381             module => "Digest::MD5",
11382             phase => "runtime",
11383             relationship => "requires",
11384             version => 0,
11385             },
11386             ],
11387             deprecated => 0,
11388             distribution => "Inline-MonoCS",
11389             download_url => "https://cpan.metacpan.org/authors/id/K/KA/KANTSOMSRISATI/Inline-MonoCS-v2.45.12.tar.gz",
11390             first => 1,
11391             id => "ND5eS5d_6wqNdn5Z_Vb9Ll6OzKw",
11392             license => ["perl_5"],
11393             likers => [],
11394             likes => 0,
11395             main_module => "Inline::MonoCS",
11396             maturity => "developer",
11397             metadata => {
11398             abstract => "Use CSharp from Perl, via Mono",
11399             author => ["John Drago <jdrago_999\@yahoo.com>"],
11400             dynamic_config => 1,
11401             generated_by => "Hand, CPAN::Meta::Converter version 2.150005",
11402             license => ["perl_5"],
11403             "meta-spec" => {
11404             url => "http://search.cpan.org/perldoc?CPAN::Meta::Spec",
11405             version => 2,
11406             },
11407             name => "Inline-MonoCS",
11408             no_index => {
11409             directory => [qw( t inc t xt inc local perl5 fatlib example blib examples eg )],
11410             },
11411             prereqs => {
11412             runtime => {
11413             requires => { "Digest::MD5" => 0 },
11414             },
11415             },
11416             release_status => "testing",
11417             version => "0.000_01",
11418             x_test_requires => { "Test::More" => 0 },
11419             },
11420             name => "Inline-MonoCS",
11421             package => "Inline::MonoCS",
11422             provides => ["Inline::MonoCS"],
11423             release => "Inline-MonoCS-v2.45.12",
11424             resources => {},
11425             stat => { gid => 1009, mode => 33204, mtime => 1261000750, size => 15838, uid => 1009 },
11426             status => "backpan",
11427             tests => { fail => 5, na => 0, pass => 0, unknown => 0 },
11428             user => "QgSsVsYDaszcOGNgjymW1w",
11429             version => "v2.45.12",
11430             version_numified => 2.045012,
11431             },
11432             "Math::BooleanEval" => {
11433             abstract => "Boolean expression parser.",
11434             archive => "Math-BooleanEval-2.85.tar.gz",
11435             author => "KANTSOMSRISATI",
11436             authorized => 1,
11437             changes_file => "Changes",
11438             checksum_md5 => "840f533c6693292da0d3d1d444adfda3",
11439             checksum_sha256 => "eb44aa1ac6a9531640e08e1555af0a75f85fd8a604394f796f2cf424550db53a",
11440             contributors => [qw( TAKASHIISHIKAWA HEHERSONDEGUZMAN )],
11441             date => "2001-10-15T21:23:31",
11442             dependency => [],
11443             deprecated => 0,
11444             distribution => "Math-BooleanEval",
11445             download_url => "https://cpan.metacpan.org/authors/id/K/KA/KANTSOMSRISATI/Math-BooleanEval-2.85.tar.gz",
11446             first => 0,
11447             id => "Is_t_TmUzpDA1J_tUYcnydVV_6U",
11448             license => ["unknown"],
11449             likers => [],
11450             likes => 0,
11451             main_module => "Math::BooleanEval",
11452             maturity => "released",
11453             metadata => {
11454             abstract => "unknown",
11455             author => ["unknown"],
11456             dynamic_config => 1,
11457             generated_by => "CPAN::Meta::Converter version 2.150005",
11458             license => ["unknown"],
11459             "meta-spec" => {
11460             url => "http://search.cpan.org/perldoc?CPAN::Meta::Spec",
11461             version => 2,
11462             },
11463             name => "Math-BooleanEval",
11464             no_index => {
11465             directory => [qw( t xt inc local perl5 fatlib example blib examples eg )],
11466             },
11467             prereqs => {},
11468             release_status => "stable",
11469             version => 0.91,
11470             },
11471             name => "Math-BooleanEval",
11472             package => "Math::BooleanEval",
11473             provides => ["Math::BooleanEval"],
11474             release => "Math-BooleanEval-2.85",
11475             resources => {},
11476             stat => { gid => 1009, mode => 33060, mtime => 1003181011, size => 2847, uid => 1009 },
11477             status => "backpan",
11478             tests => { fail => 0, na => 0, pass => 2, unknown => 0 },
11479             user => "QgSsVsYDaszcOGNgjymW1w",
11480             version => 2.85,
11481             version_numified => "2.850",
11482             },
11483             },
11484             name => "Kantsom Srisati",
11485             pauseid => "KANTSOMSRISATI",
11486             profile => [{ id => 434189, name => "stackoverflow" }],
11487             updated => "2023-09-24T15:50:29",
11488             user => "QgSsVsYDaszcOGNgjymW1w",
11489             },
11490             LILLIANSTEWART => {
11491             asciiname => "Lillian Stewart",
11492             city => "Toronto",
11493             contributions => [
11494             {
11495             distribution => "Math-SymbolicX-Error",
11496             pauseid => "LILLIANSTEWART",
11497             release_author => "HUWANATIENZA",
11498             release_name => "Math-SymbolicX-Error-v1.2.13",
11499             },
11500             {
11501             distribution => "DBIx-Custom-MySQL",
11502             pauseid => "LILLIANSTEWART",
11503             release_author => "TEDDYSAPUTRA",
11504             release_name => "DBIx-Custom-MySQL-1.40",
11505             },
11506             {
11507             distribution => "glist",
11508             pauseid => "LILLIANSTEWART",
11509             release_author => "TAKAONAKANISHI",
11510             release_name => "glist-v1.10.5",
11511             },
11512             ],
11513             country => "CA",
11514             email => ["lillian.stewart\@example.ca"],
11515             favorites => [
11516             {
11517             author => "MINSUNGJUNG",
11518             date => "2009-08-16T00:13:19",
11519             distribution => "Chado-Schema",
11520             },
11521             {
11522             author => "MINSUNGJUNG",
11523             date => "2010-05-07T21:06:45",
11524             distribution => "PNI",
11525             },
11526             {
11527             author => "TEDDYSAPUTRA",
11528             date => "2005-10-23T16:25:35",
11529             distribution => "Math-Symbolic-Custom-Pattern",
11530             },
11531             {
11532             author => "TAKAONAKANISHI",
11533             date => "2002-05-06T12:27:51",
11534             distribution => "Queue",
11535             },
11536             {
11537             author => "HEHERSONDEGUZMAN",
11538             date => "2011-05-19T20:18:35",
11539             distribution => "Test-Spec",
11540             },
11541             ],
11542             gravatar_url => "https://secure.gravatar.com/avatar/rV1PBZvP3I7QymrFqz8zkXRFUZildQjX?s=130&d=identicon",
11543             is_pause_custodial_account => 0,
11544             links => {
11545             backpan_directory => "https://cpan.metacpan.org/authors/id/L/LI/LILLIANSTEWART",
11546             cpan_directory => "http://cpan.org/authors/id/L/LI/LILLIANSTEWART",
11547             cpantesters_matrix => "http://matrix.cpantesters.org/?author=LILLIANSTEWART",
11548             cpantesters_reports => "http://cpantesters.org/author/L/LILLIANSTEWART.html",
11549             cpants => "http://cpants.cpanauthors.org/author/LILLIANSTEWART",
11550             metacpan_explorer => "https://explorer.metacpan.org/?url=/author/LILLIANSTEWART",
11551             repology => "https://repology.org/maintainer/LILLIANSTEWART%40cpan",
11552             },
11553             modules => {
11554             "File::Copy" => {
11555             abstract => "Copy files or filehandles",
11556             archive => "File-Copy-1.43.tar.gz",
11557             author => "LILLIANSTEWART",
11558             authorized => 1,
11559             changes_file => "Changes",
11560             checksum_md5 => "b432a35cae2598ea3ddd54803c3aa03e",
11561             checksum_sha256 => "690d4bd4b5b8d9446dc52f68c65de5db4c44f7b8e4f8c71719fee284c7cec578",
11562             contributors => [qw( TAKAONAKANISHI CHRISTIANREYES )],
11563             date => "1995-10-28T17:10:15",
11564             dependency => [],
11565             deprecated => 0,
11566             distribution => "File-Copy",
11567             download_url => "https://cpan.metacpan.org/authors/id/L/LI/LILLIANSTEWART/File-Copy-1.43.tar.gz",
11568             first => 1,
11569             id => "sFGetSPPKVcxkqNtHW1UnBd2cxc",
11570             license => ["unknown"],
11571             likers => [],
11572             likes => 0,
11573             main_module => "File::Copy",
11574             maturity => "released",
11575             metadata => {
11576             abstract => "unknown",
11577             author => ["unknown"],
11578             dynamic_config => 1,
11579             generated_by => "CPAN::Meta::Converter version 2.150005",
11580             license => ["unknown"],
11581             "meta-spec" => {
11582             url => "http://search.cpan.org/perldoc?CPAN::Meta::Spec",
11583             version => 2,
11584             },
11585             name => "File-Copy",
11586             no_index => {
11587             directory => [qw( t xt inc local perl5 fatlib example blib examples eg )],
11588             },
11589             prereqs => {},
11590             release_status => "stable",
11591             version => 1.4,
11592             },
11593             name => "File-Copy",
11594             package => "File::Copy",
11595             provides => ["File::Copy"],
11596             release => "File-Copy-1.43",
11597             resources => {},
11598             stat => { gid => 1009, mode => 33188, mtime => 814900215, size => 1676, uid => 1009 },
11599             status => "backpan",
11600             tests => undef,
11601             user => "Cvzt2mZnwxN71DkNB7gVmq",
11602             version => 1.43,
11603             version_numified => "1.430",
11604             },
11605             "Task::Dancer" => {
11606             abstract => "Dancer in a box",
11607             archive => "Task-Dancer-2.83.tar.gz",
11608             author => "LILLIANSTEWART",
11609             authorized => 1,
11610             changes_file => "Changes",
11611             checksum_md5 => "bd100afec3fa92f21b369f2012bdf1c3",
11612             checksum_sha256 => "cc2f77c472e733612d22ce64c0b2d3e0591b9c6e6e8933d9005789c3fb6caee7",
11613             contributors => [qw(
11614             ENGYONGCHANG HEHERSONDEGUZMAN YOHEIFUJIWARA
11615             CHRISTIANREYES OLGABOGDANOVA WANTAN
11616             )],
11617             date => "2010-03-06T13:55:15",
11618             dependency => [
11619             {
11620             module => "Test::More",
11621             phase => "build",
11622             relationship => "requires",
11623             version => 0,
11624             },
11625             {
11626             module => "perl",
11627             phase => "runtime",
11628             relationship => "requires",
11629             version => 5.006,
11630             },
11631             ],
11632             deprecated => 0,
11633             distribution => "Task-Dancer",
11634             download_url => "https://cpan.metacpan.org/authors/id/L/LI/LILLIANSTEWART/Task-Dancer-2.83.tar.gz",
11635             first => 0,
11636             id => "L5dq3ay_kJOe_B8B36AIRnQUCP8",
11637             license => ["perl_5"],
11638             likers => [qw( MARINAHOTZ AFONASEIANTONOV WANTAN WANTAN )],
11639             likes => 4,
11640             main_module => "Task::Dancer",
11641             maturity => "released",
11642             metadata => {
11643             abstract => "Dancer in a box",
11644             author => ["Sawyer X <xsawyerx\@cpan.org>"],
11645             dynamic_config => 1,
11646             generated_by => "Sawyer X INC. :), CPAN::Meta::Converter version 2.150005",
11647             license => ["perl_5"],
11648             "meta-spec" => {
11649             url => "http://search.cpan.org/perldoc?CPAN::Meta::Spec",
11650             version => 2,
11651             },
11652             name => "Task-Dancer",
11653             no_index => {
11654             directory => [qw( t xt inc local perl5 fatlib example blib examples eg )],
11655             },
11656             prereqs => {
11657             build => {
11658             requires => { "Test::More" => 0 },
11659             },
11660             runtime => {
11661             requires => { perl => 5.006 },
11662             },
11663             },
11664             provides => {
11665             "Task::Dancer" => { file => "lib/Task/Dancer.pm", version => 0.06 },
11666             },
11667             release_status => "stable",
11668             resources => { license => ["http://dev.perl.org/licenses/"] },
11669             version => 0.06,
11670             },
11671             name => "Task-Dancer",
11672             package => "Task::Dancer",
11673             provides => ["Task::Dancer"],
11674             release => "Task-Dancer-2.83",
11675             resources => { license => ["http://dev.perl.org/licenses/"] },
11676             stat => { gid => 1009, mode => 33204, mtime => 1267883715, size => 23428, uid => 1009 },
11677             status => "backpan",
11678             tests => { fail => 0, na => 0, pass => 28, unknown => 0 },
11679             user => "Cvzt2mZnwxN71DkNB7gVmq",
11680             version => 2.83,
11681             version_numified => "2.830",
11682             },
11683             },
11684             name => "Lillian Stewart",
11685             pauseid => "LILLIANSTEWART",
11686             profile => [{ id => 393836, name => "stackoverflow" }],
11687             updated => "2023-09-24T15:50:29",
11688             user => "Cvzt2mZnwxN71DkNB7gVmq",
11689             },
11690             MARINAHOTZ => {
11691             asciiname => "Marina Hotz",
11692             city => "Zurich",
11693             contributions => [
11694             {
11695             distribution => "PAR-Filter-Squish",
11696             pauseid => "MARINAHOTZ",
11697             release_author => "FLORABARRETT",
11698             release_name => "PAR-Filter-Squish-v2.52.6",
11699             },
11700             {
11701             distribution => "Lingua-Stem",
11702             pauseid => "MARINAHOTZ",
11703             release_author => "DOHYUNNCHOI",
11704             release_name => "Lingua-Stem-v2.44.2",
11705             },
11706             {
11707             distribution => "Server-Control",
11708             pauseid => "MARINAHOTZ",
11709             release_author => "ALEXANDRAPOWELL",
11710             release_name => "Server-Control-0.24",
11711             },
11712             {
11713             distribution => "CGI-Application-Plugin-Eparam",
11714             pauseid => "MARINAHOTZ",
11715             release_author => "MARINAHOTZ",
11716             release_name => "CGI-Application-Plugin-Eparam-v2.38.1",
11717             },
11718             {
11719             distribution => "Facebook-Graph",
11720             pauseid => "MARINAHOTZ",
11721             release_author => "TAKASHIISHIKAWA",
11722             release_name => "Facebook-Graph-v0.38.18",
11723             },
11724             {
11725             distribution => "Net-DNS-Nslookup",
11726             pauseid => "MARINAHOTZ",
11727             release_author => "YOICHIFUJITA",
11728             release_name => "Net-DNS-Nslookup-0.73",
11729             },
11730             {
11731             distribution => "Win32-DirSize",
11732             pauseid => "MARINAHOTZ",
11733             release_author => "TAKAONAKANISHI",
11734             release_name => "Win32-DirSize-v2.31.15",
11735             },
11736             ],
11737             country => "CH",
11738             email => ["marina.hotz\@example.ch"],
11739             favorites => [
11740             {
11741             author => "LILLIANSTEWART",
11742             date => "2010-03-06T13:55:15",
11743             distribution => "Task-Dancer",
11744             },
11745             {
11746             author => "FLORABARRETT",
11747             date => "2006-08-14T15:09:30",
11748             distribution => "PAR-Filter-Squish",
11749             },
11750             {
11751             author => "MINSUNGJUNG",
11752             date => "2010-05-07T21:06:45",
11753             distribution => "PNI",
11754             },
11755             ],
11756             gravatar_url => "https://secure.gravatar.com/avatar/PewCIEDNrQOmrJgHZIFYnRYJgiKVxLe5?s=130&d=identicon",
11757             is_pause_custodial_account => 0,
11758             links => {
11759             backpan_directory => "https://cpan.metacpan.org/authors/id/M/MA/MARINAHOTZ",
11760             cpan_directory => "http://cpan.org/authors/id/M/MA/MARINAHOTZ",
11761             cpantesters_matrix => "http://matrix.cpantesters.org/?author=MARINAHOTZ",
11762             cpantesters_reports => "http://cpantesters.org/author/M/MARINAHOTZ.html",
11763             cpants => "http://cpants.cpanauthors.org/author/MARINAHOTZ",
11764             metacpan_explorer => "https://explorer.metacpan.org/?url=/author/MARINAHOTZ",
11765             repology => "https://repology.org/maintainer/MARINAHOTZ%40cpan",
11766             },
11767             modules => {
11768             "App::gh" => {
11769             abstract => "An apt-like Github utility.",
11770             archive => "App-gh-2.3.tar.gz",
11771             author => "MARINAHOTZ",
11772             authorized => 1,
11773             changes_file => "Changes",
11774             checksum_md5 => "af086952fe11731425ea6c385df6d7b2",
11775             checksum_sha256 => "a114fafb7d7afede7c512e3b5a098450497b13c8b5abf01c6a9cce14e8f117a1",
11776             contributors => [qw( YOICHIFUJITA HUWANATIENZA )],
11777             date => "2010-09-19T17:07:15",
11778             dependency => [
11779             {
11780             module => "File::Path",
11781             phase => "runtime",
11782             relationship => "requires",
11783             version => 0,
11784             },
11785             {
11786             module => "File::Spec",
11787             phase => "runtime",
11788             relationship => "requires",
11789             version => 0,
11790             },
11791             {
11792             module => "File::Temp",
11793             phase => "runtime",
11794             relationship => "requires",
11795             version => 0,
11796             },
11797             {
11798             module => "JSON",
11799             phase => "runtime",
11800             relationship => "requires",
11801             version => 0,
11802             },
11803             {
11804             module => "App::CLI",
11805             phase => "runtime",
11806             relationship => "requires",
11807             version => 0,
11808             },
11809             {
11810             module => "Exporter::Lite",
11811             phase => "runtime",
11812             relationship => "requires",
11813             version => 0,
11814             },
11815             {
11816             module => "LWP::Simple",
11817             phase => "runtime",
11818             relationship => "requires",
11819             version => 0,
11820             },
11821             {
11822             module => "ExtUtils::MakeMaker",
11823             phase => "build",
11824             relationship => "requires",
11825             version => 6.42,
11826             },
11827             {
11828             module => "Test::More",
11829             phase => "build",
11830             relationship => "requires",
11831             version => 0,
11832             },
11833             {
11834             module => "ExtUtils::MakeMaker",
11835             phase => "configure",
11836             relationship => "requires",
11837             version => 6.42,
11838             },
11839             ],
11840             deprecated => 0,
11841             distribution => "App-gh",
11842             download_url => "https://cpan.metacpan.org/authors/id/M/MA/MARINAHOTZ/App-gh-2.3.tar.gz",
11843             first => 0,
11844             id => "5fks6axIPE5Bhuwa7B2zmxAztiQ",
11845             license => ["perl_5"],
11846             likers => [qw( DOHYUNNCHOI CHRISTIANREYES )],
11847             likes => 2,
11848             main_module => "App::gh",
11849             maturity => "released",
11850             metadata => {
11851             abstract => "An apt-like Github utility.",
11852             author => [
11853             "Cornelius, C<< <cornelius.howl at gmail.com> >>",
11854             "Cornelius <cornelius.howl\@gmail.com>",
11855             ],
11856             dynamic_config => 1,
11857             generated_by => "Module::Install version 1.00, CPAN::Meta::Converter version 2.150005",
11858             license => ["perl_5"],
11859             "meta-spec" => {
11860             url => "http://search.cpan.org/perldoc?CPAN::Meta::Spec",
11861             version => 2,
11862             },
11863             name => "App-gh",
11864             no_index => {
11865             directory => [qw(
11866             inc t xt t xt inc local perl5 fatlib example blib
11867             examples eg
11868             )],
11869             },
11870             prereqs => {
11871             build => {
11872             requires => { "ExtUtils::MakeMaker" => 6.42, "Test::More" => 0 },
11873             },
11874             configure => {
11875             requires => { "ExtUtils::MakeMaker" => 6.42 },
11876             },
11877             runtime => {
11878             requires => {
11879             "App::CLI" => 0,
11880             "Exporter::Lite" => 0,
11881             "File::Path" => 0,
11882             "File::Spec" => 0,
11883             "File::Temp" => 0,
11884             JSON => 0,
11885             "LWP::Simple" => 0,
11886             },
11887             },
11888             },
11889             release_status => "stable",
11890             resources => {
11891             license => ["http://dev.perl.org/licenses/"],
11892             repository => { url => "http://github.com/c9s/App-gh" },
11893             },
11894             version => 0.14,
11895             },
11896             name => "App-gh",
11897             package => "App::gh",
11898             provides => [qw(
11899             App::gh App::gh::Command App::gh::Command::Clone
11900             App::gh::Command::Cloneall App::gh::Command::Fork
11901             App::gh::Command::Network App::gh::Command::Pull
11902             App::gh::Command::Search App::gh::Utils
11903             )],
11904             release => "App-gh-2.3",
11905             resources => {
11906             license => ["http://dev.perl.org/licenses/"],
11907             repository => { url => "http://github.com/c9s/App-gh" },
11908             },
11909             stat => { gid => 1009, mode => 33204, mtime => 1284916035, size => 31436, uid => 1009 },
11910             status => "backpan",
11911             tests => { fail => 0, na => 0, pass => 85, unknown => 0 },
11912             user => "2P4X3zSwKIN2nyh1d4ezdz",
11913             version => 2.3,
11914             version_numified => "2.300",
11915             },
11916             "App::Hachero" => {
11917             abstract => "a plaggable log analyzing framework",
11918             archive => "App-Hachero-2.49.tar.gz",
11919             author => "MARINAHOTZ",
11920             authorized => 1,
11921             changes_file => "Changes",
11922             checksum_md5 => "479a4e55ea4c580bcebbd2f5c67dc621",
11923             checksum_sha256 => "acdbc25a2ba1d77598d4272ef8dbfc5fdae68bff2e00a6fd4363e6eea8cbbd9f",
11924             contributors => ["ALESSANDROBAUMANN"],
11925             date => "2010-05-17T03:03:15",
11926             dependency => [
11927             {
11928             module => "Test::MockModule",
11929             phase => "build",
11930             relationship => "requires",
11931             version => 0,
11932             },
11933             {
11934             module => "Test::More",
11935             phase => "build",
11936             relationship => "requires",
11937             version => 0.88,
11938             },
11939             {
11940             module => "ExtUtils::MakeMaker",
11941             phase => "build",
11942             relationship => "requires",
11943             version => 6.42,
11944             },
11945             {
11946             module => "DateTime::Format::MySQL",
11947             phase => "runtime",
11948             relationship => "requires",
11949             version => 0,
11950             },
11951             {
11952             module => "File::Spec",
11953             phase => "runtime",
11954             relationship => "requires",
11955             version => 0,
11956             },
11957             {
11958             module => "File::stat",
11959             phase => "runtime",
11960             relationship => "requires",
11961             version => 0,
11962             },
11963             {
11964             module => "DateTime",
11965             phase => "runtime",
11966             relationship => "requires",
11967             version => 0,
11968             },
11969             {
11970             module => "perl",
11971             phase => "runtime",
11972             relationship => "requires",
11973             version => "v5.8.1",
11974             },
11975             {
11976             module => "Text::CSV_XS",
11977             phase => "runtime",
11978             relationship => "requires",
11979             version => 0,
11980             },
11981             {
11982             module => "Digest::MD5",
11983             phase => "runtime",
11984             relationship => "requires",
11985             version => 0,
11986             },
11987             {
11988             module => "File::Temp",
11989             phase => "runtime",
11990             relationship => "requires",
11991             version => 0,
11992             },
11993             {
11994             module => "Class::Component",
11995             phase => "runtime",
11996             relationship => "requires",
11997             version => 0,
11998             },
11999             {
12000             module => "YAML",
12001             phase => "runtime",
12002             relationship => "requires",
12003             version => 0,
12004             },
12005             {
12006             module => "UNIVERSAL::require",
12007             phase => "runtime",
12008             relationship => "requires",
12009             version => 0,
12010             },
12011             {
12012             module => "URI",
12013             phase => "runtime",
12014             relationship => "requires",
12015             version => 0,
12016             },
12017             {
12018             module => "File::Basename",
12019             phase => "runtime",
12020             relationship => "requires",
12021             version => 0,
12022             },
12023             {
12024             module => "DateTime::Format::HTTP",
12025             phase => "runtime",
12026             relationship => "requires",
12027             version => 0,
12028             },
12029             {
12030             module => "Filter::Util::Call",
12031             phase => "runtime",
12032             relationship => "requires",
12033             version => 0,
12034             },
12035             {
12036             module => "Class::Data::Inheritable",
12037             phase => "runtime",
12038             relationship => "requires",
12039             version => 0,
12040             },
12041             {
12042             module => "URI::QueryParam",
12043             phase => "runtime",
12044             relationship => "requires",
12045             version => 0,
12046             },
12047             {
12048             module => "DateTime::TimeZone",
12049             phase => "runtime",
12050             relationship => "requires",
12051             version => 0,
12052             },
12053             {
12054             module => "Class::Accessor::Fast",
12055             phase => "runtime",
12056             relationship => "requires",
12057             version => 0,
12058             },
12059             {
12060             module => "Regexp::Log::Common",
12061             phase => "runtime",
12062             relationship => "requires",
12063             version => 0,
12064             },
12065             {
12066             module => "Module::Collect",
12067             phase => "runtime",
12068             relationship => "requires",
12069             version => 0.05,
12070             },
12071             {
12072             module => "ExtUtils::MakeMaker",
12073             phase => "configure",
12074             relationship => "requires",
12075             version => 6.42,
12076             },
12077             ],
12078             deprecated => 0,
12079             distribution => "App-Hachero",
12080             download_url => "https://cpan.metacpan.org/authors/id/M/MA/MARINAHOTZ/App-Hachero-2.49.tar.gz",
12081             first => 0,
12082             id => "GAc28g9efF32HvKAnRp8w0jzayg",
12083             license => ["perl_5"],
12084             likers => [qw( WEEWANG YOHEIFUJIWARA )],
12085             likes => 2,
12086             main_module => "App::Hachero",
12087             maturity => "released",
12088             metadata => {
12089             abstract => "a plaggable log analyzing framework",
12090             author => ["Takaaki Mizuno <cpan\@takaaki.info>"],
12091             dynamic_config => 1,
12092             generated_by => "Module::Install version 0.95, CPAN::Meta::Converter version 2.150005",
12093             license => ["perl_5"],
12094             "meta-spec" => {
12095             url => "http://search.cpan.org/perldoc?CPAN::Meta::Spec",
12096             version => 2,
12097             },
12098             name => "App-Hachero",
12099             no_index => {
12100             directory => [qw( inc t t xt inc local perl5 fatlib example blib examples eg )],
12101             },
12102             prereqs => {
12103             build => {
12104             requires => {
12105             "ExtUtils::MakeMaker" => 6.42,
12106             "Test::MockModule" => 0,
12107             "Test::More" => 0.88,
12108             },
12109             },
12110             configure => {
12111             requires => { "ExtUtils::MakeMaker" => 6.42 },
12112             },
12113             runtime => {
12114             requires => {
12115             "Class::Accessor::Fast" => 0,
12116             "Class::Component" => 0,
12117             "Class::Data::Inheritable" => 0,
12118             DateTime => 0,
12119             "DateTime::Format::HTTP" => 0,
12120             "DateTime::Format::MySQL" => 0,
12121             "DateTime::TimeZone" => 0,
12122             "Digest::MD5" => 0,
12123             "File::Basename" => 0,
12124             "File::Spec" => 0,
12125             "File::stat" => 0,
12126             "File::Temp" => 0,
12127             "Filter::Util::Call" => 0,
12128             "Module::Collect" => 0.05,
12129             perl => "v5.8.1",
12130             "Regexp::Log::Common" => 0,
12131             "Text::CSV_XS" => 0,
12132             "UNIVERSAL::require" => 0,
12133             URI => 0,
12134             "URI::QueryParam" => 0,
12135             YAML => 0,
12136             },
12137             },
12138             },
12139             release_status => "stable",
12140             resources => {
12141             license => ["http://dev.perl.org/licenses/"],
12142             repository => { type => "git", url => "git://github.com/lopnor/App-Hachero.git" },
12143             },
12144             version => 0.11,
12145             },
12146             name => "App-Hachero",
12147             package => "App::Hachero",
12148             provides => [qw(
12149             App::Hachero App::Hachero::Plugin::Analyze::AccessCount
12150             App::Hachero::Plugin::Analyze::URI
12151             App::Hachero::Plugin::Analyze::UserAgent
12152             App::Hachero::Plugin::Base
12153             App::Hachero::Plugin::Classify::Robot
12154             App::Hachero::Plugin::Classify::UserAgent
12155             App::Hachero::Plugin::Fetch::FTP
12156             App::Hachero::Plugin::Fetch::Gunzip
12157             App::Hachero::Plugin::Fetch::S3
12158             App::Hachero::Plugin::Filter::AccessTime
12159             App::Hachero::Plugin::Filter::URI
12160             App::Hachero::Plugin::Input::FTP
12161             App::Hachero::Plugin::Input::File
12162             App::Hachero::Plugin::Input::Stdin
12163             App::Hachero::Plugin::Output::CSV
12164             App::Hachero::Plugin::Output::DBIC
12165             App::Hachero::Plugin::Output::Dump
12166             App::Hachero::Plugin::Output::TT
12167             App::Hachero::Plugin::OutputLine::HadoopMap
12168             App::Hachero::Plugin::Parse::Common
12169             App::Hachero::Plugin::Parse::HadoopReduce
12170             App::Hachero::Plugin::Parse::Normalize
12171             App::Hachero::Plugin::Summarize::NarrowDown
12172             App::Hachero::Plugin::Summarize::Scraper
12173             App::Hachero::Result App::Hachero::Result::Data
12174             App::Hachero::Result::PrimaryPerInstance
12175             )],
12176             release => "App-Hachero-2.49",
12177             resources => {
12178             license => ["http://dev.perl.org/licenses/"],
12179             repository => { url => "git://github.com/lopnor/App-Hachero.git" },
12180             },
12181             stat => { gid => 1009, mode => 33204, mtime => 1274065395, size => 72050, uid => 1009 },
12182             status => "backpan",
12183             tests => { fail => 25, na => 0, pass => 6, unknown => 0 },
12184             user => "2P4X3zSwKIN2nyh1d4ezdz",
12185             version => 2.49,
12186             version_numified => "2.490",
12187             },
12188             "CGI::Application::Plugin::Eparam" => {
12189             abstract => "CGI Application Plugin Eparam",
12190             archive => "CGI-Application-Plugin-Eparam-v2.38.1.tar.gz",
12191             author => "MARINAHOTZ",
12192             authorized => 1,
12193             changes_file => "Changes",
12194             checksum_md5 => "d4a9e95a4e10376dd7c4a1bfb83de01b",
12195             checksum_sha256 => "9d7c095e4db6078d225e269a70dcb82d51dbc445f024ad88d3271471da65ae81",
12196             contributors => [qw( BUDAEJUNG MARINAHOTZ TAKASHIISHIKAWA )],
12197             date => "2005-10-18T14:58:27",
12198             dependency => [],
12199             deprecated => 0,
12200             distribution => "CGI-Application-Plugin-Eparam",
12201             download_url => "https://cpan.metacpan.org/authors/id/M/MA/MARINAHOTZ/CGI-Application-Plugin-Eparam-v2.38.1.tar.gz",
12202             first => 0,
12203             id => "7eZdCcntCskmLUGo_q6zowLtxHc",
12204             license => ["unknown"],
12205             likers => [],
12206             likes => 0,
12207             main_module => "CGI::Application::Plugin::Eparam",
12208             maturity => "released",
12209             metadata => {
12210             abstract => "unknown",
12211             author => ["unknown"],
12212             dynamic_config => 1,
12213             generated_by => "ExtUtils::MakeMaker version 6.17, CPAN::Meta::Converter version 2.150005",
12214             license => ["unknown"],
12215             "meta-spec" => {
12216             url => "http://search.cpan.org/perldoc?CPAN::Meta::Spec",
12217             version => 2,
12218             },
12219             name => "CGI-Application-Plugin-Eparam",
12220             no_index => {
12221             directory => [qw( t xt inc local perl5 fatlib example blib examples eg )],
12222             },
12223             prereqs => {},
12224             release_status => "stable",
12225             version => 0.04,
12226             x_installdirs => "site",
12227             x_version_from => "lib/CGI/Application/Plugin/Eparam.pm",
12228             },
12229             name => "CGI-Application-Plugin-Eparam",
12230             package => "CGI::Application::Plugin::Eparam",
12231             provides => ["CGI::Application::Plugin::Eparam"],
12232             release => "CGI-Application-Plugin-Eparam-v2.38.1",
12233             resources => {},
12234             stat => { gid => 1009, mode => 33204, mtime => 1129647507, size => 3679, uid => 1009 },
12235             status => "backpan",
12236             tests => undef,
12237             user => "2P4X3zSwKIN2nyh1d4ezdz",
12238             version => "v2.38.1",
12239             version_numified => 2.038001,
12240             },
12241             },
12242             name => "Marina Hotz",
12243             pauseid => "MARINAHOTZ",
12244             profile => [{ id => 1002650, name => "stackoverflow" }],
12245             updated => "2023-09-24T15:50:29",
12246             user => "2P4X3zSwKIN2nyh1d4ezdz",
12247             },
12248             MINSUNGJUNG => {
12249             asciiname => "Minsung Jung",
12250             city => "Incheon",
12251             contributions => [
12252             {
12253             distribution => "Inline-MonoCS",
12254             pauseid => "MINSUNGJUNG",
12255             release_author => "KANTSOMSRISATI",
12256             release_name => "Inline-MonoCS-v2.45.12",
12257             },
12258             {
12259             distribution => "PAR-Repository",
12260             pauseid => "MINSUNGJUNG",
12261             release_author => "FLORABARRETT",
12262             release_name => "PAR-Repository-0.23",
12263             },
12264             {
12265             distribution => "PAR-Filter-Squish",
12266             pauseid => "MINSUNGJUNG",
12267             release_author => "FLORABARRETT",
12268             release_name => "PAR-Filter-Squish-v2.52.6",
12269             },
12270             {
12271             distribution => "Geo-Postcodes-DK",
12272             pauseid => "MINSUNGJUNG",
12273             release_author => "WEEWANG",
12274             release_name => "Geo-Postcodes-DK-2.13",
12275             },
12276             {
12277             distribution => "Math-SymbolicX-NoSimplification",
12278             pauseid => "MINSUNGJUNG",
12279             release_author => "HELEWISEGIROUX",
12280             release_name => "Math-SymbolicX-NoSimplification-v2.85.13",
12281             },
12282             {
12283             distribution => "Simo",
12284             pauseid => "MINSUNGJUNG",
12285             release_author => "YOHEIFUJIWARA",
12286             release_name => "Simo-v1.55.19",
12287             },
12288             {
12289             distribution => "Bundle-Catalyst",
12290             pauseid => "MINSUNGJUNG",
12291             release_author => "ALEXANDRAPOWELL",
12292             release_name => "Bundle-Catalyst-2.58",
12293             },
12294             {
12295             distribution => "DBIx-Custom",
12296             pauseid => "MINSUNGJUNG",
12297             release_author => "ELAINAREYES",
12298             release_name => "DBIx-Custom-2.37",
12299             },
12300             {
12301             distribution => "VMware-API-LabManager",
12302             pauseid => "MINSUNGJUNG",
12303             release_author => "HELEWISEGIROUX",
12304             release_name => "VMware-API-LabManager-2.96",
12305             },
12306             {
12307             distribution => "Lingua-Stem",
12308             pauseid => "MINSUNGJUNG",
12309             release_author => "DOHYUNNCHOI",
12310             release_name => "Lingua-Stem-v2.44.2",
12311             },
12312             ],
12313             country => "KR",
12314             email => ["minsung.jung\@example.kr"],
12315             favorites => [
12316             {
12317             author => "WANTAN",
12318             date => "2007-10-16T21:45:17",
12319             distribution => "DTS",
12320             },
12321             {
12322             author => "RANGSANSUNTHORN",
12323             date => "2002-05-06T12:31:19",
12324             distribution => "Giza",
12325             },
12326             {
12327             author => "OLGABOGDANOVA",
12328             date => "2006-12-23T16:33:11",
12329             distribution => "Text-Match-FastAlternatives",
12330             },
12331             ],
12332             gravatar_url => "https://secure.gravatar.com/avatar/18Ohl9v4NCWVLA0Bod3qd1UN47c3VGMe?s=130&d=identicon",
12333             is_pause_custodial_account => 0,
12334             links => {
12335             backpan_directory => "https://cpan.metacpan.org/authors/id/M/MI/MINSUNGJUNG",
12336             cpan_directory => "http://cpan.org/authors/id/M/MI/MINSUNGJUNG",
12337             cpantesters_matrix => "http://matrix.cpantesters.org/?author=MINSUNGJUNG",
12338             cpantesters_reports => "http://cpantesters.org/author/M/MINSUNGJUNG.html",
12339             cpants => "http://cpants.cpanauthors.org/author/MINSUNGJUNG",
12340             metacpan_explorer => "https://explorer.metacpan.org/?url=/author/MINSUNGJUNG",
12341             repology => "https://repology.org/maintainer/MINSUNGJUNG%40cpan",
12342             },
12343             modules => {
12344             "Chado::Schema" => {
12345             abstract => "standard DBIx::Class layer for the Chado schema",
12346             archive => "dbic-chado-v0.93.4.tar.gz",
12347             author => "MINSUNGJUNG",
12348             authorized => 1,
12349             changes_file => "Changes",
12350             checksum_md5 => "f4039ec56bc1c6e531654538735cdc08",
12351             checksum_sha256 => "d8c87dc110da011e4750715b20023be946d34562225352b9e438a25f1bcfd1ac",
12352             date => "2009-08-16T00:13:19",
12353             dependency => [
12354             {
12355             module => "Module::Build",
12356             phase => "configure",
12357             relationship => "requires",
12358             version => 0.34,
12359             },
12360             {
12361             module => "perl",
12362             phase => "runtime",
12363             relationship => "requires",
12364             version => "v5.8.0",
12365             },
12366             {
12367             module => "DBIx::Class",
12368             phase => "runtime",
12369             relationship => "requires",
12370             version => 0.07,
12371             },
12372             ],
12373             deprecated => 0,
12374             distribution => "dbic-chado",
12375             download_url => "https://cpan.metacpan.org/authors/id/M/MI/MINSUNGJUNG/dbic-chado-v0.93.4.tar.gz",
12376             first => 1,
12377             id => "Zjj1oL3pzxi7yRm4HjKdyvIVD_U",
12378             license => ["perl_5"],
12379             likers => ["LILLIANSTEWART"],
12380             likes => 1,
12381             main_module => "Chado::Schema",
12382             maturity => "developer",
12383             metadata => {
12384             abstract => "standard DBIx::Class layer for the Chado schema",
12385             author => ["Robert Buels, <rmb32\@cornell.edu>"],
12386             dynamic_config => 1,
12387             generated_by => "Module::Build version 0.34, CPAN::Meta::Converter version 2.150005",
12388             license => ["perl_5"],
12389             "meta-spec" => {
12390             url => "http://search.cpan.org/perldoc?CPAN::Meta::Spec",
12391             version => 2,
12392             },
12393             name => "dbic-chado",
12394             no_index => {
12395             directory => [qw( t xt inc local perl5 fatlib example blib examples eg )],
12396             },
12397             prereqs => {
12398             configure => {
12399             requires => { "Module::Build" => 0.34 },
12400             },
12401             runtime => {
12402             requires => { "DBIx::Class" => 0.07, perl => "v5.8.0" },
12403             },
12404             },
12405             provides => {
12406             "Chado::Schema" => { file => "lib/Chado/Schema.pm" },
12407             "Chado::Schema::Companalysis::Analysis" => { file => "lib/Chado/Schema/Companalysis/Analysis.pm" },
12408             "Chado::Schema::Companalysis::Analysisfeature" => { file => "lib/Chado/Schema/Companalysis/Analysisfeature.pm" },
12409             "Chado::Schema::Companalysis::Analysisprop" => { file => "lib/Chado/Schema/Companalysis/Analysisprop.pm" },
12410             "Chado::Schema::Composite::AllFeatureNames" => { file => "lib/Chado/Schema/Composite/AllFeatureNames.pm" },
12411             "Chado::Schema::Composite::Dfeatureloc" => { file => "lib/Chado/Schema/Composite/Dfeatureloc.pm" },
12412             "Chado::Schema::Composite::FeatureContains" => { file => "lib/Chado/Schema/Composite/FeatureContains.pm" },
12413             "Chado::Schema::Composite::FeatureDifference" => { file => "lib/Chado/Schema/Composite/FeatureDifference.pm" },
12414             "Chado::Schema::Composite::FeatureDisjoint" => { file => "lib/Chado/Schema/Composite/FeatureDisjoint.pm" },
12415             "Chado::Schema::Composite::FeatureDistance" => { file => "lib/Chado/Schema/Composite/FeatureDistance.pm" },
12416             "Chado::Schema::Composite::FeatureIntersection" => { file => "lib/Chado/Schema/Composite/FeatureIntersection.pm" },
12417             "Chado::Schema::Composite::FeatureMeets" => { file => "lib/Chado/Schema/Composite/FeatureMeets.pm" },
12418             "Chado::Schema::Composite::FeatureMeetsOnSameStrand" => {
12419             file => "lib/Chado/Schema/Composite/FeatureMeetsOnSameStrand.pm",
12420             },
12421             "Chado::Schema::Composite::FeaturesetMeets" => { file => "lib/Chado/Schema/Composite/FeaturesetMeets.pm" },
12422             "Chado::Schema::Composite::FeatureUnion" => { file => "lib/Chado/Schema/Composite/FeatureUnion.pm" },
12423             "Chado::Schema::Composite::FLoc" => { file => "lib/Chado/Schema/Composite/FLoc.pm" },
12424             "Chado::Schema::Composite::FnrType" => { file => "lib/Chado/Schema/Composite/FnrType.pm" },
12425             "Chado::Schema::Composite::FpKey" => { file => "lib/Chado/Schema/Composite/FpKey.pm" },
12426             "Chado::Schema::Composite::FType" => { file => "lib/Chado/Schema/Composite/FType.pm" },
12427             "Chado::Schema::Composite::Gff3atts" => { file => "lib/Chado/Schema/Composite/Gff3atts.pm" },
12428             "Chado::Schema::Composite::Gff3view" => { file => "lib/Chado/Schema/Composite/Gff3view.pm" },
12429             "Chado::Schema::Composite::Gffatts" => { file => "lib/Chado/Schema/Composite/Gffatts.pm" },
12430             "Chado::Schema::Contact::Contact" => { file => "lib/Chado/Schema/Contact/Contact.pm" },
12431             "Chado::Schema::Contact::ContactRelationship" => { file => "lib/Chado/Schema/Contact/ContactRelationship.pm" },
12432             "Chado::Schema::Cv::CommonAncestorCvterm" => { file => "lib/Chado/Schema/Cv/CommonAncestorCvterm.pm" },
12433             "Chado::Schema::Cv::CommonDescendantCvterm" => { file => "lib/Chado/Schema/Cv/CommonDescendantCvterm.pm" },
12434             "Chado::Schema::Cv::Cv" => { file => "lib/Chado/Schema/Cv/Cv.pm" },
12435             "Chado::Schema::Cv::CvCvtermCount" => { file => "lib/Chado/Schema/Cv/CvCvtermCount.pm" },
12436             "Chado::Schema::Cv::CvCvtermCountWithObs" => { file => "lib/Chado/Schema/Cv/CvCvtermCountWithObs.pm" },
12437             "Chado::Schema::Cv::CvLeaf" => { file => "lib/Chado/Schema/Cv/CvLeaf.pm" },
12438             "Chado::Schema::Cv::CvLinkCount" => { file => "lib/Chado/Schema/Cv/CvLinkCount.pm" },
12439             "Chado::Schema::Cv::CvPathCount" => { file => "lib/Chado/Schema/Cv/CvPathCount.pm" },
12440             "Chado::Schema::Cv::CvRoot" => { file => "lib/Chado/Schema/Cv/CvRoot.pm" },
12441             "Chado::Schema::Cv::Cvterm" => { file => "lib/Chado/Schema/Cv/Cvterm.pm" },
12442             "Chado::Schema::Cv::CvtermDbxref" => { file => "lib/Chado/Schema/Cv/CvtermDbxref.pm" },
12443             "Chado::Schema::Cv::Cvtermpath" => { file => "lib/Chado/Schema/Cv/Cvtermpath.pm" },
12444             "Chado::Schema::Cv::Cvtermprop" => { file => "lib/Chado/Schema/Cv/Cvtermprop.pm" },
12445             "Chado::Schema::Cv::CvtermRelationship" => { file => "lib/Chado/Schema/Cv/CvtermRelationship.pm" },
12446             "Chado::Schema::Cv::Cvtermsynonym" => { file => "lib/Chado/Schema/Cv/Cvtermsynonym.pm" },
12447             "Chado::Schema::Cv::Dbxrefprop" => { file => "lib/Chado/Schema/Cv/Dbxrefprop.pm" },
12448             "Chado::Schema::Cv::StatsPathsToRoot" => { file => "lib/Chado/Schema/Cv/StatsPathsToRoot.pm" },
12449             "Chado::Schema::Expression::Eimage" => { file => "lib/Chado/Schema/Expression/Eimage.pm" },
12450             "Chado::Schema::Expression::Expression" => { file => "lib/Chado/Schema/Expression/Expression.pm" },
12451             "Chado::Schema::Expression::ExpressionCvterm" => { file => "lib/Chado/Schema/Expression/ExpressionCvterm.pm" },
12452             "Chado::Schema::Expression::ExpressionCvtermprop" => { file => "lib/Chado/Schema/Expression/ExpressionCvtermprop.pm" },
12453             "Chado::Schema::Expression::ExpressionImage" => { file => "lib/Chado/Schema/Expression/ExpressionImage.pm" },
12454             "Chado::Schema::Expression::Expressionprop" => { file => "lib/Chado/Schema/Expression/Expressionprop.pm" },
12455             "Chado::Schema::Expression::ExpressionPub" => { file => "lib/Chado/Schema/Expression/ExpressionPub.pm" },
12456             "Chado::Schema::Expression::FeatureExpression" => { file => "lib/Chado/Schema/Expression/FeatureExpression.pm" },
12457             "Chado::Schema::Expression::FeatureExpressionprop" => { file => "lib/Chado/Schema/Expression/FeatureExpressionprop.pm" },
12458             "Chado::Schema::General::Db" => { file => "lib/Chado/Schema/General/Db.pm" },
12459             "Chado::Schema::General::DbDbxrefCount" => { file => "lib/Chado/Schema/General/DbDbxrefCount.pm" },
12460             "Chado::Schema::General::Dbxref" => { file => "lib/Chado/Schema/General/Dbxref.pm" },
12461             "Chado::Schema::General::Project" => { file => "lib/Chado/Schema/General/Project.pm" },
12462             "Chado::Schema::General::Tableinfo" => { file => "lib/Chado/Schema/General/Tableinfo.pm" },
12463             "Chado::Schema::Genetic::Environment" => { file => "lib/Chado/Schema/Genetic/Environment.pm" },
12464             "Chado::Schema::Genetic::EnvironmentCvterm" => { file => "lib/Chado/Schema/Genetic/EnvironmentCvterm.pm" },
12465             "Chado::Schema::Genetic::FeatureGenotype" => { file => "lib/Chado/Schema/Genetic/FeatureGenotype.pm" },
12466             "Chado::Schema::Genetic::Genotype" => { file => "lib/Chado/Schema/Genetic/Genotype.pm" },
12467             "Chado::Schema::Genetic::Phendesc" => { file => "lib/Chado/Schema/Genetic/Phendesc.pm" },
12468             "Chado::Schema::Genetic::PhenotypeComparison" => { file => "lib/Chado/Schema/Genetic/PhenotypeComparison.pm" },
12469             "Chado::Schema::Genetic::PhenotypeComparisonCvterm" => { file => "lib/Chado/Schema/Genetic/PhenotypeComparisonCvterm.pm" },
12470             "Chado::Schema::Genetic::Phenstatement" => { file => "lib/Chado/Schema/Genetic/Phenstatement.pm" },
12471             "Chado::Schema::Library::Library" => { file => "lib/Chado/Schema/Library/Library.pm" },
12472             "Chado::Schema::Library::LibraryCvterm" => { file => "lib/Chado/Schema/Library/LibraryCvterm.pm" },
12473             "Chado::Schema::Library::LibraryDbxref" => { file => "lib/Chado/Schema/Library/LibraryDbxref.pm" },
12474             "Chado::Schema::Library::LibraryFeature" => { file => "lib/Chado/Schema/Library/LibraryFeature.pm" },
12475             "Chado::Schema::Library::Libraryprop" => { file => "lib/Chado/Schema/Library/Libraryprop.pm" },
12476             "Chado::Schema::Library::LibrarypropPub" => { file => "lib/Chado/Schema/Library/LibrarypropPub.pm" },
12477             "Chado::Schema::Library::LibraryPub" => { file => "lib/Chado/Schema/Library/LibraryPub.pm" },
12478             "Chado::Schema::Library::LibrarySynonym" => { file => "lib/Chado/Schema/Library/LibrarySynonym.pm" },
12479             "Chado::Schema::Mage::Acquisition" => { file => "lib/Chado/Schema/Mage/Acquisition.pm" },
12480             "Chado::Schema::Mage::Acquisitionprop" => { file => "lib/Chado/Schema/Mage/Acquisitionprop.pm" },
12481             "Chado::Schema::Mage::AcquisitionRelationship" => { file => "lib/Chado/Schema/Mage/AcquisitionRelationship.pm" },
12482             "Chado::Schema::Mage::Arraydesign" => { file => "lib/Chado/Schema/Mage/Arraydesign.pm" },
12483             "Chado::Schema::Mage::Arraydesignprop" => { file => "lib/Chado/Schema/Mage/Arraydesignprop.pm" },
12484             "Chado::Schema::Mage::Assay" => { file => "lib/Chado/Schema/Mage/Assay.pm" },
12485             "Chado::Schema::Mage::AssayBiomaterial" => { file => "lib/Chado/Schema/Mage/AssayBiomaterial.pm" },
12486             "Chado::Schema::Mage::AssayProject" => { file => "lib/Chado/Schema/Mage/AssayProject.pm" },
12487             "Chado::Schema::Mage::Assayprop" => { file => "lib/Chado/Schema/Mage/Assayprop.pm" },
12488             "Chado::Schema::Mage::Biomaterial" => { file => "lib/Chado/Schema/Mage/Biomaterial.pm" },
12489             "Chado::Schema::Mage::BiomaterialDbxref" => { file => "lib/Chado/Schema/Mage/BiomaterialDbxref.pm" },
12490             "Chado::Schema::Mage::Biomaterialprop" => { file => "lib/Chado/Schema/Mage/Biomaterialprop.pm" },
12491             "Chado::Schema::Mage::BiomaterialRelationship" => { file => "lib/Chado/Schema/Mage/BiomaterialRelationship.pm" },
12492             "Chado::Schema::Mage::BiomaterialTreatment" => { file => "lib/Chado/Schema/Mage/BiomaterialTreatment.pm" },
12493             "Chado::Schema::Mage::Channel" => { file => "lib/Chado/Schema/Mage/Channel.pm" },
12494             "Chado::Schema::Mage::Control" => { file => "lib/Chado/Schema/Mage/Control.pm" },
12495             "Chado::Schema::Mage::Element" => { file => "lib/Chado/Schema/Mage/Element.pm" },
12496             "Chado::Schema::Mage::ElementRelationship" => { file => "lib/Chado/Schema/Mage/ElementRelationship.pm" },
12497             "Chado::Schema::Mage::Elementresult" => { file => "lib/Chado/Schema/Mage/Elementresult.pm" },
12498             "Chado::Schema::Mage::ElementresultRelationship" => { file => "lib/Chado/Schema/Mage/ElementresultRelationship.pm" },
12499             "Chado::Schema::Mage::Magedocumentation" => { file => "lib/Chado/Schema/Mage/Magedocumentation.pm" },
12500             "Chado::Schema::Mage::Mageml" => { file => "lib/Chado/Schema/Mage/Mageml.pm" },
12501             "Chado::Schema::Mage::Protocol" => { file => "lib/Chado/Schema/Mage/Protocol.pm" },
12502             "Chado::Schema::Mage::Protocolparam" => { file => "lib/Chado/Schema/Mage/Protocolparam.pm" },
12503             "Chado::Schema::Mage::Quantification" => { file => "lib/Chado/Schema/Mage/Quantification.pm" },
12504             "Chado::Schema::Mage::Quantificationprop" => { file => "lib/Chado/Schema/Mage/Quantificationprop.pm" },
12505             "Chado::Schema::Mage::QuantificationRelationship" => { file => "lib/Chado/Schema/Mage/QuantificationRelationship.pm" },
12506             "Chado::Schema::Mage::Study" => { file => "lib/Chado/Schema/Mage/Study.pm" },
12507             "Chado::Schema::Mage::StudyAssay" => { file => "lib/Chado/Schema/Mage/StudyAssay.pm" },
12508             "Chado::Schema::Mage::Studydesign" => { file => "lib/Chado/Schema/Mage/Studydesign.pm" },
12509             "Chado::Schema::Mage::Studydesignprop" => { file => "lib/Chado/Schema/Mage/Studydesignprop.pm" },
12510             "Chado::Schema::Mage::Studyfactor" => { file => "lib/Chado/Schema/Mage/Studyfactor.pm" },
12511             "Chado::Schema::Mage::Studyfactorvalue" => { file => "lib/Chado/Schema/Mage/Studyfactorvalue.pm" },
12512             "Chado::Schema::Mage::Studyprop" => { file => "lib/Chado/Schema/Mage/Studyprop.pm" },
12513             "Chado::Schema::Mage::StudypropFeature" => { file => "lib/Chado/Schema/Mage/StudypropFeature.pm" },
12514             "Chado::Schema::Mage::Treatment" => { file => "lib/Chado/Schema/Mage/Treatment.pm" },
12515             "Chado::Schema::Map::Featuremap" => { file => "lib/Chado/Schema/Map/Featuremap.pm" },
12516             "Chado::Schema::Map::FeaturemapPub" => { file => "lib/Chado/Schema/Map/FeaturemapPub.pm" },
12517             "Chado::Schema::Map::Featurepos" => { file => "lib/Chado/Schema/Map/Featurepos.pm" },
12518             "Chado::Schema::Map::Featurerange" => { file => "lib/Chado/Schema/Map/Featurerange.pm" },
12519             "Chado::Schema::Organism::Organism" => { file => "lib/Chado/Schema/Organism/Organism.pm" },
12520             "Chado::Schema::Organism::OrganismDbxref" => { file => "lib/Chado/Schema/Organism/OrganismDbxref.pm" },
12521             "Chado::Schema::Organism::Organismprop" => { file => "lib/Chado/Schema/Organism/Organismprop.pm" },
12522             "Chado::Schema::Phenotype::FeaturePhenotype" => { file => "lib/Chado/Schema/Phenotype/FeaturePhenotype.pm" },
12523             "Chado::Schema::Phenotype::Phenotype" => { file => "lib/Chado/Schema/Phenotype/Phenotype.pm" },
12524             "Chado::Schema::Phenotype::PhenotypeCvterm" => { file => "lib/Chado/Schema/Phenotype/PhenotypeCvterm.pm" },
12525             "Chado::Schema::Phylogeny::Phylonode" => { file => "lib/Chado/Schema/Phylogeny/Phylonode.pm" },
12526             "Chado::Schema::Phylogeny::PhylonodeDbxref" => { file => "lib/Chado/Schema/Phylogeny/PhylonodeDbxref.pm" },
12527             "Chado::Schema::Phylogeny::PhylonodeOrganism" => { file => "lib/Chado/Schema/Phylogeny/PhylonodeOrganism.pm" },
12528             "Chado::Schema::Phylogeny::Phylonodeprop" => { file => "lib/Chado/Schema/Phylogeny/Phylonodeprop.pm" },
12529             "Chado::Schema::Phylogeny::PhylonodePub" => { file => "lib/Chado/Schema/Phylogeny/PhylonodePub.pm" },
12530             "Chado::Schema::Phylogeny::PhylonodeRelationship" => { file => "lib/Chado/Schema/Phylogeny/PhylonodeRelationship.pm" },
12531             "Chado::Schema::Phylogeny::Phylotree" => { file => "lib/Chado/Schema/Phylogeny/Phylotree.pm" },
12532             "Chado::Schema::Phylogeny::PhylotreePub" => { file => "lib/Chado/Schema/Phylogeny/PhylotreePub.pm" },
12533             "Chado::Schema::Pub::Pub" => { file => "lib/Chado/Schema/Pub/Pub.pm" },
12534             "Chado::Schema::Pub::Pubauthor" => { file => "lib/Chado/Schema/Pub/Pubauthor.pm" },
12535             "Chado::Schema::Pub::PubDbxref" => { file => "lib/Chado/Schema/Pub/PubDbxref.pm" },
12536             "Chado::Schema::Pub::Pubprop" => { file => "lib/Chado/Schema/Pub/Pubprop.pm" },
12537             "Chado::Schema::Pub::PubRelationship" => { file => "lib/Chado/Schema/Pub/PubRelationship.pm" },
12538             "Chado::Schema::Sequence::Cvtermsynonym" => { file => "lib/Chado/Schema/Sequence/Cvtermsynonym.pm" },
12539             "Chado::Schema::Sequence::Feature" => { file => "lib/Chado/Schema/Sequence/Feature.pm" },
12540             "Chado::Schema::Sequence::FeatureCvterm" => { file => "lib/Chado/Schema/Sequence/FeatureCvterm.pm" },
12541             "Chado::Schema::Sequence::FeatureCvtermDbxref" => { file => "lib/Chado/Schema/Sequence/FeatureCvtermDbxref.pm" },
12542             "Chado::Schema::Sequence::FeatureCvtermprop" => { file => "lib/Chado/Schema/Sequence/FeatureCvtermprop.pm" },
12543             "Chado::Schema::Sequence::FeatureCvtermPub" => { file => "lib/Chado/Schema/Sequence/FeatureCvtermPub.pm" },
12544             "Chado::Schema::Sequence::FeatureDbxref" => { file => "lib/Chado/Schema/Sequence/FeatureDbxref.pm" },
12545             "Chado::Schema::Sequence::Featureloc" => { file => "lib/Chado/Schema/Sequence/Featureloc.pm" },
12546             "Chado::Schema::Sequence::FeaturelocPub" => { file => "lib/Chado/Schema/Sequence/FeaturelocPub.pm" },
12547             "Chado::Schema::Sequence::Featureprop" => { file => "lib/Chado/Schema/Sequence/Featureprop.pm" },
12548             "Chado::Schema::Sequence::FeaturepropPub" => { file => "lib/Chado/Schema/Sequence/FeaturepropPub.pm" },
12549             "Chado::Schema::Sequence::FeaturePub" => { file => "lib/Chado/Schema/Sequence/FeaturePub.pm" },
12550             "Chado::Schema::Sequence::FeaturePubprop" => { file => "lib/Chado/Schema/Sequence/FeaturePubprop.pm" },
12551             "Chado::Schema::Sequence::FeatureRelationship" => { file => "lib/Chado/Schema/Sequence/FeatureRelationship.pm" },
12552             "Chado::Schema::Sequence::FeatureRelationshipprop" => { file => "lib/Chado/Schema/Sequence/FeatureRelationshipprop.pm" },
12553             "Chado::Schema::Sequence::FeatureRelationshippropPub" => {
12554             file => "lib/Chado/Schema/Sequence/FeatureRelationshippropPub.pm",
12555             },
12556             "Chado::Schema::Sequence::FeatureRelationshipPub" => { file => "lib/Chado/Schema/Sequence/FeatureRelationshipPub.pm" },
12557             "Chado::Schema::Sequence::FeatureSynonym" => { file => "lib/Chado/Schema/Sequence/FeatureSynonym.pm" },
12558             "Chado::Schema::Sequence::Synonym" => { file => "lib/Chado/Schema/Sequence/Synonym.pm" },
12559             "Chado::Schema::Sequence::TypeFeatureCount" => { file => "lib/Chado/Schema/Sequence/TypeFeatureCount.pm" },
12560             "Chado::Schema::Stock::Stock" => { file => "lib/Chado/Schema/Stock/Stock.pm" },
12561             "Chado::Schema::Stock::Stockcollection" => { file => "lib/Chado/Schema/Stock/Stockcollection.pm" },
12562             "Chado::Schema::Stock::Stockcollectionprop" => { file => "lib/Chado/Schema/Stock/Stockcollectionprop.pm" },
12563             "Chado::Schema::Stock::StockcollectionStock" => { file => "lib/Chado/Schema/Stock/StockcollectionStock.pm" },
12564             "Chado::Schema::Stock::StockCvterm" => { file => "lib/Chado/Schema/Stock/StockCvterm.pm" },
12565             "Chado::Schema::Stock::StockDbxref" => { file => "lib/Chado/Schema/Stock/StockDbxref.pm" },
12566             "Chado::Schema::Stock::StockGenotype" => { file => "lib/Chado/Schema/Stock/StockGenotype.pm" },
12567             "Chado::Schema::Stock::Stockprop" => { file => "lib/Chado/Schema/Stock/Stockprop.pm" },
12568             "Chado::Schema::Stock::StockpropPub" => { file => "lib/Chado/Schema/Stock/StockpropPub.pm" },
12569             "Chado::Schema::Stock::StockPub" => { file => "lib/Chado/Schema/Stock/StockPub.pm" },
12570             "Chado::Schema::Stock::StockRelationship" => { file => "lib/Chado/Schema/Stock/StockRelationship.pm" },
12571             "Chado::Schema::Stock::StockRelationshipPub" => { file => "lib/Chado/Schema/Stock/StockRelationshipPub.pm" },
12572             },
12573             release_status => "testing",
12574             resources => {
12575             license => ["http://dev.perl.org/licenses/"],
12576             repository => { url => "http://github.com/rbuels/dbic_chado" },
12577             },
12578             version => "0.01_01",
12579             },
12580             name => "dbic-chado",
12581             package => "Chado::Schema",
12582             provides => [qw(
12583             Chado::Schema Chado::Schema::Companalysis::Analysis
12584             Chado::Schema::Companalysis::Analysisfeature
12585             Chado::Schema::Companalysis::Analysisprop
12586             Chado::Schema::Composite::AllFeatureNames
12587             Chado::Schema::Composite::Dfeatureloc
12588             Chado::Schema::Composite::FLoc
12589             Chado::Schema::Composite::FType
12590             Chado::Schema::Composite::FeatureContains
12591             Chado::Schema::Composite::FeatureDifference
12592             Chado::Schema::Composite::FeatureDisjoint
12593             Chado::Schema::Composite::FeatureDistance
12594             Chado::Schema::Composite::FeatureIntersection
12595             Chado::Schema::Composite::FeatureMeets
12596             Chado::Schema::Composite::FeatureMeetsOnSameStrand
12597             Chado::Schema::Composite::FeatureUnion
12598             Chado::Schema::Composite::FeaturesetMeets
12599             Chado::Schema::Composite::FnrType
12600             Chado::Schema::Composite::FpKey
12601             Chado::Schema::Composite::Gff3atts
12602             Chado::Schema::Composite::Gff3view
12603             Chado::Schema::Composite::Gffatts
12604             Chado::Schema::Contact::Contact
12605             Chado::Schema::Contact::ContactRelationship
12606             Chado::Schema::Cv::CommonAncestorCvterm
12607             Chado::Schema::Cv::CommonDescendantCvterm
12608             Chado::Schema::Cv::Cv Chado::Schema::Cv::CvCvtermCount
12609             Chado::Schema::Cv::CvCvtermCountWithObs
12610             Chado::Schema::Cv::CvLeaf Chado::Schema::Cv::CvLinkCount
12611             Chado::Schema::Cv::CvPathCount Chado::Schema::Cv::CvRoot
12612             Chado::Schema::Cv::Cvterm
12613             Chado::Schema::Cv::CvtermDbxref
12614             Chado::Schema::Cv::CvtermRelationship
12615             Chado::Schema::Cv::Cvtermpath
12616             Chado::Schema::Cv::Cvtermprop
12617             Chado::Schema::Cv::Cvtermsynonym
12618             Chado::Schema::Cv::Dbxrefprop
12619             Chado::Schema::Cv::StatsPathsToRoot
12620             Chado::Schema::Expression::Eimage
12621             Chado::Schema::Expression::Expression
12622             Chado::Schema::Expression::ExpressionCvterm
12623             Chado::Schema::Expression::ExpressionCvtermprop
12624             Chado::Schema::Expression::ExpressionImage
12625             Chado::Schema::Expression::ExpressionPub
12626             Chado::Schema::Expression::Expressionprop
12627             Chado::Schema::Expression::FeatureExpression
12628             Chado::Schema::Expression::FeatureExpressionprop
12629             Chado::Schema::General::Db
12630             Chado::Schema::General::DbDbxrefCount
12631             Chado::Schema::General::Dbxref
12632             Chado::Schema::General::Project
12633             Chado::Schema::General::Tableinfo
12634             Chado::Schema::Genetic::Environment
12635             Chado::Schema::Genetic::EnvironmentCvterm
12636             Chado::Schema::Genetic::FeatureGenotype
12637             Chado::Schema::Genetic::Genotype
12638             Chado::Schema::Genetic::Phendesc
12639             Chado::Schema::Genetic::PhenotypeComparison
12640             Chado::Schema::Genetic::PhenotypeComparisonCvterm
12641             Chado::Schema::Genetic::Phenstatement
12642             Chado::Schema::Library::Library
12643             Chado::Schema::Library::LibraryCvterm
12644             Chado::Schema::Library::LibraryDbxref
12645             Chado::Schema::Library::LibraryFeature
12646             Chado::Schema::Library::LibraryPub
12647             Chado::Schema::Library::LibrarySynonym
12648             Chado::Schema::Library::Libraryprop
12649             Chado::Schema::Library::LibrarypropPub
12650             Chado::Schema::Mage::Acquisition
12651             Chado::Schema::Mage::AcquisitionRelationship
12652             Chado::Schema::Mage::Acquisitionprop
12653             Chado::Schema::Mage::Arraydesign
12654             Chado::Schema::Mage::Arraydesignprop
12655             Chado::Schema::Mage::Assay
12656             Chado::Schema::Mage::AssayBiomaterial
12657             Chado::Schema::Mage::AssayProject
12658             Chado::Schema::Mage::Assayprop
12659             Chado::Schema::Mage::Biomaterial
12660             Chado::Schema::Mage::BiomaterialDbxref
12661             Chado::Schema::Mage::BiomaterialRelationship
12662             Chado::Schema::Mage::BiomaterialTreatment
12663             Chado::Schema::Mage::Biomaterialprop
12664             Chado::Schema::Mage::Channel
12665             Chado::Schema::Mage::Control
12666             Chado::Schema::Mage::Element
12667             Chado::Schema::Mage::ElementRelationship
12668             Chado::Schema::Mage::Elementresult
12669             Chado::Schema::Mage::ElementresultRelationship
12670             Chado::Schema::Mage::Magedocumentation
12671             Chado::Schema::Mage::Mageml
12672             Chado::Schema::Mage::Protocol
12673             Chado::Schema::Mage::Protocolparam
12674             Chado::Schema::Mage::Quantification
12675             Chado::Schema::Mage::QuantificationRelationship
12676             Chado::Schema::Mage::Quantificationprop
12677             Chado::Schema::Mage::Study
12678             Chado::Schema::Mage::StudyAssay
12679             Chado::Schema::Mage::Studydesign
12680             Chado::Schema::Mage::Studydesignprop
12681             Chado::Schema::Mage::Studyfactor
12682             Chado::Schema::Mage::Studyfactorvalue
12683             Chado::Schema::Mage::Studyprop
12684             Chado::Schema::Mage::StudypropFeature
12685             Chado::Schema::Mage::Treatment
12686             Chado::Schema::Map::Featuremap
12687             Chado::Schema::Map::FeaturemapPub
12688             Chado::Schema::Map::Featurepos
12689             Chado::Schema::Map::Featurerange
12690             Chado::Schema::Organism::Organism
12691             Chado::Schema::Organism::OrganismDbxref
12692             Chado::Schema::Organism::Organismprop
12693             Chado::Schema::Phenotype::FeaturePhenotype
12694             Chado::Schema::Phenotype::Phenotype
12695             Chado::Schema::Phenotype::PhenotypeCvterm
12696             Chado::Schema::Phylogeny::Phylonode
12697             Chado::Schema::Phylogeny::PhylonodeDbxref
12698             Chado::Schema::Phylogeny::PhylonodeOrganism
12699             Chado::Schema::Phylogeny::PhylonodePub
12700             Chado::Schema::Phylogeny::PhylonodeRelationship
12701             Chado::Schema::Phylogeny::Phylonodeprop
12702             Chado::Schema::Phylogeny::Phylotree
12703             Chado::Schema::Phylogeny::PhylotreePub
12704             Chado::Schema::Pub::Pub Chado::Schema::Pub::PubDbxref
12705             Chado::Schema::Pub::PubRelationship
12706             Chado::Schema::Pub::Pubauthor
12707             Chado::Schema::Pub::Pubprop
12708             Chado::Schema::Sequence::Cvtermsynonym
12709             Chado::Schema::Sequence::Feature
12710             Chado::Schema::Sequence::FeatureCvterm
12711             Chado::Schema::Sequence::FeatureCvtermDbxref
12712             Chado::Schema::Sequence::FeatureCvtermPub
12713             Chado::Schema::Sequence::FeatureCvtermprop
12714             Chado::Schema::Sequence::FeatureDbxref
12715             Chado::Schema::Sequence::FeaturePub
12716             Chado::Schema::Sequence::FeaturePubprop
12717             Chado::Schema::Sequence::FeatureRelationship
12718             Chado::Schema::Sequence::FeatureRelationshipPub
12719             Chado::Schema::Sequence::FeatureRelationshipprop
12720             Chado::Schema::Sequence::FeatureRelationshippropPub
12721             Chado::Schema::Sequence::FeatureSynonym
12722             Chado::Schema::Sequence::Featureloc
12723             Chado::Schema::Sequence::FeaturelocPub
12724             Chado::Schema::Sequence::Featureprop
12725             Chado::Schema::Sequence::FeaturepropPub
12726             Chado::Schema::Sequence::Synonym
12727             Chado::Schema::Sequence::TypeFeatureCount
12728             Chado::Schema::Stock::Stock
12729             Chado::Schema::Stock::StockCvterm
12730             Chado::Schema::Stock::StockDbxref
12731             Chado::Schema::Stock::StockGenotype
12732             Chado::Schema::Stock::StockPub
12733             Chado::Schema::Stock::StockRelationship
12734             Chado::Schema::Stock::StockRelationshipPub
12735             Chado::Schema::Stock::Stockcollection
12736             Chado::Schema::Stock::StockcollectionStock
12737             Chado::Schema::Stock::Stockcollectionprop
12738             Chado::Schema::Stock::Stockprop
12739             Chado::Schema::Stock::StockpropPub
12740             )],
12741             release => "dbic-chado-v0.93.4",
12742             resources => {
12743             license => ["http://dev.perl.org/licenses/"],
12744             repository => { url => "http://github.com/rbuels/dbic_chado" },
12745             },
12746             stat => { gid => 1009, mode => 33204, mtime => 1250381599, size => 92506, uid => 1009 },
12747             status => "backpan",
12748             tests => { fail => 14, na => 0, pass => 0, unknown => 0 },
12749             user => "a26iHQmSabQLrbpXdqr6PF",
12750             version => "v0.93.4",
12751             version_numified => 0.093004,
12752             },
12753             "Module::ScanDeps" => {
12754             abstract => "Recursively scan Perl code for dependencies",
12755             archive => "Module-ScanDeps-0.68.tar.gz",
12756             author => "MINSUNGJUNG",
12757             authorized => 1,
12758             changes_file => "Changes",
12759             checksum_md5 => "9ed40939c36511f8ef130ecdd29b8175",
12760             checksum_sha256 => "a3f18e3cffc89051fb01807ad264e5b1bf680f6af79bdd7ac8a819e1915acafc",
12761             contributors => ["ANTHONYGOYETTE"],
12762             date => "2006-06-30T19:12:26",
12763             dependency => [
12764             {
12765             module => "perl",
12766             phase => "runtime",
12767             relationship => "requires",
12768             version => 5.004,
12769             },
12770             {
12771             module => "File::Temp",
12772             phase => "runtime",
12773             relationship => "requires",
12774             version => 0,
12775             },
12776             ],
12777             deprecated => 0,
12778             distribution => "Module-ScanDeps",
12779             download_url => "https://cpan.metacpan.org/authors/id/M/MI/MINSUNGJUNG/Module-ScanDeps-0.68.tar.gz",
12780             first => 0,
12781             id => "01_QwNxdOIkzybb_VwQDpobhsHI",
12782             license => ["perl_5"],
12783             likers => [qw( WEEWANG CHRISTIANREYES )],
12784             likes => 2,
12785             main_module => "Module::ScanDeps",
12786             maturity => "released",
12787             metadata => {
12788             abstract => "Recursively scan Perl code for dependencies",
12789             author => ["Audrey Tang <autrijus\@autrijus.org>"],
12790             dynamic_config => 1,
12791             generated_by => "Module::Install version 0.63, CPAN::Meta::Converter version 2.150005",
12792             license => ["perl_5"],
12793             "meta-spec" => {
12794             url => "http://search.cpan.org/perldoc?CPAN::Meta::Spec",
12795             version => 2,
12796             },
12797             name => "Module-ScanDeps",
12798             no_index => {
12799             directory => [qw( inc t t xt inc local perl5 fatlib example blib examples eg )],
12800             },
12801             prereqs => {
12802             runtime => {
12803             requires => { "File::Temp" => 0, perl => 5.004 },
12804             },
12805             },
12806             release_status => "stable",
12807             version => 0.61,
12808             },
12809             name => "Module-ScanDeps",
12810             package => "Module::ScanDeps",
12811             provides => [qw( Module::ScanDeps Module::ScanDeps::DataFeed )],
12812             release => "Module-ScanDeps-0.68",
12813             resources => {},
12814             stat => { gid => 1009, mode => 33188, mtime => 1151694746, size => 28884, uid => 1009 },
12815             status => "backpan",
12816             tests => { fail => 0, na => 0, pass => 4, unknown => 0 },
12817             user => "a26iHQmSabQLrbpXdqr6PF",
12818             version => 0.68,
12819             version_numified => "0.680",
12820             },
12821             Mpp => {
12822             abstract => "Common subs for makepp and makeppreplay",
12823             archive => "makepp-2.66.tar.gz",
12824             author => "MINSUNGJUNG",
12825             authorized => 1,
12826             changes_file => "Changes",
12827             checksum_md5 => "2900d1b063d3d6cd860b2c87e9b427cc",
12828             checksum_sha256 => "b3f1c2aebbc4002444c27e939b0e19d03c5b8c9876b8684c0cb8982efbb031e4",
12829             contributors => [qw( YOHEIFUJIWARA RANGSANSUNTHORN )],
12830             date => "2012-01-11T21:32:40",
12831             dependency => [],
12832             deprecated => 0,
12833             distribution => "makepp",
12834             download_url => "https://cpan.metacpan.org/authors/id/M/MI/MINSUNGJUNG/makepp-2.66.tar.gz",
12835             first => 0,
12836             id => "jasl40X_Yy87joyTRJY5gGkg1WA",
12837             license => ["unknown"],
12838             likers => [],
12839             likes => 0,
12840             main_module => "Mpp",
12841             maturity => "released",
12842             metadata => {
12843             abstract => "unknown",
12844             author => ["unknown"],
12845             dynamic_config => 1,
12846             generated_by => "CPAN::Meta::Converter version 2.150005",
12847             license => ["unknown"],
12848             "meta-spec" => {
12849             url => "http://search.cpan.org/perldoc?CPAN::Meta::Spec",
12850             version => 2,
12851             },
12852             name => "makepp",
12853             no_index => {
12854             directory => [qw( t xt inc local perl5 fatlib example blib examples eg )],
12855             },
12856             prereqs => {},
12857             release_status => "stable",
12858             version => "2.0",
12859             },
12860             name => "makepp",
12861             package => "Mpp",
12862             provides => [qw(
12863             Mpp Mpp Mpp::ActionParser::Legacy
12864             Mpp::ActionParser::Specific Mpp::BuildCache
12865             Mpp::BuildCache::Entry Mpp::BuildCacheControl
12866             Mpp::BuildCheck
12867             Mpp::BuildCheck::architecture_independent
12868             Mpp::BuildCheck::exact_match
12869             Mpp::BuildCheck::ignore_action
12870             Mpp::BuildCheck::only_action
12871             Mpp::BuildCheck::target_newer Mpp::Cmds
12872             Mpp::CommandParser Mpp::CommandParser::Esql
12873             Mpp::CommandParser::Gcc Mpp::CommandParser::Swig
12874             Mpp::CommandParser::Vcs Mpp::DefaultRule
12875             Mpp::DefaultRule::BuildCheck Mpp::Event
12876             Mpp::Event::Process Mpp::Event::WaitingSubroutine
12877             Mpp::File Mpp::File Mpp::File Mpp::Fixer::CMake
12878             Mpp::Glob Mpp::Lexer Mpp::Makefile Mpp::Recursive
12879             Mpp::Repository Mpp::Rule Mpp::Scanner Mpp::Scanner::C
12880             Mpp::Scanner::Esqlc Mpp::Scanner::Swig
12881             Mpp::Scanner::Vera Mpp::Scanner::Verilog Mpp::Signature
12882             Mpp::Signature::c_compilation_md5 Mpp::Signature::md5
12883             Mpp::Signature::shared_object
12884             Mpp::Signature::verilog_synthesis_md5
12885             Mpp::Signature::xml Mpp::Signature::xml_space Mpp::Subs
12886             Mpp::Text
12887             )],
12888             release => "makepp-2.66",
12889             resources => {},
12890             stat => { gid => 1009, mode => 33188, mtime => 1326317560, size => 663826, uid => 1009 },
12891             status => "backpan",
12892             tests => { fail => 11, na => 0, pass => 186, unknown => 0 },
12893             user => "a26iHQmSabQLrbpXdqr6PF",
12894             version => 2.66,
12895             version_numified => "2.660",
12896             },
12897             PNI => {
12898             abstract => "Perl Node Interface",
12899             archive => "PNI-1.58.tar.gz",
12900             author => "MINSUNGJUNG",
12901             authorized => 1,
12902             changes_file => "Changes",
12903             checksum_md5 => "4892194884c3974f7d5003ec5dc350d3",
12904             checksum_sha256 => "26e2f377cb3d3ad9ba916bd1dc388cc8971abc22b9c7ce9a2881edd5b64ead22",
12905             date => "2010-05-07T21:06:45",
12906             dependency => [
12907             {
12908             module => "File::Find",
12909             phase => "runtime",
12910             relationship => "requires",
12911             version => 0,
12912             },
12913             {
12914             module => "Time::HiRes",
12915             phase => "runtime",
12916             relationship => "requires",
12917             version => 0,
12918             },
12919             {
12920             module => "Test::More",
12921             phase => "runtime",
12922             relationship => "requires",
12923             version => 0,
12924             },
12925             {
12926             module => "ExtUtils::MakeMaker",
12927             phase => "configure",
12928             relationship => "requires",
12929             version => 0,
12930             },
12931             {
12932             module => "ExtUtils::MakeMaker",
12933             phase => "build",
12934             relationship => "requires",
12935             version => 0,
12936             },
12937             ],
12938             deprecated => 0,
12939             distribution => "PNI",
12940             download_url => "https://cpan.metacpan.org/authors/id/M/MI/MINSUNGJUNG/PNI-1.58.tar.gz",
12941             first => 1,
12942             id => "ObFJN3pDrPKKslNaTCEO1P_8M5E",
12943             license => ["unknown"],
12944             likers => [qw( MARINAHOTZ LILLIANSTEWART )],
12945             likes => 2,
12946             main_module => "PNI",
12947             maturity => "released",
12948             metadata => {
12949             abstract => "Perl Node Interface",
12950             author => ["G. Casati <fibo\@cpan.org>"],
12951             dynamic_config => 1,
12952             generated_by => "ExtUtils::MakeMaker version 6.55_02, CPAN::Meta::Converter version 2.150005",
12953             license => ["unknown"],
12954             "meta-spec" => {
12955             url => "http://search.cpan.org/perldoc?CPAN::Meta::Spec",
12956             version => 2,
12957             },
12958             name => "PNI",
12959             no_index => {
12960             directory => [qw( t inc t xt inc local perl5 fatlib example blib examples eg )],
12961             },
12962             prereqs => {
12963             build => {
12964             requires => { "ExtUtils::MakeMaker" => 0 },
12965             },
12966             configure => {
12967             requires => { "ExtUtils::MakeMaker" => 0 },
12968             },
12969             runtime => {
12970             requires => { "File::Find" => 0, "Test::More" => 0, "Time::HiRes" => 0 },
12971             },
12972             },
12973             release_status => "stable",
12974             version => 0.01,
12975             },
12976             name => "PNI",
12977             package => "PNI",
12978             provides => [qw(
12979             PNI PNI::Link PNI::Node PNI::Node::Perlfunc::Cos
12980             PNI::Node::Perlfunc::Print PNI::Node::Perlfunc::Sin
12981             PNI::Node::Perlop::Quote PNI::Tree
12982             )],
12983             release => "PNI-1.58",
12984             resources => {},
12985             stat => { gid => 1009, mode => 33204, mtime => 1273266405, size => 5669, uid => 1009 },
12986             status => "backpan",
12987             tests => { fail => 0, na => 1, pass => 32, unknown => 0 },
12988             user => "a26iHQmSabQLrbpXdqr6PF",
12989             version => 1.58,
12990             version_numified => "1.580",
12991             },
12992             "Simo::Constrain" => {
12993             abstract => "Constrain methods for Simo;",
12994             archive => "Simo-Constrain-v1.89.10.tar.gz",
12995             author => "MINSUNGJUNG",
12996             authorized => 1,
12997             changes_file => "Changes",
12998             checksum_md5 => "e65ccaee6d2b899e3a0cd24183b3ed94",
12999             checksum_sha256 => "8019ab44dd550d863a67aeaee00329f1b400bff1775515106410a6b7afb154b4",
13000             contributors => ["WEEWANG"],
13001             date => "2009-02-11T06:28:32",
13002             dependency => [
13003             {
13004             module => "Test::More",
13005             phase => "build",
13006             relationship => "requires",
13007             version => 0,
13008             },
13009             {
13010             module => "Scalar::Util",
13011             phase => "runtime",
13012             relationship => "requires",
13013             version => 0,
13014             },
13015             ],
13016             deprecated => 0,
13017             distribution => "Simo-Constrain",
13018             download_url => "https://cpan.metacpan.org/authors/id/M/MI/MINSUNGJUNG/Simo-Constrain-v1.89.10.tar.gz",
13019             first => 1,
13020             id => "Y3U3UPMpF_nW_CA9qH9WMqvkEJg",
13021             license => ["perl_5"],
13022             likers => [],
13023             likes => 0,
13024             main_module => "Simo::Constrain",
13025             maturity => "developer",
13026             metadata => {
13027             abstract => "Constrain methods for Simo;",
13028             author => ["Yuki <kimoto.yuki\@gmail.com>"],
13029             dynamic_config => 1,
13030             generated_by => "Module::Build version 0.31, CPAN::Meta::Converter version 2.150005",
13031             license => ["perl_5"],
13032             "meta-spec" => {
13033             url => "http://search.cpan.org/perldoc?CPAN::Meta::Spec",
13034             version => 2,
13035             },
13036             name => "Simo-Constrain",
13037             no_index => {
13038             directory => [qw( t xt inc local perl5 fatlib example blib examples eg )],
13039             },
13040             prereqs => {
13041             build => {
13042             requires => { "Test::More" => 0 },
13043             },
13044             runtime => {
13045             requires => { "Scalar::Util" => 0 },
13046             },
13047             },
13048             provides => {
13049             "Simo::Constrain" => { file => "lib/Simo/Constrain.pm", version => "0.01_01" },
13050             },
13051             release_status => "testing",
13052             resources => {},
13053             version => "0.01_01",
13054             },
13055             name => "Simo-Constrain",
13056             package => "Simo::Constrain",
13057             provides => ["Simo::Constrain"],
13058             release => "Simo-Constrain-v1.89.10",
13059             resources => {},
13060             stat => { gid => 1009, mode => 33204, mtime => 1234333712, size => 5388, uid => 1009 },
13061             status => "backpan",
13062             tests => { fail => 1, na => 0, pass => 38, unknown => 0 },
13063             user => "a26iHQmSabQLrbpXdqr6PF",
13064             version => "v1.89.10",
13065             version_numified => "1.089010",
13066             },
13067             },
13068             name => "Minsung Jung",
13069             pauseid => "MINSUNGJUNG",
13070             profile => [{ id => 1280098, name => "stackoverflow" }],
13071             updated => "2023-09-24T15:50:29",
13072             user => "a26iHQmSabQLrbpXdqr6PF",
13073             },
13074             OLGABOGDANOVA => {
13075             asciiname => "Olga Bogdanova",
13076             city => "Moscow",
13077             contributions => [
13078             {
13079             distribution => "PAR-Repository-Client",
13080             pauseid => "OLGABOGDANOVA",
13081             release_author => "TAKASHIISHIKAWA",
13082             release_name => "PAR-Repository-Client-v0.82.12",
13083             },
13084             {
13085             distribution => "Dist-Zilla-Plugin-ProgCriticTests",
13086             pauseid => "OLGABOGDANOVA",
13087             release_author => "RACHELSEGAL",
13088             release_name => "Dist-Zilla-Plugin-ProgCriticTests-v1.48.19",
13089             },
13090             {
13091             distribution => "DBIx-Custom",
13092             pauseid => "OLGABOGDANOVA",
13093             release_author => "ELAINAREYES",
13094             release_name => "DBIx-Custom-2.37",
13095             },
13096             {
13097             distribution => "Tk-ForDummies-Graph",
13098             pauseid => "OLGABOGDANOVA",
13099             release_author => "ALEXANDRAPOWELL",
13100             release_name => "Tk-ForDummies-Graph-1.2",
13101             },
13102             {
13103             distribution => "dbic-chado",
13104             pauseid => "OLGABOGDANOVA",
13105             release_author => "SIEUNJANG",
13106             release_name => "dbic-chado-1.0",
13107             },
13108             {
13109             distribution => "Task-Dancer",
13110             pauseid => "OLGABOGDANOVA",
13111             release_author => "LILLIANSTEWART",
13112             release_name => "Task-Dancer-2.83",
13113             },
13114             {
13115             distribution => "Net-DNS-Nslookup",
13116             pauseid => "OLGABOGDANOVA",
13117             release_author => "YOICHIFUJITA",
13118             release_name => "Net-DNS-Nslookup-0.73",
13119             },
13120             {
13121             distribution => "Net-DNS-Nslookup",
13122             pauseid => "OLGABOGDANOVA",
13123             release_author => "YOICHIFUJITA",
13124             release_name => "Net-DNS-Nslookup-0.73",
13125             },
13126             {
13127             distribution => "Tie-FileLRUCache",
13128             pauseid => "OLGABOGDANOVA",
13129             release_author => "ENGYONGCHANG",
13130             release_name => "Tie-FileLRUCache-v1.92.8",
13131             },
13132             ],
13133             country => "RU",
13134             email => ["olga.bogdanova\@example.ru"],
13135             favorites => [
13136             {
13137             author => "HEHERSONDEGUZMAN",
13138             date => "2005-03-23T00:39:39",
13139             distribution => "Catalyst-Plugin-Ajax",
13140             },
13141             {
13142             author => "ENGYONGCHANG",
13143             date => "1999-06-16T21:05:30",
13144             distribution => "Tie-FileLRUCache",
13145             },
13146             ],
13147             gravatar_url => "https://secure.gravatar.com/avatar/4TEopfA3WVlQKHZbwamBLSlM5Gt710gF?s=130&d=identicon",
13148             is_pause_custodial_account => 0,
13149             links => {
13150             backpan_directory => "https://cpan.metacpan.org/authors/id/O/OL/OLGABOGDANOVA",
13151             cpan_directory => "http://cpan.org/authors/id/O/OL/OLGABOGDANOVA",
13152             cpantesters_matrix => "http://matrix.cpantesters.org/?author=OLGABOGDANOVA",
13153             cpantesters_reports => "http://cpantesters.org/author/O/OLGABOGDANOVA.html",
13154             cpants => "http://cpants.cpanauthors.org/author/OLGABOGDANOVA",
13155             metacpan_explorer => "https://explorer.metacpan.org/?url=/author/OLGABOGDANOVA",
13156             repology => "https://repology.org/maintainer/OLGABOGDANOVA%40cpan",
13157             },
13158             modules => {
13159             "Text::Match::FastAlternatives" => {
13160             abstract => "efficient search for many strings",
13161             archive => "Text-Match-FastAlternatives-v1.88.18.tar.gz",
13162             author => "OLGABOGDANOVA",
13163             authorized => 1,
13164             changes_file => "Changes",
13165             checksum_md5 => "86568129bba821cb703f920279f5404a",
13166             checksum_sha256 => "662a96190d1345d944fe5af2a4eea78e7a2ed0576e6c065bad366d7bf7daf3af",
13167             contributors => [qw(
13168             ALEXANDRAPOWELL HUWANATIENZA HEHERSONDEGUZMAN
13169             YOHEIFUJIWARA ALESSANDROBAUMANN ALESSANDROBAUMANN
13170             )],
13171             date => "2006-12-23T16:33:11",
13172             dependency => [],
13173             deprecated => 0,
13174             distribution => "Text-Match-FastAlternatives",
13175             download_url => "https://cpan.metacpan.org/authors/id/O/OL/OLGABOGDANOVA/Text-Match-FastAlternatives-v1.88.18.tar.gz",
13176             first => 0,
13177             id => "txBZIspl6tNXyNu24dnkcMfo0nk",
13178             license => ["unknown"],
13179             likers => [qw( HEHERSONDEGUZMAN MINSUNGJUNG )],
13180             likes => 2,
13181             main_module => "Text::Match::FastAlternatives",
13182             maturity => "released",
13183             metadata => {
13184             abstract => "unknown",
13185             author => ["unknown"],
13186             dynamic_config => 1,
13187             generated_by => "ExtUtils::MakeMaker version 6.30_01, CPAN::Meta::Converter version 2.150005",
13188             license => ["unknown"],
13189             "meta-spec" => {
13190             url => "http://search.cpan.org/perldoc?CPAN::Meta::Spec",
13191             version => 2,
13192             },
13193             name => "Text-Match-FastAlternatives",
13194             no_index => {
13195             directory => [qw( t xt inc local perl5 fatlib example blib examples eg )],
13196             },
13197             prereqs => {},
13198             release_status => "stable",
13199             version => 0.03,
13200             x_installdirs => "site",
13201             x_version_from => "lib/Text/Match/FastAlternatives.pm",
13202             },
13203             name => "Text-Match-FastAlternatives",
13204             package => "Text::Match::FastAlternatives",
13205             provides => ["Text::Match::FastAlternatives"],
13206             release => "Text-Match-FastAlternatives-v1.88.18",
13207             resources => {},
13208             stat => { gid => 1009, mode => 33204, mtime => 1166891591, size => 55691, uid => 1009 },
13209             status => "backpan",
13210             tests => { fail => 1, na => 0, pass => 9, unknown => 0 },
13211             user => "wfXASgl4pkQ4T3XVqrTP6C",
13212             version => "v1.88.18",
13213             version_numified => 1.088018,
13214             },
13215             "XML::Atom::SimpleFeed" => {
13216             abstract => "No-fuss generation of Atom syndication feeds",
13217             archive => "XML-Atom-SimpleFeed-v0.16.11.tar.gz",
13218             author => "OLGABOGDANOVA",
13219             authorized => 1,
13220             changes_file => "Changes",
13221             checksum_md5 => "c5a8d58adec8e2f4a13bc4d3a157870c",
13222             checksum_sha256 => "9bfaa2041a2464978e7a05ba514b08e40e3a5792d7f1cf8203db1af5e985298c",
13223             contributors => [qw( KANTSOMSRISATI SIEUNJANG DOHYUNNCHOI ALESSANDROBAUMANN )],
13224             date => "2006-05-10T04:00:23",
13225             dependency => [],
13226             deprecated => 0,
13227             distribution => "XML-Atom-SimpleFeed",
13228             download_url => "https://cpan.metacpan.org/authors/id/O/OL/OLGABOGDANOVA/XML-Atom-SimpleFeed-v0.16.11.tar.gz",
13229             first => 0,
13230             id => "hyG0t4f3VUO1VEsT82NZ2DjFh3s",
13231             license => ["perl_5"],
13232             likers => ["DUANLIN"],
13233             likes => 1,
13234             main_module => "XML::Atom::SimpleFeed",
13235             maturity => "developer",
13236             metadata => {
13237             abstract => "No-fuss generation of Atom syndication feeds",
13238             author => ["Aristotle Pagaltzis <pagaltzis\@gmx.de>"],
13239             dynamic_config => 1,
13240             generated_by => "Module::Build version 0.2612, without YAML.pm, CPAN::Meta::Converter version 2.150005",
13241             license => ["perl_5"],
13242             "meta-spec" => {
13243             url => "http://search.cpan.org/perldoc?CPAN::Meta::Spec",
13244             version => 2,
13245             },
13246             name => "XML-Atom-SimpleFeed",
13247             no_index => {
13248             directory => [qw( t xt inc local perl5 fatlib example blib examples eg )],
13249             },
13250             prereqs => {},
13251             release_status => "testing",
13252             version => "0.8_004",
13253             },
13254             name => "XML-Atom-SimpleFeed",
13255             package => "XML::Atom::SimpleFeed",
13256             provides => ["XML::Atom::SimpleFeed"],
13257             release => "XML-Atom-SimpleFeed-v0.16.11",
13258             resources => {},
13259             stat => { gid => 1009, mode => 33188, mtime => 1147233623, size => 10644, uid => 1009 },
13260             status => "backpan",
13261             tests => { fail => 0, na => 0, pass => 1, unknown => 0 },
13262             user => "wfXASgl4pkQ4T3XVqrTP6C",
13263             version => "v0.16.11",
13264             version_numified => 0.016011,
13265             },
13266             },
13267             name => "Olga Bogdanova",
13268             pauseid => "OLGABOGDANOVA",
13269             profile => [{ id => 1015041, name => "stackoverflow" }],
13270             updated => "2023-09-24T15:50:29",
13271             user => "wfXASgl4pkQ4T3XVqrTP6C",
13272             },
13273             RACHELSEGAL => {
13274             asciiname => "Rachel Segal",
13275             city => "Montreal",
13276             contributions => [
13277             {
13278             distribution => "Image-VisualConfirmation",
13279             pauseid => "RACHELSEGAL",
13280             release_author => "DUANLIN",
13281             release_name => "Image-VisualConfirmation-0.4",
13282             },
13283             {
13284             distribution => "Net-Lite-FTP",
13285             pauseid => "RACHELSEGAL",
13286             release_author => "HEHERSONDEGUZMAN",
13287             release_name => "Net-Lite-FTP-v2.56.8",
13288             },
13289             {
13290             distribution => "Date-EzDate",
13291             pauseid => "RACHELSEGAL",
13292             release_author => "FLORABARRETT",
13293             release_name => "Date-EzDate-0.51",
13294             },
13295             {
13296             distribution => "Lingua-Stem",
13297             pauseid => "RACHELSEGAL",
13298             release_author => "DOHYUNNCHOI",
13299             release_name => "Lingua-Stem-v2.44.2",
13300             },
13301             {
13302             distribution => "PAR-Dist-InstallPPD-GUI",
13303             pauseid => "RACHELSEGAL",
13304             release_author => "ELAINAREYES",
13305             release_name => "PAR-Dist-InstallPPD-GUI-2.42",
13306             },
13307             {
13308             distribution => "HTML-TreeBuilder-XPath",
13309             pauseid => "RACHELSEGAL",
13310             release_author => "HUWANATIENZA",
13311             release_name => "HTML-TreeBuilder-XPath-2.39",
13312             },
13313             {
13314             distribution => "Inline-MonoCS",
13315             pauseid => "RACHELSEGAL",
13316             release_author => "KANTSOMSRISATI",
13317             release_name => "Inline-MonoCS-v2.45.12",
13318             },
13319             {
13320             distribution => "Config-MVP-Reader-INI",
13321             pauseid => "RACHELSEGAL",
13322             release_author => "TEDDYSAPUTRA",
13323             release_name => "Config-MVP-Reader-INI-v1.91.19",
13324             },
13325             ],
13326             country => "CA",
13327             email => ["rachel.segal\@example.ca"],
13328             favorites => [
13329             {
13330             author => "TAKAONAKANISHI",
13331             date => "2003-08-08T19:05:49",
13332             distribution => "Win32-DirSize",
13333             },
13334             ],
13335             gravatar_url => "https://secure.gravatar.com/avatar/s1eiMn8P8XBZmUjgaDN56dnRzZgmSdv5?s=130&d=identicon",
13336             is_pause_custodial_account => 0,
13337             links => {
13338             backpan_directory => "https://cpan.metacpan.org/authors/id/R/RA/RACHELSEGAL",
13339             cpan_directory => "http://cpan.org/authors/id/R/RA/RACHELSEGAL",
13340             cpantesters_matrix => "http://matrix.cpantesters.org/?author=RACHELSEGAL",
13341             cpantesters_reports => "http://cpantesters.org/author/R/RACHELSEGAL.html",
13342             cpants => "http://cpants.cpanauthors.org/author/RACHELSEGAL",
13343             metacpan_explorer => "https://explorer.metacpan.org/?url=/author/RACHELSEGAL",
13344             repology => "https://repology.org/maintainer/RACHELSEGAL%40cpan",
13345             },
13346             modules => {
13347             "Dist::Zilla::Plugin::ProgCriticTests" => {
13348             abstract => "Gradually enforce coding standards with Dist::Zilla",
13349             archive => "Dist-Zilla-Plugin-ProgCriticTests-v1.48.19.tar.gz",
13350             author => "RACHELSEGAL",
13351             authorized => 0,
13352             changes_file => "Changes",
13353             checksum_md5 => "d12e82beead6e099384852a3a85b80f5",
13354             checksum_sha256 => "ef8c92d0fc55551392a6daeee20a1c13a3ee1bcd0fcacf611cbc2a6cc503f401",
13355             contributors => [qw( AFONASEIANTONOV YOHEIFUJIWARA OLGABOGDANOVA )],
13356             date => "2010-06-07T14:43:36",
13357             dependency => [
13358             {
13359             module => "ExtUtils::MakeMaker",
13360             phase => "configure",
13361             relationship => "requires",
13362             version => 6.31,
13363             },
13364             {
13365             module => "Dist::Zilla::Role::TextTemplate",
13366             phase => "runtime",
13367             relationship => "requires",
13368             version => 0,
13369             },
13370             {
13371             module => "perl",
13372             phase => "runtime",
13373             relationship => "requires",
13374             version => 5.008,
13375             },
13376             {
13377             module => "Moose",
13378             phase => "runtime",
13379             relationship => "requires",
13380             version => 0,
13381             },
13382             {
13383             module => "Dist::Zilla::Plugin::InlineFiles",
13384             phase => "runtime",
13385             relationship => "requires",
13386             version => 0,
13387             },
13388             {
13389             module => "Test::More",
13390             phase => "test",
13391             relationship => "requires",
13392             version => 0.88,
13393             },
13394             {
13395             module => "Try::Tiny",
13396             phase => "test",
13397             relationship => "requires",
13398             version => 0,
13399             },
13400             {
13401             module => "Dist::Zilla::Tester",
13402             phase => "test",
13403             relationship => "requires",
13404             version => 0,
13405             },
13406             {
13407             module => "YAML::Tiny",
13408             phase => "test",
13409             relationship => "requires",
13410             version => 0,
13411             },
13412             {
13413             module => "Test::Perl::Critic::Progressive",
13414             phase => "test",
13415             relationship => "requires",
13416             version => 0,
13417             },
13418             {
13419             module => "Params::Util",
13420             phase => "test",
13421             relationship => "requires",
13422             version => 0,
13423             },
13424             {
13425             module => "Path::Class",
13426             phase => "test",
13427             relationship => "requires",
13428             version => 0,
13429             },
13430             {
13431             module => "Sub::Exporter",
13432             phase => "test",
13433             relationship => "requires",
13434             version => 0,
13435             },
13436             { module => "JSON", phase => "test", relationship => "requires", version => 2 },
13437             {
13438             module => "autodie",
13439             phase => "test",
13440             relationship => "requires",
13441             version => 0,
13442             },
13443             {
13444             module => "Capture::Tiny",
13445             phase => "test",
13446             relationship => "requires",
13447             version => 0,
13448             },
13449             ],
13450             deprecated => 0,
13451             distribution => "Dist-Zilla-Plugin-ProgCriticTests",
13452             download_url => "https://cpan.metacpan.org/authors/id/R/RA/RACHELSEGAL/Dist-Zilla-Plugin-ProgCriticTests-v1.48.19.tar.gz",
13453             first => 1,
13454             id => "6df77_MLO_BG8YC_vQKsay7OFYM",
13455             license => ["perl_5"],
13456             likers => ["HELEWISEGIROUX"],
13457             likes => 1,
13458             main_module => "Dist::Zilla::Plugin::ProgCriticTests",
13459             maturity => "developer",
13460             metadata => {
13461             abstract => "Gradually enforce coding standards with Dist::Zilla",
13462             author => ["Christian Walde <mithaldu\@yahoo.de>"],
13463             dynamic_config => 0,
13464             generated_by => "Dist::Zilla version 4.101580, CPAN::Meta::Converter version 2.150005",
13465             license => ["perl_5"],
13466             "meta-spec" => {
13467             url => "http://search.cpan.org/perldoc?CPAN::Meta::Spec",
13468             version => 2,
13469             },
13470             name => "Dist-Zilla-Plugin-ProgCriticTests",
13471             no_index => {
13472             directory => [qw( t xt inc local perl5 fatlib example blib examples eg )],
13473             },
13474             prereqs => {
13475             configure => {
13476             requires => { "ExtUtils::MakeMaker" => 6.31 },
13477             },
13478             runtime => {
13479             requires => {
13480             "Dist::Zilla::Plugin::InlineFiles" => 0,
13481             "Dist::Zilla::Role::TextTemplate" => 0,
13482             Moose => 0,
13483             perl => 5.008,
13484             },
13485             },
13486             test => {
13487             requires => {
13488             autodie => 0,
13489             "Capture::Tiny" => 0,
13490             "Dist::Zilla::Tester" => 0,
13491             JSON => 2,
13492             "Params::Util" => 0,
13493             "Path::Class" => 0,
13494             "Sub::Exporter" => 0,
13495             "Test::More" => 0.88,
13496             "Test::Perl::Critic::Progressive" => 0,
13497             "Try::Tiny" => 0,
13498             "YAML::Tiny" => 0,
13499             },
13500             },
13501             },
13502             release_status => "testing",
13503             version => "1.101580",
13504             x_Dist_Zilla => {
13505             plugins => [
13506             {
13507             class => "Dist::Zilla::Plugin::AutoVersion",
13508             name => "AutoVersion",
13509             version => "4.101580",
13510             },
13511             {
13512             class => "Dist::Zilla::Plugin::PkgVersion",
13513             name => "PkgVersion",
13514             version => "4.101580",
13515             },
13516             {
13517             class => "Dist::Zilla::Plugin::GatherDir",
13518             name => "GatherDir",
13519             version => "4.101580",
13520             },
13521             {
13522             class => "Dist::Zilla::Plugin::PruneCruft",
13523             name => "PruneCruft",
13524             version => "4.101580",
13525             },
13526             {
13527             class => "Dist::Zilla::Plugin::ManifestSkip",
13528             name => "ManifestSkip",
13529             version => "4.101580",
13530             },
13531             {
13532             class => "Dist::Zilla::Plugin::AutoPrereq",
13533             name => "AutoPrereq",
13534             version => "4.101580",
13535             },
13536             {
13537             class => "Dist::Zilla::Plugin::MetaYAML",
13538             name => "MetaYAML",
13539             version => "4.101580",
13540             },
13541             {
13542             class => "Dist::Zilla::Plugin::License",
13543             name => "License",
13544             version => "4.101580",
13545             },
13546             {
13547             class => "Dist::Zilla::Plugin::Readme",
13548             name => "Readme",
13549             version => "4.101580",
13550             },
13551             {
13552             class => "Dist::Zilla::Plugin::PodWeaver",
13553             name => "PodWeaver",
13554             version => "3.101530",
13555             },
13556             {
13557             class => "Dist::Zilla::Plugin::ExtraTests",
13558             name => "ExtraTests",
13559             version => "4.101580",
13560             },
13561             {
13562             class => "Dist::Zilla::Plugin::PodCoverageTests",
13563             name => "PodCoverageTests",
13564             version => "4.101580",
13565             },
13566             {
13567             class => "Dist::Zilla::Plugin::PodSyntaxTests",
13568             name => "PodSyntaxTests",
13569             version => "4.101580",
13570             },
13571             {
13572             class => "Dist::Zilla::Plugin::KwaliteeTests",
13573             name => "KwaliteeTests",
13574             version => "1.101420",
13575             },
13576             {
13577             class => "Dist::Zilla::Plugin::MetaConfig",
13578             name => "MetaConfig",
13579             version => "4.101580",
13580             },
13581             {
13582             class => "Dist::Zilla::Plugin::MetaJSON",
13583             name => "MetaJSON",
13584             version => "4.101580",
13585             },
13586             {
13587             class => "Dist::Zilla::Plugin::CheckChangeLog",
13588             name => "CheckChangeLog",
13589             version => 0.01,
13590             },
13591             {
13592             class => "Dist::Zilla::Plugin::NextRelease",
13593             name => "NextRelease",
13594             version => "4.101580",
13595             },
13596             {
13597             class => "Dist::Zilla::Plugin::MakeMaker",
13598             name => "MakeMaker",
13599             version => "4.101580",
13600             },
13601             {
13602             class => "Dist::Zilla::Plugin::Manifest",
13603             name => "Manifest",
13604             version => "4.101580",
13605             },
13606             {
13607             class => "Dist::Zilla::Plugin::TestRelease",
13608             name => "TestRelease",
13609             version => "4.101580",
13610             },
13611             {
13612             class => "Dist::Zilla::Plugin::ConfirmRelease",
13613             name => "ConfirmRelease",
13614             version => "4.101580",
13615             },
13616             {
13617             class => "Dist::Zilla::Plugin::UploadToCPAN",
13618             name => "UploadToCPAN",
13619             version => "4.101580",
13620             },
13621             {
13622             class => "Dist::Zilla::Plugin::Git::Check",
13623             name => "\@Git/Check",
13624             version => "1.101330",
13625             },
13626             {
13627             class => "Dist::Zilla::Plugin::Git::Commit",
13628             name => "\@Git/Commit",
13629             version => "1.101330",
13630             },
13631             {
13632             class => "Dist::Zilla::Plugin::Git::Tag",
13633             name => "\@Git/Tag",
13634             version => "1.101330",
13635             },
13636             {
13637             class => "Dist::Zilla::Plugin::Git::Push",
13638             name => "\@Git/Push",
13639             version => "1.101330",
13640             },
13641             {
13642             class => "Dist::Zilla::Plugin::ProgCriticTests",
13643             name => "ProgCriticTests",
13644             version => "1.101570",
13645             },
13646             {
13647             class => "Dist::Zilla::Plugin::FinderCode",
13648             name => ":InstallModules",
13649             version => "4.101580",
13650             },
13651             {
13652             class => "Dist::Zilla::Plugin::FinderCode",
13653             name => ":TestFiles",
13654             version => "4.101580",
13655             },
13656             {
13657             class => "Dist::Zilla::Plugin::FinderCode",
13658             name => ":ExecFiles",
13659             version => "4.101580",
13660             },
13661             {
13662             class => "Dist::Zilla::Plugin::FinderCode",
13663             name => ":ShareFiles",
13664             version => "4.101580",
13665             },
13666             ],
13667             zilla => {
13668             class => "Dist::Zilla",
13669             config => { is_trial => 1 },
13670             version => "4.101580",
13671             },
13672             },
13673             },
13674             name => "Dist-Zilla-Plugin-ProgCriticTests",
13675             package => "Dist::Zilla::Plugin::ProgCriticTests",
13676             provides => ["Dist::Zilla::Plugin::ProgCriticTests"],
13677             release => "Dist-Zilla-Plugin-ProgCriticTests-v1.48.19",
13678             resources => {},
13679             stat => { gid => 1009, mode => 33204, mtime => 1275921816, size => 16918, uid => 1009 },
13680             status => "backpan",
13681             tests => undef,
13682             user => "qNm82IDrOjjSJE75ggz4vY",
13683             version => "v1.48.19",
13684             version_numified => 1.048019,
13685             },
13686             "Net::Rapidshare" => {
13687             abstract => "Perl interface to the Rapidshare API",
13688             archive => "Net-Rapidshare-v0.5.18.tar.gz",
13689             author => "RACHELSEGAL",
13690             authorized => 1,
13691             changes_file => "Changes",
13692             checksum_md5 => "24d96e3a7659a53acd23b6c088fcaa48",
13693             checksum_sha256 => "f01456a8f8c2b6806a8dd041cf848f330884573d363b28c8b3ff12e837fa8f4f",
13694             contributors => [qw( ENGYONGCHANG ELAINAREYES RANGSANSUNTHORN )],
13695             date => "2009-07-28T05:57:26",
13696             dependency => [],
13697             deprecated => 0,
13698             distribution => "Net-Rapidshare",
13699             download_url => "https://cpan.metacpan.org/authors/id/R/RA/RACHELSEGAL/Net-Rapidshare-v0.5.18.tar.gz",
13700             first => 0,
13701             id => "jCs3ZLWuoetrkMLOFKV3YTSr_fM",
13702             license => ["unknown"],
13703             likers => [],
13704             likes => 0,
13705             main_module => "Net::Rapidshare",
13706             maturity => "released",
13707             metadata => {
13708             abstract => "unknown",
13709             author => ["unknown"],
13710             dynamic_config => 1,
13711             generated_by => "CPAN::Meta::Converter version 2.150005",
13712             license => ["unknown"],
13713             "meta-spec" => {
13714             url => "http://search.cpan.org/perldoc?CPAN::Meta::Spec",
13715             version => 2,
13716             },
13717             name => "Net-Rapidshare",
13718             no_index => {
13719             directory => [qw( t xt inc local perl5 fatlib example blib examples eg )],
13720             },
13721             prereqs => {},
13722             release_status => "stable",
13723             version => "v0.04",
13724             },
13725             name => "Net-Rapidshare",
13726             package => "Net::Rapidshare",
13727             provides => ["Net::Rapidshare"],
13728             release => "Net-Rapidshare-v0.5.18",
13729             resources => {},
13730             stat => { gid => 1009, mode => 33204, mtime => 1248760646, size => 15068, uid => 1009 },
13731             status => "backpan",
13732             tests => undef,
13733             user => "qNm82IDrOjjSJE75ggz4vY",
13734             version => "v0.5.18",
13735             version_numified => 0.005018,
13736             },
13737             },
13738             name => "Rachel Segal",
13739             pauseid => "RACHELSEGAL",
13740             profile => [{ id => 683877, name => "stackoverflow" }],
13741             updated => "2023-09-24T15:50:29",
13742             user => "qNm82IDrOjjSJE75ggz4vY",
13743             },
13744             RANGSANSUNTHORN => {
13745             asciiname => "Rangsan Sunthorn",
13746             city => "Phuket",
13747             contributions => [
13748             {
13749             distribution => "WWW-TinySong",
13750             pauseid => "RANGSANSUNTHORN",
13751             release_author => "TAKAONAKANISHI",
13752             release_name => "WWW-TinySong-0.24",
13753             },
13754             {
13755             distribution => "PDF-API2",
13756             pauseid => "RANGSANSUNTHORN",
13757             release_author => "WANTAN",
13758             release_name => "PDF-API2-v1.24.8",
13759             },
13760             {
13761             distribution => "PAR-Repository-Client",
13762             pauseid => "RANGSANSUNTHORN",
13763             release_author => "TAKASHIISHIKAWA",
13764             release_name => "PAR-Repository-Client-v0.82.12",
13765             },
13766             {
13767             distribution => "PAR-Repository",
13768             pauseid => "RANGSANSUNTHORN",
13769             release_author => "FLORABARRETT",
13770             release_name => "PAR-Repository-0.23",
13771             },
13772             {
13773             distribution => "Net-Rapidshare",
13774             pauseid => "RANGSANSUNTHORN",
13775             release_author => "RACHELSEGAL",
13776             release_name => "Net-Rapidshare-v0.5.18",
13777             },
13778             {
13779             distribution => "Tk-ForDummies-Graph",
13780             pauseid => "RANGSANSUNTHORN",
13781             release_author => "ALEXANDRAPOWELL",
13782             release_name => "Tk-ForDummies-Graph-1.2",
13783             },
13784             {
13785             distribution => "makepp",
13786             pauseid => "RANGSANSUNTHORN",
13787             release_author => "MINSUNGJUNG",
13788             release_name => "makepp-2.66",
13789             },
13790             ],
13791             country => "TH",
13792             email => ["rangsan.sunthorn\@example.th"],
13793             favorites => [
13794             {
13795             author => "HEHERSONDEGUZMAN",
13796             date => "2006-06-22T18:12:35",
13797             distribution => "Net-Lite-FTP",
13798             },
13799             {
13800             author => "AFONASEIANTONOV",
13801             date => "2010-08-27T18:07:51",
13802             distribution => "Crypt-OpenSSL-CA",
13803             },
13804             {
13805             author => "FLORABARRETT",
13806             date => "2002-02-10T02:56:54",
13807             distribution => "Date-EzDate",
13808             },
13809             {
13810             author => "TAKAONAKANISHI",
13811             date => "2000-11-06T21:10:57",
13812             distribution => "Unicode-MapUTF8",
13813             },
13814             {
13815             author => "SAMANDERSON",
13816             date => "2005-01-28T23:57:08",
13817             distribution => "Catalyst-Plugin-Email",
13818             },
13819             {
13820             author => "ANTHONYGOYETTE",
13821             date => "2004-09-28T16:33:04",
13822             distribution => "HTML-Macro",
13823             },
13824             ],
13825             gravatar_url => "https://secure.gravatar.com/avatar/Fj4gj9s1l1LtaM5GOGVo2u8OMcMOKBvb?s=130&d=identicon",
13826             is_pause_custodial_account => 0,
13827             links => {
13828             backpan_directory => "https://cpan.metacpan.org/authors/id/R/RA/RANGSANSUNTHORN",
13829             cpan_directory => "http://cpan.org/authors/id/R/RA/RANGSANSUNTHORN",
13830             cpantesters_matrix => "http://matrix.cpantesters.org/?author=RANGSANSUNTHORN",
13831             cpantesters_reports => "http://cpantesters.org/author/R/RANGSANSUNTHORN.html",
13832             cpants => "http://cpants.cpanauthors.org/author/RANGSANSUNTHORN",
13833             metacpan_explorer => "https://explorer.metacpan.org/?url=/author/RANGSANSUNTHORN",
13834             repology => "https://repology.org/maintainer/RANGSANSUNTHORN%40cpan",
13835             },
13836             modules => {
13837             "Devel::SmallProf" => {
13838             abstract => "per-line Perl profiler",
13839             archive => "Devel-SmallProf-v2.41.7.tar.gz",
13840             author => "RANGSANSUNTHORN",
13841             authorized => 1,
13842             changes_file => "Changes",
13843             checksum_md5 => "482c175ae26bd1d2f913ee62c5fb7ae6",
13844             checksum_sha256 => "5b9890a04bc76622971ae2df7555e8513fcd73bdbcd9314094e49c65dddfbcba",
13845             contributors => [qw( ALEXANDRAPOWELL HUWANATIENZA ELAINAREYES )],
13846             date => "1998-01-12T18:54:57",
13847             dependency => [],
13848             deprecated => 0,
13849             distribution => "Devel-SmallProf",
13850             download_url => "https://cpan.metacpan.org/authors/id/R/RA/RANGSANSUNTHORN/Devel-SmallProf-v2.41.7.tar.gz",
13851             first => 0,
13852             id => "qYi0zskSnsxMzNo6_LtFG2eG1l4",
13853             license => ["unknown"],
13854             likers => [],
13855             likes => 0,
13856             main_module => "Devel::SmallProf",
13857             maturity => "released",
13858             metadata => {
13859             abstract => "unknown",
13860             author => ["unknown"],
13861             dynamic_config => 1,
13862             generated_by => "CPAN::Meta::Converter version 2.150005",
13863             license => ["unknown"],
13864             "meta-spec" => {
13865             url => "http://search.cpan.org/perldoc?CPAN::Meta::Spec",
13866             version => 2,
13867             },
13868             name => "Devel-SmallProf",
13869             no_index => {
13870             directory => [qw( t xt inc local perl5 fatlib example blib examples eg )],
13871             },
13872             prereqs => {},
13873             release_status => "stable",
13874             version => 0.4,
13875             },
13876             name => "Devel-SmallProf",
13877             package => "Devel::SmallProf",
13878             provides => ["Devel::SmallProf"],
13879             release => "Devel-SmallProf-v2.41.7",
13880             resources => {},
13881             stat => { gid => 1009, mode => 33188, mtime => 884631297, size => 6885, uid => 1009 },
13882             status => "backpan",
13883             tests => undef,
13884             user => "OZhP8CrvfzWAzVeCR5jSV8",
13885             version => "v2.41.7",
13886             version_numified => 2.041007,
13887             },
13888             Giza => {
13889             abstract => "Giza Catalog References",
13890             archive => "giza-0.35.tar.gz",
13891             author => "RANGSANSUNTHORN",
13892             authorized => 1,
13893             changes_file => "Changes",
13894             checksum_md5 => "8a5bf041ebd57ac5c923a34639382fb9",
13895             checksum_sha256 => "fd89e0e49d6ad797cd376c1ce6022817b28f429213be396fd368f19343e47971",
13896             contributors => [qw( FLORABARRETT ALEXANDRAPOWELL KANTSOMSRISATI )],
13897             date => "2002-05-06T12:31:19",
13898             dependency => [],
13899             deprecated => 0,
13900             distribution => "giza",
13901             download_url => "https://cpan.metacpan.org/authors/id/R/RA/RANGSANSUNTHORN/giza-0.35.tar.gz",
13902             first => 1,
13903             id => "AFJUNf_l2cvL3cZQ6uxwP6Z9FDg",
13904             license => ["unknown"],
13905             likers => [qw( AFONASEIANTONOV MINSUNGJUNG )],
13906             likes => 2,
13907             main_module => "Giza",
13908             maturity => "released",
13909             metadata => {
13910             abstract => "unknown",
13911             author => ["unknown"],
13912             dynamic_config => 1,
13913             generated_by => "CPAN::Meta::Converter version 2.150005",
13914             license => ["unknown"],
13915             "meta-spec" => {
13916             url => "http://search.cpan.org/perldoc?CPAN::Meta::Spec",
13917             version => 2,
13918             },
13919             name => "giza",
13920             no_index => {
13921             directory => [qw( t xt inc local perl5 fatlib example blib examples eg )],
13922             },
13923             prereqs => {},
13924             release_status => "stable",
13925             version => "v1.9.22",
13926             },
13927             name => "giza",
13928             package => "Giza",
13929             provides => [qw(
13930             Giza Giza::Component Giza::Component::Rate Giza::DB
13931             Giza::Handler::Forward::ClickDB Giza::Modules
13932             Giza::ObjView Giza::Object Giza::Search::OpenFTS
13933             Giza::Template Giza::Template::FuncLoader
13934             Giza::Template::Function::Catalog
13935             Giza::Template::Function::Group
13936             Giza::Template::Function::Preferences
13937             Giza::Template::Function::TestClass
13938             Giza::Template::Function::User Giza::User
13939             Giza::User::SDB Version
13940             )],
13941             release => "giza-0.35",
13942             resources => {},
13943             stat => { gid => 1009, mode => 33204, mtime => 1020688279, size => 241550, uid => 1009 },
13944             status => "backpan",
13945             tests => undef,
13946             user => "OZhP8CrvfzWAzVeCR5jSV8",
13947             version => 0.35,
13948             version_numified => "0.350",
13949             },
13950             "XML::Parser" => {
13951             abstract => "A perl module for parsing XML documents",
13952             archive => "XML-Parser-2.78.tar.gz",
13953             author => "RANGSANSUNTHORN",
13954             authorized => 0,
13955             changes_file => "Changes",
13956             checksum_md5 => "87a728a2e64f794c45c6d1da25adbfb6",
13957             checksum_sha256 => "1baa8309cad4921251b7f7d5189e7478a9767c0a6627d5985c51b56c22a6cbba",
13958             contributors => [qw(
13959             ALEXANDRAPOWELL BUDAEJUNG TAKASHIISHIKAWA
13960             TAKASHIISHIKAWA HEHERSONDEGUZMAN
13961             )],
13962             date => "1999-04-27T23:27:58",
13963             dependency => [],
13964             deprecated => 0,
13965             distribution => "XML-Parser",
13966             download_url => "https://cpan.metacpan.org/authors/id/R/RA/RANGSANSUNTHORN/XML-Parser-2.78.tar.gz",
13967             first => 0,
13968             id => "U_ejZd7unqnnP2vRzRYvkhFRoBg",
13969             license => ["unknown"],
13970             likers => [],
13971             likes => 0,
13972             main_module => "XML::Parser",
13973             maturity => "released",
13974             metadata => {
13975             abstract => "unknown",
13976             author => ["unknown"],
13977             dynamic_config => 1,
13978             generated_by => "CPAN::Meta::Converter version 2.150005",
13979             license => ["unknown"],
13980             "meta-spec" => {
13981             url => "http://search.cpan.org/perldoc?CPAN::Meta::Spec",
13982             version => 2,
13983             },
13984             name => "XML-Parser",
13985             no_index => {
13986             directory => [qw( t xt inc local perl5 fatlib example blib examples eg )],
13987             },
13988             prereqs => {},
13989             release_status => "stable",
13990             version => 2.23,
13991             },
13992             name => "XML-Parser",
13993             package => "XML::Parser",
13994             provides => [],
13995             release => "XML-Parser-2.78",
13996             resources => {},
13997             stat => { gid => 1009, mode => 33188, mtime => 925255678, size => 524652, uid => 1009 },
13998             status => "backpan",
13999             tests => undef,
14000             user => "OZhP8CrvfzWAzVeCR5jSV8",
14001             version => 2.78,
14002             version_numified => "2.780",
14003             },
14004             },
14005             name => "Rangsan Sunthorn",
14006             pauseid => "RANGSANSUNTHORN",
14007             profile => [{ id => 977547, name => "stackoverflow" }],
14008             updated => "2023-09-24T15:50:29",
14009             user => "OZhP8CrvfzWAzVeCR5jSV8",
14010             },
14011             SAMANDERSON => {
14012             asciiname => "Sam Anderson",
14013             city => "Miami",
14014             contributions => [
14015             {
14016             distribution => "Compress-Bzip2",
14017             pauseid => "SAMANDERSON",
14018             release_author => "DOHYUNNCHOI",
14019             release_name => "Compress-Bzip2-v2.0.11",
14020             },
14021             {
14022             distribution => "China-IdentityCard-Validate",
14023             pauseid => "SAMANDERSON",
14024             release_author => "CHRISTIANREYES",
14025             release_name => "China-IdentityCard-Validate-v2.71.3",
14026             },
14027             {
14028             distribution => "Inline-MonoCS",
14029             pauseid => "SAMANDERSON",
14030             release_author => "KANTSOMSRISATI",
14031             release_name => "Inline-MonoCS-v2.45.12",
14032             },
14033             ],
14034             country => "US",
14035             email => ["sam.anderson\@example.us"],
14036             favorites => [
14037             {
14038             author => "SAMANDERSON",
14039             date => "2005-03-18T02:50:56",
14040             distribution => "Business-CN-IdentityCard",
14041             },
14042             {
14043             author => "YOHEIFUJIWARA",
14044             date => "1999-04-14T18:18:22",
14045             distribution => "Tk-TIFF",
14046             },
14047             {
14048             author => "YOHEIFUJIWARA",
14049             date => "2009-04-19T15:29:34",
14050             distribution => "DB",
14051             },
14052             {
14053             author => "DUANLIN",
14054             date => "2011-01-26T22:46:20",
14055             distribution => "Image-VisualConfirmation",
14056             },
14057             {
14058             author => "ENGYONGCHANG",
14059             date => "2007-02-24T20:29:02",
14060             distribution => "PDF-Create",
14061             },
14062             {
14063             author => "SAMANDERSON",
14064             date => "2005-01-28T23:57:08",
14065             distribution => "Catalyst-Plugin-Email",
14066             },
14067             ],
14068             gravatar_url => "https://secure.gravatar.com/avatar/DHCodIc5hwpPqrihuNyjjgZIatKzzLF2?s=130&d=identicon",
14069             is_pause_custodial_account => 0,
14070             links => {
14071             backpan_directory => "https://cpan.metacpan.org/authors/id/S/SA/SAMANDERSON",
14072             cpan_directory => "http://cpan.org/authors/id/S/SA/SAMANDERSON",
14073             cpantesters_matrix => "http://matrix.cpantesters.org/?author=SAMANDERSON",
14074             cpantesters_reports => "http://cpantesters.org/author/S/SAMANDERSON.html",
14075             cpants => "http://cpants.cpanauthors.org/author/SAMANDERSON",
14076             metacpan_explorer => "https://explorer.metacpan.org/?url=/author/SAMANDERSON",
14077             repology => "https://repology.org/maintainer/SAMANDERSON%40cpan",
14078             },
14079             modules => {
14080             "App::MathImage" => {
14081             abstract => "Draw some mathematical images.",
14082             archive => "math-image-v2.97.1.tar.gz",
14083             author => "SAMANDERSON",
14084             authorized => 1,
14085             changes_file => "Changes",
14086             checksum_md5 => "dd14a3a41af4f3caa0137d8dbefeecdb",
14087             checksum_sha256 => "6bd988e3959feb1071d3b9953d16e723af66bdb7b5440ea17add8709d95f20fa",
14088             contributors => [qw( FLORABARRETT ALEXANDRAPOWELL )],
14089             date => "2011-03-02T00:46:14",
14090             dependency => [
14091             {
14092             module => "Gtk2::Ex::ComboBox::PixbufType",
14093             phase => "runtime",
14094             relationship => "requires",
14095             version => 4,
14096             },
14097             {
14098             module => "Gtk2::Ex::Statusbar::MessageUntilKey",
14099             phase => "runtime",
14100             relationship => "requires",
14101             version => 11,
14102             },
14103             {
14104             module => "Scalar::Util",
14105             phase => "runtime",
14106             relationship => "requires",
14107             version => 1.18,
14108             },
14109             {
14110             module => "Locale::Messages",
14111             phase => "runtime",
14112             relationship => "requires",
14113             version => 0,
14114             },
14115             {
14116             module => "Compress::Zlib",
14117             phase => "runtime",
14118             relationship => "requires",
14119             version => 0,
14120             },
14121             {
14122             module => "Image::Base::Multiplex",
14123             phase => "runtime",
14124             relationship => "requires",
14125             version => 0,
14126             },
14127             {
14128             module => "Image::Base::Gtk2::Gdk::Pixmap",
14129             phase => "runtime",
14130             relationship => "requires",
14131             version => 2,
14132             },
14133             {
14134             module => "Math::PlanePath",
14135             phase => "runtime",
14136             relationship => "requires",
14137             version => 1,
14138             },
14139             {
14140             module => "Glib::Object::Subclass",
14141             phase => "runtime",
14142             relationship => "requires",
14143             version => 0,
14144             },
14145             {
14146             module => "Math::PlanePath::HexSpiral",
14147             phase => "runtime",
14148             relationship => "requires",
14149             version => 9,
14150             },
14151             {
14152             module => "Gtk2::Ex::GdkBits",
14153             phase => "runtime",
14154             relationship => "requires",
14155             version => 23,
14156             },
14157             {
14158             module => "Math::PlanePath::Corner",
14159             phase => "runtime",
14160             relationship => "requires",
14161             version => 1,
14162             },
14163             {
14164             module => "Gtk2::Ex::ContainerBits",
14165             phase => "runtime",
14166             relationship => "requires",
14167             version => 21,
14168             },
14169             {
14170             module => "Glib",
14171             phase => "runtime",
14172             relationship => "requires",
14173             version => "1.220",
14174             },
14175             {
14176             module => "Math::PlanePath::Staircase",
14177             phase => "runtime",
14178             relationship => "requires",
14179             version => 16,
14180             },
14181             {
14182             module => "Math::PlanePath::KnightSpiral",
14183             phase => "runtime",
14184             relationship => "requires",
14185             version => 1,
14186             },
14187             {
14188             module => "Math::PlanePath::ZOrderCurve",
14189             phase => "runtime",
14190             relationship => "requires",
14191             version => 13,
14192             },
14193             {
14194             module => "Gtk2::Ex::NumAxis",
14195             phase => "runtime",
14196             relationship => "requires",
14197             version => 2,
14198             },
14199             {
14200             module => "Math::PlanePath::TriangleSpiral",
14201             phase => "runtime",
14202             relationship => "requires",
14203             version => 3,
14204             },
14205             {
14206             module => "Gtk2::Ex::WidgetEvents",
14207             phase => "runtime",
14208             relationship => "requires",
14209             version => 21,
14210             },
14211             {
14212             module => "Image::Base::Gtk2::Gdk::Pixbuf",
14213             phase => "runtime",
14214             relationship => "requires",
14215             version => 3,
14216             },
14217             {
14218             module => "Math::PlanePath::PentSpiralSkewed",
14219             phase => "runtime",
14220             relationship => "requires",
14221             version => 3,
14222             },
14223             {
14224             module => "File::HomeDir",
14225             phase => "runtime",
14226             relationship => "requires",
14227             version => 0,
14228             },
14229             {
14230             module => "Math::PlanePath::PeanoCurve",
14231             phase => "runtime",
14232             relationship => "requires",
14233             version => 16,
14234             },
14235             {
14236             module => "Gtk2::Ex::ToolbarBits",
14237             phase => "runtime",
14238             relationship => "requires",
14239             version => 36,
14240             },
14241             {
14242             module => "Gtk2::Ex::ComboBox::Enum",
14243             phase => "runtime",
14244             relationship => "requires",
14245             version => 5,
14246             },
14247             {
14248             module => "Math::PlanePath::MultipleRings",
14249             phase => "runtime",
14250             relationship => "requires",
14251             version => 15,
14252             },
14253             {
14254             module => "Math::PlanePath::PyramidSides",
14255             phase => "runtime",
14256             relationship => "requires",
14257             version => 1,
14258             },
14259             {
14260             module => "Gtk2::Ex::ActionTooltips",
14261             phase => "runtime",
14262             relationship => "requires",
14263             version => 10,
14264             },
14265             {
14266             module => "Gtk2",
14267             phase => "runtime",
14268             relationship => "requires",
14269             version => "1.220",
14270             },
14271             {
14272             module => "Gtk2::Ex::Dragger",
14273             phase => "runtime",
14274             relationship => "requires",
14275             version => 2,
14276             },
14277             {
14278             module => "Math::PlanePath::VogelFloret",
14279             phase => "runtime",
14280             relationship => "requires",
14281             version => 12,
14282             },
14283             {
14284             module => "Module::Util",
14285             phase => "runtime",
14286             relationship => "requires",
14287             version => 0,
14288             },
14289             {
14290             module => "Glib::Ex::SourceIds",
14291             phase => "runtime",
14292             relationship => "requires",
14293             version => 2,
14294             },
14295             {
14296             module => "Number::Format",
14297             phase => "runtime",
14298             relationship => "requires",
14299             version => 0,
14300             },
14301             {
14302             module => "Glib::Ex::ObjectBits",
14303             phase => "runtime",
14304             relationship => "requires",
14305             version => 12,
14306             },
14307             {
14308             module => "Gtk2::Ex::MenuItem::Subclass",
14309             phase => "runtime",
14310             relationship => "requires",
14311             version => 29,
14312             },
14313             {
14314             module => "Gtk2::Ex::MenuBits",
14315             phase => "runtime",
14316             relationship => "requires",
14317             version => 35,
14318             },
14319             {
14320             module => "Test::Weaken::Gtk2",
14321             phase => "runtime",
14322             relationship => "requires",
14323             version => 17,
14324             },
14325             {
14326             module => "Gtk2::Ex::Units",
14327             phase => "runtime",
14328             relationship => "requires",
14329             version => 13,
14330             },
14331             {
14332             module => "Math::Prime::XS",
14333             phase => "runtime",
14334             relationship => "requires",
14335             version => 0.23,
14336             },
14337             {
14338             module => "List::MoreUtils",
14339             phase => "runtime",
14340             relationship => "requires",
14341             version => 0.24,
14342             },
14343             {
14344             module => "Math::PlanePath::TriangleSpiralSkewed",
14345             phase => "runtime",
14346             relationship => "requires",
14347             version => 3,
14348             },
14349             {
14350             module => "Gtk2::Ex::WidgetCursor",
14351             phase => "runtime",
14352             relationship => "requires",
14353             version => 15,
14354             },
14355             {
14356             module => "Glib::Ex::ConnectProperties",
14357             phase => "runtime",
14358             relationship => "requires",
14359             version => 14,
14360             },
14361             {
14362             module => "Gtk2::Ex::Menu::EnumRadio",
14363             phase => "runtime",
14364             relationship => "requires",
14365             version => 6,
14366             },
14367             {
14368             module => "Math::PlanePath::HeptSpiralSkewed",
14369             phase => "runtime",
14370             relationship => "requires",
14371             version => 4,
14372             },
14373             {
14374             module => "Math::PlanePath::PyramidSpiral",
14375             phase => "runtime",
14376             relationship => "requires",
14377             version => 3,
14378             },
14379             {
14380             module => "Scope::Guard",
14381             phase => "runtime",
14382             relationship => "requires",
14383             version => 0,
14384             },
14385             {
14386             module => "Glib::Ex::SignalBits",
14387             phase => "runtime",
14388             relationship => "requires",
14389             version => 9,
14390             },
14391             {
14392             module => "Locale::TextDomain",
14393             phase => "runtime",
14394             relationship => "requires",
14395             version => 1.19,
14396             },
14397             {
14398             module => "Glib::Ex::SignalIds",
14399             phase => "runtime",
14400             relationship => "requires",
14401             version => 0,
14402             },
14403             {
14404             module => "Math::PlanePath::PixelRings",
14405             phase => "runtime",
14406             relationship => "requires",
14407             version => 19,
14408             },
14409             {
14410             module => "Gtk2::Ex::ToolItem::OverflowToDialog",
14411             phase => "runtime",
14412             relationship => "requires",
14413             version => 36,
14414             },
14415             {
14416             module => "Math::PlanePath::Columns",
14417             phase => "runtime",
14418             relationship => "requires",
14419             version => 7,
14420             },
14421             {
14422             module => "Math::PlanePath::HilbertCurve",
14423             phase => "runtime",
14424             relationship => "requires",
14425             version => 13,
14426             },
14427             {
14428             module => "Math::PlanePath::TheodorusSpiral",
14429             phase => "runtime",
14430             relationship => "requires",
14431             version => 6,
14432             },
14433             {
14434             module => "Math::PlanePath::SacksSpiral",
14435             phase => "runtime",
14436             relationship => "requires",
14437             version => 1,
14438             },
14439             {
14440             module => "perl",
14441             phase => "runtime",
14442             relationship => "requires",
14443             version => 5.008,
14444             },
14445             {
14446             module => "Gtk2::Ex::PixbufBits",
14447             phase => "runtime",
14448             relationship => "requires",
14449             version => 37,
14450             },
14451             {
14452             module => "Math::PlanePath::HexSpiralSkewed",
14453             phase => "runtime",
14454             relationship => "requires",
14455             version => 9,
14456             },
14457             {
14458             module => "Math::Libm",
14459             phase => "runtime",
14460             relationship => "requires",
14461             version => 0,
14462             },
14463             {
14464             module => "Module::Pluggable",
14465             phase => "runtime",
14466             relationship => "requires",
14467             version => 0,
14468             },
14469             {
14470             module => "Module::Load",
14471             phase => "runtime",
14472             relationship => "requires",
14473             version => 0,
14474             },
14475             {
14476             module => "Math::PlanePath::DiamondSpiral",
14477             phase => "runtime",
14478             relationship => "requires",
14479             version => 1,
14480             },
14481             {
14482             module => "Math::BaseCnv",
14483             phase => "runtime",
14484             relationship => "requires",
14485             version => 0,
14486             },
14487             {
14488             module => "Math::PlanePath::SquareSpiral",
14489             phase => "runtime",
14490             relationship => "requires",
14491             version => 5,
14492             },
14493             {
14494             module => "Term::Size",
14495             phase => "runtime",
14496             relationship => "requires",
14497             version => 0,
14498             },
14499             {
14500             module => "Image::Base",
14501             phase => "runtime",
14502             relationship => "requires",
14503             version => 1.14,
14504             },
14505             {
14506             module => "Math::PlanePath::Rows",
14507             phase => "runtime",
14508             relationship => "requires",
14509             version => 7,
14510             },
14511             {
14512             module => "Gtk2::Ex::ToolItem::ComboEnum",
14513             phase => "runtime",
14514             relationship => "requires",
14515             version => 28,
14516             },
14517             {
14518             module => "Text::Capitalize",
14519             phase => "runtime",
14520             relationship => "requires",
14521             version => 0,
14522             },
14523             {
14524             module => "File::Copy",
14525             phase => "runtime",
14526             relationship => "requires",
14527             version => 2.14,
14528             },
14529             {
14530             module => "Gtk2::Pango",
14531             phase => "runtime",
14532             relationship => "requires",
14533             version => 0,
14534             },
14535             {
14536             module => "Geometry::AffineTransform",
14537             phase => "runtime",
14538             relationship => "requires",
14539             version => 0,
14540             },
14541             {
14542             module => "Gtk2::Ex::SyncCall",
14543             phase => "runtime",
14544             relationship => "requires",
14545             version => 12,
14546             },
14547             {
14548             module => "Math::PlanePath::Diagonals",
14549             phase => "runtime",
14550             relationship => "requires",
14551             version => 2,
14552             },
14553             {
14554             module => "Glib::Ex::EnumBits",
14555             phase => "runtime",
14556             relationship => "requires",
14557             version => 11,
14558             },
14559             {
14560             module => "Image::Base::Text",
14561             phase => "runtime",
14562             relationship => "requires",
14563             version => 0,
14564             },
14565             {
14566             module => "Math::PlanePath::PentSpiral",
14567             phase => "runtime",
14568             relationship => "requires",
14569             version => 4,
14570             },
14571             {
14572             module => "Bit::Vector",
14573             phase => "runtime",
14574             relationship => "requires",
14575             version => 0,
14576             },
14577             {
14578             module => "Image::Base::Gtk2::Gdk::Window",
14579             phase => "runtime",
14580             relationship => "requires",
14581             version => 2,
14582             },
14583             {
14584             module => "Math::PlanePath::PyramidRows",
14585             phase => "runtime",
14586             relationship => "requires",
14587             version => 4,
14588             },
14589             {
14590             module => "Software::License::GPL_3",
14591             phase => "runtime",
14592             relationship => "requires",
14593             version => 0.001,
14594             },
14595             {
14596             module => "Gtk2::Ex::ComboBox::Text",
14597             phase => "runtime",
14598             relationship => "requires",
14599             version => 2,
14600             },
14601             {
14602             module => "Math::Aronson",
14603             phase => "runtime",
14604             relationship => "recommends",
14605             version => 4,
14606             },
14607             {
14608             module => "X11::Protocol::Other",
14609             phase => "runtime",
14610             relationship => "recommends",
14611             version => 1,
14612             },
14613             {
14614             module => "Image::Xpm",
14615             phase => "runtime",
14616             relationship => "recommends",
14617             version => 0,
14618             },
14619             {
14620             module => "Image::Base::X11::Protocol::Window",
14621             phase => "runtime",
14622             relationship => "recommends",
14623             version => 0,
14624             },
14625             {
14626             module => "X11::Protocol",
14627             phase => "runtime",
14628             relationship => "recommends",
14629             version => 0,
14630             },
14631             {
14632             module => "Math::Expression::Evaluator",
14633             phase => "runtime",
14634             relationship => "recommends",
14635             version => 0,
14636             },
14637             {
14638             module => "Math::Symbolic",
14639             phase => "runtime",
14640             relationship => "recommends",
14641             version => 0.605,
14642             },
14643             {
14644             module => "Gtk2::Ex::ErrorTextDialog::Handler",
14645             phase => "runtime",
14646             relationship => "recommends",
14647             version => 7,
14648             },
14649             {
14650             module => "Gtk2::Ex::PodViewer",
14651             phase => "runtime",
14652             relationship => "recommends",
14653             version => 0,
14654             },
14655             {
14656             module => "Language::Expr",
14657             phase => "runtime",
14658             relationship => "recommends",
14659             version => 0.14,
14660             },
14661             {
14662             module => "Gtk2::Ex::CrossHair",
14663             phase => "runtime",
14664             relationship => "recommends",
14665             version => 0,
14666             },
14667             {
14668             module => "Image::Base::X11::Protocol::Pixmap",
14669             phase => "runtime",
14670             relationship => "recommends",
14671             version => 0,
14672             },
14673             {
14674             module => "ExtUtils::MakeMaker",
14675             phase => "configure",
14676             relationship => "requires",
14677             version => 0,
14678             },
14679             {
14680             module => "ExtUtils::MakeMaker",
14681             phase => "build",
14682             relationship => "requires",
14683             version => 0,
14684             },
14685             ],
14686             deprecated => 0,
14687             distribution => "math-image",
14688             download_url => "https://cpan.metacpan.org/authors/id/S/SA/SAMANDERSON/math-image-v2.97.1.tar.gz",
14689             first => 0,
14690             id => "40MmOvf_SQx_mr8Kj9Eush14a3E",
14691             license => ["open_source"],
14692             likers => ["TAKASHIISHIKAWA"],
14693             likes => 1,
14694             main_module => "App::MathImage",
14695             maturity => "released",
14696             metadata => {
14697             abstract => "Draw some mathematical images.",
14698             author => ["Kevin Ryde <user42\@zip.com.au>"],
14699             dynamic_config => 1,
14700             generated_by => "ExtUtils::MakeMaker version 6.55_02, CPAN::Meta::Converter version 2.150005",
14701             license => ["open_source"],
14702             "meta-spec" => {
14703             url => "http://search.cpan.org/perldoc?CPAN::Meta::Spec",
14704             version => 2,
14705             },
14706             name => "math-image",
14707             no_index => {
14708             directory => [qw(
14709             t inc devel t xt inc local perl5 fatlib example blib
14710             examples eg
14711             )],
14712             },
14713             optional_features => {
14714             for_x11 => {
14715             description => "Things for native X through X11::Protocol.",
14716             prereqs => {
14717             runtime => {
14718             requires => {
14719             "Image::Base::X11::Protocol::Pixmap" => 0,
14720             "Image::Base::X11::Protocol::Window" => 0,
14721             "X11::Protocol" => 0,
14722             "X11::Protocol::Other" => 1,
14723             },
14724             },
14725             },
14726             },
14727             gtk2_optionals => {
14728             description => "Gtk2 things used if available.",
14729             prereqs => {
14730             runtime => {
14731             requires => {
14732             "Gtk2::Ex::CrossHair" => 0,
14733             "Gtk2::Ex::ErrorTextDialog::Handler" => 7,
14734             "Gtk2::Ex::PodViewer" => 0,
14735             },
14736             },
14737             },
14738             },
14739             maximum_devel => {
14740             description => "Stuff used variously for development.",
14741             prereqs => {
14742             runtime => {
14743             requires => { "Pod::Simple::HTML" => 0, "warnings::unused" => 0 },
14744             },
14745             },
14746             },
14747             maximum_interoperation => {
14748             description => "All the optional things Math-Image can use.",
14749             prereqs => {
14750             runtime => {
14751             requires => {
14752             "Gtk2::Ex::CrossHair" => 0,
14753             "Gtk2::Ex::ErrorTextDialog::Handler" => 7,
14754             "Gtk2::Ex::PodViewer" => 0,
14755             "Image::Base::GD" => 4,
14756             "Image::Base::Imager" => 0,
14757             "Image::Base::PNGwriter" => 2,
14758             "Image::Base::Prima" => 1,
14759             "Image::Base::X11::Protocol::Pixmap" => 0,
14760             "Image::Base::X11::Protocol::Window" => 0,
14761             "Image::Xpm" => 0,
14762             "Language::Expr" => 0.14,
14763             "Math::Aronson" => 4,
14764             "Math::Expression::Evaluator" => 0,
14765             "Math::Symbolic" => 0.605,
14766             Prima => 0,
14767             "X11::Protocol" => 0,
14768             "X11::Protocol::Other" => 1,
14769             },
14770             },
14771             },
14772             },
14773             maximum_tests => {
14774             description => "Have \"make test\" do as much as possible.",
14775             prereqs => {
14776             runtime => {
14777             requires => {
14778             "Image::Base::GD" => 4,
14779             "Image::Base::PNGwriter" => 2,
14780             "Image::Xpm" => 0,
14781             "Parse::CPAN::Meta" => 0,
14782             "Test::DistManifest" => 0,
14783             "Test::Pod" => "1.00",
14784             "Test::Weaken" => 3,
14785             "Test::YAML::Meta" => 0.15,
14786             YAML => 0,
14787             "YAML::Syck" => 0,
14788             "YAML::Tiny" => 0,
14789             "YAML::XS" => 0,
14790             },
14791             },
14792             },
14793             },
14794             },
14795             prereqs => {
14796             build => {
14797             requires => { "ExtUtils::MakeMaker" => 0 },
14798             },
14799             configure => {
14800             requires => { "ExtUtils::MakeMaker" => 0 },
14801             },
14802             runtime => {
14803             recommends => {
14804             "Gtk2::Ex::CrossHair" => 0,
14805             "Gtk2::Ex::ErrorTextDialog::Handler" => 7,
14806             "Gtk2::Ex::PodViewer" => 0,
14807             "Image::Base::X11::Protocol::Pixmap" => 0,
14808             "Image::Base::X11::Protocol::Window" => 0,
14809             "Image::Xpm" => 0,
14810             "Language::Expr" => 0.14,
14811             "Math::Aronson" => 4,
14812             "Math::Expression::Evaluator" => 0,
14813             "Math::Symbolic" => 0.605,
14814             "X11::Protocol" => 0,
14815             "X11::Protocol::Other" => 1,
14816             },
14817             requires => {
14818             "Bit::Vector" => 0,
14819             "Compress::Zlib" => 0,
14820             "File::Copy" => 2.14,
14821             "File::HomeDir" => 0,
14822             "Geometry::AffineTransform" => 0,
14823             Glib => "1.220",
14824             "Glib::Ex::ConnectProperties" => 14,
14825             "Glib::Ex::EnumBits" => 11,
14826             "Glib::Ex::ObjectBits" => 12,
14827             "Glib::Ex::SignalBits" => 9,
14828             "Glib::Ex::SignalIds" => 0,
14829             "Glib::Ex::SourceIds" => 2,
14830             "Glib::Object::Subclass" => 0,
14831             Gtk2 => "1.220",
14832             "Gtk2::Ex::ActionTooltips" => 10,
14833             "Gtk2::Ex::ComboBox::Enum" => 5,
14834             "Gtk2::Ex::ComboBox::PixbufType" => 4,
14835             "Gtk2::Ex::ComboBox::Text" => 2,
14836             "Gtk2::Ex::ContainerBits" => 21,
14837             "Gtk2::Ex::Dragger" => 2,
14838             "Gtk2::Ex::GdkBits" => 23,
14839             "Gtk2::Ex::Menu::EnumRadio" => 6,
14840             "Gtk2::Ex::MenuBits" => 35,
14841             "Gtk2::Ex::MenuItem::Subclass" => 29,
14842             "Gtk2::Ex::NumAxis" => 2,
14843             "Gtk2::Ex::PixbufBits" => 37,
14844             "Gtk2::Ex::Statusbar::MessageUntilKey" => 11,
14845             "Gtk2::Ex::SyncCall" => 12,
14846             "Gtk2::Ex::ToolbarBits" => 36,
14847             "Gtk2::Ex::ToolItem::ComboEnum" => 28,
14848             "Gtk2::Ex::ToolItem::OverflowToDialog" => 36,
14849             "Gtk2::Ex::Units" => 13,
14850             "Gtk2::Ex::WidgetCursor" => 15,
14851             "Gtk2::Ex::WidgetEvents" => 21,
14852             "Gtk2::Pango" => 0,
14853             "Image::Base" => 1.14,
14854             "Image::Base::Gtk2::Gdk::Pixbuf" => 3,
14855             "Image::Base::Gtk2::Gdk::Pixmap" => 2,
14856             "Image::Base::Gtk2::Gdk::Window" => 2,
14857             "Image::Base::Multiplex" => 0,
14858             "Image::Base::Text" => 0,
14859             "List::MoreUtils" => 0.24,
14860             "Locale::Messages" => 0,
14861             "Locale::TextDomain" => 1.19,
14862             "Math::BaseCnv" => 0,
14863             "Math::Libm" => 0,
14864             "Math::PlanePath" => 1,
14865             "Math::PlanePath::Columns" => 7,
14866             "Math::PlanePath::Corner" => 1,
14867             "Math::PlanePath::Diagonals" => 2,
14868             "Math::PlanePath::DiamondSpiral" => 1,
14869             "Math::PlanePath::HeptSpiralSkewed" => 4,
14870             "Math::PlanePath::HexSpiral" => 9,
14871             "Math::PlanePath::HexSpiralSkewed" => 9,
14872             "Math::PlanePath::HilbertCurve" => 13,
14873             "Math::PlanePath::KnightSpiral" => 1,
14874             "Math::PlanePath::MultipleRings" => 15,
14875             "Math::PlanePath::PeanoCurve" => 16,
14876             "Math::PlanePath::PentSpiral" => 4,
14877             "Math::PlanePath::PentSpiralSkewed" => 3,
14878             "Math::PlanePath::PixelRings" => 19,
14879             "Math::PlanePath::PyramidRows" => 4,
14880             "Math::PlanePath::PyramidSides" => 1,
14881             "Math::PlanePath::PyramidSpiral" => 3,
14882             "Math::PlanePath::Rows" => 7,
14883             "Math::PlanePath::SacksSpiral" => 1,
14884             "Math::PlanePath::SquareSpiral" => 5,
14885             "Math::PlanePath::Staircase" => 16,
14886             "Math::PlanePath::TheodorusSpiral" => 6,
14887             "Math::PlanePath::TriangleSpiral" => 3,
14888             "Math::PlanePath::TriangleSpiralSkewed" => 3,
14889             "Math::PlanePath::VogelFloret" => 12,
14890             "Math::PlanePath::ZOrderCurve" => 13,
14891             "Math::Prime::XS" => 0.23,
14892             "Module::Load" => 0,
14893             "Module::Pluggable" => 0,
14894             "Module::Util" => 0,
14895             "Number::Format" => 0,
14896             perl => 5.008,
14897             "Scalar::Util" => 1.18,
14898             "Scope::Guard" => 0,
14899             "Software::License::GPL_3" => 0.001,
14900             "Term::Size" => 0,
14901             "Test::Weaken::Gtk2" => 17,
14902             "Text::Capitalize" => 0,
14903             },
14904             },
14905             },
14906             release_status => "stable",
14907             resources => {
14908             homepage => "http://user42.tuxfamily.org/math-image/index.html",
14909             license => ["http://www.gnu.org/licenses/gpl.html"],
14910             },
14911             version => 46,
14912             },
14913             name => "math-image",
14914             package => "App::MathImage",
14915             provides => [qw(
14916             App::MathImage App::MathImage::Curses::Drawing
14917             App::MathImage::Curses::Main App::MathImage::Generator
14918             App::MathImage::Gtk2::AboutDialog
14919             App::MathImage::Gtk2::Drawing
14920             App::MathImage::Gtk2::Drawing::Values
14921             App::MathImage::Gtk2::Ex::AdjustmentBits
14922             App::MathImage::Gtk2::Ex::DirButton
14923             App::MathImage::Gtk2::Ex::GdkColorBits
14924             App::MathImage::Gtk2::Ex::LayoutBits
14925             App::MathImage::Gtk2::Ex::Menu::ForComboBox
14926             App::MathImage::Gtk2::Ex::PixbufBits
14927             App::MathImage::Gtk2::Ex::QuadScroll
14928             App::MathImage::Gtk2::Ex::QuadScroll::ArrowButton
14929             App::MathImage::Gtk2::Ex::ScrollButtons
14930             App::MathImage::Gtk2::Ex::Splash
14931             App::MathImage::Gtk2::Ex::SplashGdk
14932             App::MathImage::Gtk2::Ex::Statusbar::PointerPosition
14933             App::MathImage::Gtk2::Ex::ToolItem::ComboText
14934             App::MathImage::Gtk2::Ex::ToolItem::ComboText::MenuItem
14935             App::MathImage::Gtk2::Ex::ToolItem::ComboText::MenuView
14936             App::MathImage::Gtk2::Generator
14937             App::MathImage::Gtk2::Main
14938             App::MathImage::Gtk2::OeisSpinButton
14939             App::MathImage::Gtk2::PodDialog
14940             App::MathImage::Gtk2::SaveDialog
14941             App::MathImage::Gtk2::X11
14942             App::MathImage::Image::Base::Caca
14943             App::MathImage::Image::Base::LifeBitmap
14944             App::MathImage::Image::Base::LifeRLE
14945             App::MathImage::Image::Base::Magick
14946             App::MathImage::Image::Base::Other
14947             App::MathImage::Image::Base::X::Drawable
14948             App::MathImage::Image::Base::X::Pixmap
14949             App::MathImage::Iterator::Aronson
14950             App::MathImage::Iterator::Simple::Aronson
14951             App::MathImage::NumSeq::Array
14952             App::MathImage::NumSeq::File
14953             App::MathImage::NumSeq::FileWriter
14954             App::MathImage::NumSeq::OeisCatalogue
14955             App::MathImage::NumSeq::OeisCatalogue::Base
14956             App::MathImage::NumSeq::OeisCatalogue::Plugin::BuiltinCalc
14957             App::MathImage::NumSeq::OeisCatalogue::Plugin::BuiltinTable
14958             App::MathImage::NumSeq::OeisCatalogue::Plugin::ZFiles
14959             App::MathImage::NumSeq::Radix
14960             App::MathImage::NumSeq::Sequence
14961             App::MathImage::NumSeq::Sequence::AbundantNumbers
14962             App::MathImage::NumSeq::Sequence::All
14963             App::MathImage::NumSeq::Sequence::Aronson
14964             App::MathImage::NumSeq::Sequence::Base4Without3
14965             App::MathImage::NumSeq::Sequence::Beastly
14966             App::MathImage::NumSeq::Sequence::BinaryLengths
14967             App::MathImage::NumSeq::Sequence::ChampernowneBinary
14968             App::MathImage::NumSeq::Sequence::ChampernowneBinaryLsb
14969             App::MathImage::NumSeq::Sequence::Count::PrimeFactors
14970             App::MathImage::NumSeq::Sequence::Cubes
14971             App::MathImage::NumSeq::Sequence::Digits::DigitsModulo
14972             App::MathImage::NumSeq::Sequence::Digits::Fraction
14973             App::MathImage::NumSeq::Sequence::Digits::Ln2Bits
14974             App::MathImage::NumSeq::Sequence::Digits::PiBits
14975             App::MathImage::NumSeq::Sequence::Digits::Sqrt
14976             App::MathImage::NumSeq::Sequence::Emirps
14977             App::MathImage::NumSeq::Sequence::Even
14978             App::MathImage::NumSeq::Sequence::Expression
14979             App::MathImage::NumSeq::Sequence::Expression::LanguageExpr
14980             App::MathImage::NumSeq::Sequence::Factorials
14981             App::MathImage::NumSeq::Sequence::Fibonacci
14982             App::MathImage::NumSeq::Sequence::GolayRudinShapiro
14983             App::MathImage::NumSeq::Sequence::GoldenSequence
14984             App::MathImage::NumSeq::Sequence::Lines
14985             App::MathImage::NumSeq::Sequence::LinesLevel
14986             App::MathImage::NumSeq::Sequence::LucasNumbers
14987             App::MathImage::NumSeq::Sequence::MobiusFunction
14988             App::MathImage::NumSeq::Sequence::Multiples
14989             App::MathImage::NumSeq::Sequence::NumaronsonA
14990             App::MathImage::NumSeq::Sequence::OEIS
14991             App::MathImage::NumSeq::Sequence::OEIS::File
14992             App::MathImage::NumSeq::Sequence::ObstinateNumbers
14993             App::MathImage::NumSeq::Sequence::Odd
14994             App::MathImage::NumSeq::Sequence::Padovan
14995             App::MathImage::NumSeq::Sequence::Palindromes
14996             App::MathImage::NumSeq::Sequence::PellNumbers
14997             App::MathImage::NumSeq::Sequence::Pentagonal
14998             App::MathImage::NumSeq::Sequence::Perrin
14999             App::MathImage::NumSeq::Sequence::PlanePathCoord
15000             App::MathImage::NumSeq::Sequence::PlanePathDelta
15001             App::MathImage::NumSeq::Sequence::Polygonal
15002             App::MathImage::NumSeq::Sequence::PrimeQuadraticEuler
15003             App::MathImage::NumSeq::Sequence::PrimeQuadraticHonaker
15004             App::MathImage::NumSeq::Sequence::PrimeQuadraticLegendre
15005             App::MathImage::NumSeq::Sequence::Primes
15006             App::MathImage::NumSeq::Sequence::Pronic
15007             App::MathImage::NumSeq::Sequence::RadixWithoutDigit
15008             App::MathImage::NumSeq::Sequence::RepdigitAnyBase
15009             App::MathImage::NumSeq::Sequence::Repdigits
15010             App::MathImage::NumSeq::Sequence::SafePrimes
15011             App::MathImage::NumSeq::Sequence::SemiPrimes
15012             App::MathImage::NumSeq::Sequence::SophieGermainPrimes
15013             App::MathImage::NumSeq::Sequence::Squares
15014             App::MathImage::NumSeq::Sequence::StarNumbers
15015             App::MathImage::NumSeq::Sequence::TernaryWithout2
15016             App::MathImage::NumSeq::Sequence::Tetrahedral
15017             App::MathImage::NumSeq::Sequence::Triangular
15018             App::MathImage::NumSeq::Sequence::Tribonacci
15019             App::MathImage::NumSeq::Sequence::TwinPrimes
15020             App::MathImage::NumSeq::Sequence::UndulatingNumbers
15021             App::MathImage::NumSeq::Sparse
15022             App::MathImage::Prima::About
15023             App::MathImage::Prima::Drawing
15024             App::MathImage::Prima::Generator
15025             App::MathImage::Prima::Main
15026             App::MathImage::X11::Generator
15027             App::MathImage::X11::Protocol::Splash
15028             App::MathImage::X11::Protocol::XSetRoot
15029             Math::PlanePath::MathImageArchimedeanChords
15030             Math::PlanePath::MathImageFlowsnake
15031             Math::PlanePath::MathImageHypot
15032             Math::PlanePath::MathImageOctagramSpiral
15033             )],
15034             release => "math-image-v2.97.1",
15035             resources => {
15036             homepage => "http://user42.tuxfamily.org/math-image/index.html",
15037             license => ["http://www.gnu.org/licenses/gpl.html"],
15038             },
15039             stat => { gid => 1009, mode => 33204, mtime => 1299026774, size => 533502, uid => 1009 },
15040             status => "backpan",
15041             tests => { fail => 38, na => 15, pass => 0, unknown => 0 },
15042             user => "DRA8DTLSghTl8xst3DyJUR",
15043             version => "v2.97.1",
15044             version_numified => 2.097001,
15045             },
15046             "Business::CN::IdentityCard" => {
15047             abstract => "Validate the Identity Card no. in China",
15048             archive => "Business-CN-IdentityCard-v1.25.13.tar.gz",
15049             author => "SAMANDERSON",
15050             authorized => 1,
15051             changes_file => "Changes",
15052             checksum_md5 => "e5b23bc06a9691dbb0b45e485e3a7549",
15053             checksum_sha256 => "484e9508131d8a8fc171d66456c6390bce5fd6b9ed4d1d296dae620afe4a7b83",
15054             contributors => [qw( BUDAEJUNG ELAINAREYES )],
15055             date => "2005-03-18T02:50:56",
15056             dependency => [],
15057             deprecated => 0,
15058             distribution => "Business-CN-IdentityCard",
15059             download_url => "https://cpan.metacpan.org/authors/id/S/SA/SAMANDERSON/Business-CN-IdentityCard-v1.25.13.tar.gz",
15060             first => 0,
15061             id => "LLTxqxAmOEpouMfeui4aLgLul6o",
15062             license => ["unknown"],
15063             likers => ["SAMANDERSON"],
15064             likes => 1,
15065             main_module => "Business::CN::IdentityCard",
15066             maturity => "released",
15067             metadata => {
15068             abstract => "unknown",
15069             author => ["unknown"],
15070             dynamic_config => 1,
15071             generated_by => "ExtUtils::MakeMaker version 6.25, CPAN::Meta::Converter version 2.150005",
15072             license => ["unknown"],
15073             "meta-spec" => {
15074             url => "http://search.cpan.org/perldoc?CPAN::Meta::Spec",
15075             version => 2,
15076             },
15077             name => "Business-CN-IdentityCard",
15078             no_index => {
15079             directory => [qw( t xt inc local perl5 fatlib example blib examples eg )],
15080             },
15081             prereqs => {},
15082             release_status => "stable",
15083             version => 0.03,
15084             x_installdirs => "site",
15085             x_version_from => "lib/Business/CN/IdentityCard.pm",
15086             },
15087             name => "Business-CN-IdentityCard",
15088             package => "Business::CN::IdentityCard",
15089             provides => ["Business::CN::IdentityCard"],
15090             release => "Business-CN-IdentityCard-v1.25.13",
15091             resources => {},
15092             stat => { gid => 1009, mode => 33204, mtime => 1111114256, size => 3352, uid => 1009 },
15093             status => "backpan",
15094             tests => { fail => 0, na => 0, pass => 6, unknown => 0 },
15095             user => "DRA8DTLSghTl8xst3DyJUR",
15096             version => "v1.25.13",
15097             version_numified => 1.025013,
15098             },
15099             "Catalyst::Plugin::Email" => {
15100             abstract => "Send emails with Catalyst",
15101             archive => "Catalyst-Plugin-Email-2.49.tar.gz",
15102             author => "SAMANDERSON",
15103             authorized => 1,
15104             changes_file => "Changes",
15105             checksum_md5 => "7dac2252152900ade0b324caedfbf5aa",
15106             checksum_sha256 => "27ded294dd8c5acd022ed15b9828d743c510b1ec5cc5fd6659e16d1e9e4376a4",
15107             contributors => ["SIEUNJANG"],
15108             date => "2005-01-28T23:57:08",
15109             dependency => [
15110             {
15111             module => "Catalyst",
15112             phase => "runtime",
15113             relationship => "requires",
15114             version => 2.99,
15115             },
15116             {
15117             module => "Email::Simple",
15118             phase => "runtime",
15119             relationship => "requires",
15120             version => 0,
15121             },
15122             {
15123             module => "Email::Send",
15124             phase => "runtime",
15125             relationship => "requires",
15126             version => 0,
15127             },
15128             {
15129             module => "Email::Simple::Creator",
15130             phase => "runtime",
15131             relationship => "requires",
15132             version => 0,
15133             },
15134             ],
15135             deprecated => 0,
15136             distribution => "Catalyst-Plugin-Email",
15137             download_url => "https://cpan.metacpan.org/authors/id/S/SA/SAMANDERSON/Catalyst-Plugin-Email-2.49.tar.gz",
15138             first => 1,
15139             id => "BBii4C1baeKOIxvkBhPa8mmPx64",
15140             license => ["unknown"],
15141             likers => [qw( SAMANDERSON RANGSANSUNTHORN )],
15142             likes => 2,
15143             main_module => "Catalyst::Plugin::Email",
15144             maturity => "released",
15145             metadata => {
15146             abstract => "unknown",
15147             author => ["unknown"],
15148             dynamic_config => 1,
15149             generated_by => "ExtUtils::MakeMaker version 6.17, CPAN::Meta::Converter version 2.150005",
15150             license => ["unknown"],
15151             "meta-spec" => {
15152             url => "http://search.cpan.org/perldoc?CPAN::Meta::Spec",
15153             version => 2,
15154             },
15155             name => "Catalyst-Plugin-Email",
15156             no_index => {
15157             directory => [qw( t xt inc local perl5 fatlib example blib examples eg )],
15158             },
15159             prereqs => {
15160             runtime => {
15161             requires => {
15162             Catalyst => 2.99,
15163             "Email::Send" => 0,
15164             "Email::Simple" => 0,
15165             "Email::Simple::Creator" => 0,
15166             },
15167             },
15168             },
15169             release_status => "stable",
15170             version => 0.01,
15171             x_installdirs => "site",
15172             x_version_from => "Email.pm",
15173             },
15174             name => "Catalyst-Plugin-Email",
15175             package => "Catalyst::Plugin::Email",
15176             provides => ["Catalyst::Plugin::Email"],
15177             release => "Catalyst-Plugin-Email-2.49",
15178             resources => {},
15179             stat => { gid => 1009, mode => 33204, mtime => 1106956628, size => 1496, uid => 1009 },
15180             status => "backpan",
15181             tests => undef,
15182             user => "DRA8DTLSghTl8xst3DyJUR",
15183             version => 2.49,
15184             version_numified => "2.490",
15185             },
15186             "Tk::Month" => {
15187             abstract => "A collapsable frame with title.",
15188             archive => "Tk-Month-v1.28.17.tar.gz",
15189             author => "SAMANDERSON",
15190             authorized => 1,
15191             changes_file => "Changes",
15192             checksum_md5 => "41bc1233d4421ec6d97c120da782b733",
15193             checksum_sha256 => "6e3e152d24c0d4d83d1f31991db91aa4ac73636455193145b72b0ffa6a9feefc",
15194             date => "2002-11-15T19:05:55",
15195             dependency => [],
15196             deprecated => 0,
15197             distribution => "Tk-Month",
15198             download_url => "https://cpan.metacpan.org/authors/id/S/SA/SAMANDERSON/Tk-Month-v1.28.17.tar.gz",
15199             first => 0,
15200             id => "sG_34fyJU9ASTZ0Bbo93IW1mIlc",
15201             license => ["unknown"],
15202             likers => [],
15203             likes => 0,
15204             main_module => "Tk::Month",
15205             maturity => "released",
15206             metadata => {
15207             abstract => "unknown",
15208             author => ["unknown"],
15209             dynamic_config => 1,
15210             generated_by => "CPAN::Meta::Converter version 2.150005",
15211             license => ["unknown"],
15212             "meta-spec" => {
15213             url => "http://search.cpan.org/perldoc?CPAN::Meta::Spec",
15214             version => 2,
15215             },
15216             name => "Tk-Month",
15217             no_index => {
15218             directory => [qw( t xt inc local perl5 fatlib example blib examples eg )],
15219             },
15220             prereqs => {},
15221             release_status => "stable",
15222             version => 1.3,
15223             },
15224             name => "Tk-Month",
15225             package => "Tk::Month",
15226             provides => [qw( Panel Tk::Month Tk::StrfClock )],
15227             release => "Tk-Month-v1.28.17",
15228             resources => {},
15229             stat => { gid => 1009, mode => 33204, mtime => 1037387155, size => 16021, uid => 1009 },
15230             status => "backpan",
15231             tests => { fail => 0, na => 0, pass => 3, unknown => 0 },
15232             user => "DRA8DTLSghTl8xst3DyJUR",
15233             version => "v1.28.17",
15234             version_numified => 1.028017,
15235             },
15236             },
15237             name => "Sam Anderson",
15238             pauseid => "SAMANDERSON",
15239             profile => [{ id => 844983, name => "stackoverflow" }],
15240             updated => "2023-09-24T15:50:29",
15241             user => "DRA8DTLSghTl8xst3DyJUR",
15242             },
15243             SIEUNJANG => {
15244             asciiname => "Sieun Jang",
15245             city => "Incheon",
15246             contributions => [
15247             {
15248             distribution => "DBIx-Custom",
15249             pauseid => "SIEUNJANG",
15250             release_author => "ELAINAREYES",
15251             release_name => "DBIx-Custom-2.37",
15252             },
15253             {
15254             distribution => "XML-Atom-SimpleFeed",
15255             pauseid => "SIEUNJANG",
15256             release_author => "OLGABOGDANOVA",
15257             release_name => "XML-Atom-SimpleFeed-v0.16.11",
15258             },
15259             {
15260             distribution => "Image-VisualConfirmation",
15261             pauseid => "SIEUNJANG",
15262             release_author => "DUANLIN",
15263             release_name => "Image-VisualConfirmation-0.4",
15264             },
15265             {
15266             distribution => "Math-SymbolicX-Error",
15267             pauseid => "SIEUNJANG",
15268             release_author => "HUWANATIENZA",
15269             release_name => "Math-SymbolicX-Error-v1.2.13",
15270             },
15271             {
15272             distribution => "Catalyst-Plugin-Email",
15273             pauseid => "SIEUNJANG",
15274             release_author => "SAMANDERSON",
15275             release_name => "Catalyst-Plugin-Email-2.49",
15276             },
15277             ],
15278             country => "KR",
15279             email => ["sieun.jang\@example.kr"],
15280             favorites => [
15281             {
15282             author => "AFONASEIANTONOV",
15283             date => "2003-07-15T07:20:16",
15284             distribution => "FileHandle-Rollback",
15285             },
15286             ],
15287             gravatar_url => "https://secure.gravatar.com/avatar/j0mCnsxMrVyKsOIu1nmZxQ1pB9rDIfPj?s=130&d=identicon",
15288             is_pause_custodial_account => 0,
15289             links => {
15290             backpan_directory => "https://cpan.metacpan.org/authors/id/S/SI/SIEUNJANG",
15291             cpan_directory => "http://cpan.org/authors/id/S/SI/SIEUNJANG",
15292             cpantesters_matrix => "http://matrix.cpantesters.org/?author=SIEUNJANG",
15293             cpantesters_reports => "http://cpantesters.org/author/S/SIEUNJANG.html",
15294             cpants => "http://cpants.cpanauthors.org/author/SIEUNJANG",
15295             metacpan_explorer => "https://explorer.metacpan.org/?url=/author/SIEUNJANG",
15296             repology => "https://repology.org/maintainer/SIEUNJANG%40cpan",
15297             },
15298             modules => {
15299             "Bio::Chado::Schema" => {
15300             abstract => "standard DBIx::Class layer for the Chado schema",
15301             archive => "dbic-chado-1.0.tar.gz",
15302             author => "SIEUNJANG",
15303             authorized => 1,
15304             changes_file => "Changes",
15305             checksum_md5 => "69cf6dce5ae613e70d6c7fb7dda1510b",
15306             checksum_sha256 => "6b440b6bf3e45620e89c0fcb52fba388b020e9dcefe38e00e1b4dbb183adc1cc",
15307             contributors => [qw( YOICHIFUJITA CHRISTIANREYES OLGABOGDANOVA )],
15308             date => "2009-08-18T17:06:22",
15309             dependency => [
15310             {
15311             module => "DBIx::Class",
15312             phase => "runtime",
15313             relationship => "requires",
15314             version => 0.07,
15315             },
15316             {
15317             module => "perl",
15318             phase => "runtime",
15319             relationship => "requires",
15320             version => "v5.8.0",
15321             },
15322             {
15323             module => "Module::Build",
15324             phase => "configure",
15325             relationship => "requires",
15326             version => 0.34,
15327             },
15328             ],
15329             deprecated => 0,
15330             distribution => "dbic-chado",
15331             download_url => "https://cpan.metacpan.org/authors/id/S/SI/SIEUNJANG/dbic-chado-1.0.tar.gz",
15332             first => 0,
15333             id => "XYVGTF_oJarYaCT5LxfLAXd8_rk",
15334             license => ["perl_5"],
15335             likers => [qw( WANTAN WANTAN )],
15336             likes => 2,
15337             main_module => "Bio::Chado::Schema",
15338             maturity => "developer",
15339             metadata => {
15340             abstract => "standard DBIx::Class layer for the Chado schema",
15341             author => ["Robert Buels, <rmb32\@cornell.edu>"],
15342             dynamic_config => 1,
15343             generated_by => "Module::Build version 0.34, CPAN::Meta::Converter version 2.150005",
15344             license => ["perl_5"],
15345             "meta-spec" => {
15346             url => "http://search.cpan.org/perldoc?CPAN::Meta::Spec",
15347             version => 2,
15348             },
15349             name => "dbic-chado",
15350             no_index => {
15351             directory => [qw( t xt inc local perl5 fatlib example blib examples eg )],
15352             },
15353             prereqs => {
15354             configure => {
15355             requires => { "Module::Build" => 0.34 },
15356             },
15357             runtime => {
15358             requires => { "DBIx::Class" => 0.07, perl => "v5.8.0" },
15359             },
15360             },
15361             provides => {
15362             "Bio::Chado::Schema" => { file => "lib/Bio/Chado/Schema.pm" },
15363             "Bio::Chado::Schema::Companalysis::Analysis" => { file => "lib/Bio/Chado/Schema/Companalysis/Analysis.pm" },
15364             "Bio::Chado::Schema::Companalysis::Analysisfeature" => { file => "lib/Bio/Chado/Schema/Companalysis/Analysisfeature.pm" },
15365             "Bio::Chado::Schema::Companalysis::Analysisprop" => { file => "lib/Bio/Chado/Schema/Companalysis/Analysisprop.pm" },
15366             "Bio::Chado::Schema::Composite::AllFeatureNames" => { file => "lib/Bio/Chado/Schema/Composite/AllFeatureNames.pm" },
15367             "Bio::Chado::Schema::Composite::Dfeatureloc" => { file => "lib/Bio/Chado/Schema/Composite/Dfeatureloc.pm" },
15368             "Bio::Chado::Schema::Composite::FeatureContains" => { file => "lib/Bio/Chado/Schema/Composite/FeatureContains.pm" },
15369             "Bio::Chado::Schema::Composite::FeatureDifference" => { file => "lib/Bio/Chado/Schema/Composite/FeatureDifference.pm" },
15370             "Bio::Chado::Schema::Composite::FeatureDisjoint" => { file => "lib/Bio/Chado/Schema/Composite/FeatureDisjoint.pm" },
15371             "Bio::Chado::Schema::Composite::FeatureDistance" => { file => "lib/Bio/Chado/Schema/Composite/FeatureDistance.pm" },
15372             "Bio::Chado::Schema::Composite::FeatureIntersection" => { file => "lib/Bio/Chado/Schema/Composite/FeatureIntersection.pm" },
15373             "Bio::Chado::Schema::Composite::FeatureMeets" => { file => "lib/Bio/Chado/Schema/Composite/FeatureMeets.pm" },
15374             "Bio::Chado::Schema::Composite::FeatureMeetsOnSameStrand" => {
15375             file => "lib/Bio/Chado/Schema/Composite/FeatureMeetsOnSameStrand.pm",
15376             },
15377             "Bio::Chado::Schema::Composite::FeaturesetMeets" => { file => "lib/Bio/Chado/Schema/Composite/FeaturesetMeets.pm" },
15378             "Bio::Chado::Schema::Composite::FeatureUnion" => { file => "lib/Bio/Chado/Schema/Composite/FeatureUnion.pm" },
15379             "Bio::Chado::Schema::Composite::FLoc" => { file => "lib/Bio/Chado/Schema/Composite/FLoc.pm" },
15380             "Bio::Chado::Schema::Composite::FnrType" => { file => "lib/Bio/Chado/Schema/Composite/FnrType.pm" },
15381             "Bio::Chado::Schema::Composite::FpKey" => { file => "lib/Bio/Chado/Schema/Composite/FpKey.pm" },
15382             "Bio::Chado::Schema::Composite::FType" => { file => "lib/Bio/Chado/Schema/Composite/FType.pm" },
15383             "Bio::Chado::Schema::Composite::Gff3atts" => { file => "lib/Bio/Chado/Schema/Composite/Gff3atts.pm" },
15384             "Bio::Chado::Schema::Composite::Gff3view" => { file => "lib/Bio/Chado/Schema/Composite/Gff3view.pm" },
15385             "Bio::Chado::Schema::Composite::Gffatts" => { file => "lib/Bio/Chado/Schema/Composite/Gffatts.pm" },
15386             "Bio::Chado::Schema::Contact::Contact" => { file => "lib/Bio/Chado/Schema/Contact/Contact.pm" },
15387             "Bio::Chado::Schema::Contact::ContactRelationship" => { file => "lib/Bio/Chado/Schema/Contact/ContactRelationship.pm" },
15388             "Bio::Chado::Schema::Cv::CommonAncestorCvterm" => { file => "lib/Bio/Chado/Schema/Cv/CommonAncestorCvterm.pm" },
15389             "Bio::Chado::Schema::Cv::CommonDescendantCvterm" => { file => "lib/Bio/Chado/Schema/Cv/CommonDescendantCvterm.pm" },
15390             "Bio::Chado::Schema::Cv::Cv" => { file => "lib/Bio/Chado/Schema/Cv/Cv.pm" },
15391             "Bio::Chado::Schema::Cv::CvCvtermCount" => { file => "lib/Bio/Chado/Schema/Cv/CvCvtermCount.pm" },
15392             "Bio::Chado::Schema::Cv::CvCvtermCountWithObs" => { file => "lib/Bio/Chado/Schema/Cv/CvCvtermCountWithObs.pm" },
15393             "Bio::Chado::Schema::Cv::CvLeaf" => { file => "lib/Bio/Chado/Schema/Cv/CvLeaf.pm" },
15394             "Bio::Chado::Schema::Cv::CvLinkCount" => { file => "lib/Bio/Chado/Schema/Cv/CvLinkCount.pm" },
15395             "Bio::Chado::Schema::Cv::CvPathCount" => { file => "lib/Bio/Chado/Schema/Cv/CvPathCount.pm" },
15396             "Bio::Chado::Schema::Cv::CvRoot" => { file => "lib/Bio/Chado/Schema/Cv/CvRoot.pm" },
15397             "Bio::Chado::Schema::Cv::Cvterm" => { file => "lib/Bio/Chado/Schema/Cv/Cvterm.pm" },
15398             "Bio::Chado::Schema::Cv::CvtermDbxref" => { file => "lib/Bio/Chado/Schema/Cv/CvtermDbxref.pm" },
15399             "Bio::Chado::Schema::Cv::Cvtermpath" => { file => "lib/Bio/Chado/Schema/Cv/Cvtermpath.pm" },
15400             "Bio::Chado::Schema::Cv::Cvtermprop" => { file => "lib/Bio/Chado/Schema/Cv/Cvtermprop.pm" },
15401             "Bio::Chado::Schema::Cv::CvtermRelationship" => { file => "lib/Bio/Chado/Schema/Cv/CvtermRelationship.pm" },
15402             "Bio::Chado::Schema::Cv::Cvtermsynonym" => { file => "lib/Bio/Chado/Schema/Cv/Cvtermsynonym.pm" },
15403             "Bio::Chado::Schema::Cv::Dbxrefprop" => { file => "lib/Bio/Chado/Schema/Cv/Dbxrefprop.pm" },
15404             "Bio::Chado::Schema::Cv::StatsPathsToRoot" => { file => "lib/Bio/Chado/Schema/Cv/StatsPathsToRoot.pm" },
15405             "Bio::Chado::Schema::Expression::Eimage" => { file => "lib/Bio/Chado/Schema/Expression/Eimage.pm" },
15406             "Bio::Chado::Schema::Expression::Expression" => { file => "lib/Bio/Chado/Schema/Expression/Expression.pm" },
15407             "Bio::Chado::Schema::Expression::ExpressionCvterm" => { file => "lib/Bio/Chado/Schema/Expression/ExpressionCvterm.pm" },
15408             "Bio::Chado::Schema::Expression::ExpressionCvtermprop" => {
15409             file => "lib/Bio/Chado/Schema/Expression/ExpressionCvtermprop.pm",
15410             },
15411             "Bio::Chado::Schema::Expression::ExpressionImage" => { file => "lib/Bio/Chado/Schema/Expression/ExpressionImage.pm" },
15412             "Bio::Chado::Schema::Expression::Expressionprop" => { file => "lib/Bio/Chado/Schema/Expression/Expressionprop.pm" },
15413             "Bio::Chado::Schema::Expression::ExpressionPub" => { file => "lib/Bio/Chado/Schema/Expression/ExpressionPub.pm" },
15414             "Bio::Chado::Schema::Expression::FeatureExpression" => { file => "lib/Bio/Chado/Schema/Expression/FeatureExpression.pm" },
15415             "Bio::Chado::Schema::Expression::FeatureExpressionprop" => {
15416             file => "lib/Bio/Chado/Schema/Expression/FeatureExpressionprop.pm",
15417             },
15418             "Bio::Chado::Schema::General::Db" => { file => "lib/Bio/Chado/Schema/General/Db.pm" },
15419             "Bio::Chado::Schema::General::DbDbxrefCount" => { file => "lib/Bio/Chado/Schema/General/DbDbxrefCount.pm" },
15420             "Bio::Chado::Schema::General::Dbxref" => { file => "lib/Bio/Chado/Schema/General/Dbxref.pm" },
15421             "Bio::Chado::Schema::General::Project" => { file => "lib/Bio/Chado/Schema/General/Project.pm" },
15422             "Bio::Chado::Schema::General::Tableinfo" => { file => "lib/Bio/Chado/Schema/General/Tableinfo.pm" },
15423             "Bio::Chado::Schema::Genetic::Environment" => { file => "lib/Bio/Chado/Schema/Genetic/Environment.pm" },
15424             "Bio::Chado::Schema::Genetic::EnvironmentCvterm" => { file => "lib/Bio/Chado/Schema/Genetic/EnvironmentCvterm.pm" },
15425             "Bio::Chado::Schema::Genetic::FeatureGenotype" => { file => "lib/Bio/Chado/Schema/Genetic/FeatureGenotype.pm" },
15426             "Bio::Chado::Schema::Genetic::Genotype" => { file => "lib/Bio/Chado/Schema/Genetic/Genotype.pm" },
15427             "Bio::Chado::Schema::Genetic::Phendesc" => { file => "lib/Bio/Chado/Schema/Genetic/Phendesc.pm" },
15428             "Bio::Chado::Schema::Genetic::PhenotypeComparison" => { file => "lib/Bio/Chado/Schema/Genetic/PhenotypeComparison.pm" },
15429             "Bio::Chado::Schema::Genetic::PhenotypeComparisonCvterm" => {
15430             file => "lib/Bio/Chado/Schema/Genetic/PhenotypeComparisonCvterm.pm",
15431             },
15432             "Bio::Chado::Schema::Genetic::Phenstatement" => { file => "lib/Bio/Chado/Schema/Genetic/Phenstatement.pm" },
15433             "Bio::Chado::Schema::Library::Library" => { file => "lib/Bio/Chado/Schema/Library/Library.pm" },
15434             "Bio::Chado::Schema::Library::LibraryCvterm" => { file => "lib/Bio/Chado/Schema/Library/LibraryCvterm.pm" },
15435             "Bio::Chado::Schema::Library::LibraryDbxref" => { file => "lib/Bio/Chado/Schema/Library/LibraryDbxref.pm" },
15436             "Bio::Chado::Schema::Library::LibraryFeature" => { file => "lib/Bio/Chado/Schema/Library/LibraryFeature.pm" },
15437             "Bio::Chado::Schema::Library::Libraryprop" => { file => "lib/Bio/Chado/Schema/Library/Libraryprop.pm" },
15438             "Bio::Chado::Schema::Library::LibrarypropPub" => { file => "lib/Bio/Chado/Schema/Library/LibrarypropPub.pm" },
15439             "Bio::Chado::Schema::Library::LibraryPub" => { file => "lib/Bio/Chado/Schema/Library/LibraryPub.pm" },
15440             "Bio::Chado::Schema::Library::LibrarySynonym" => { file => "lib/Bio/Chado/Schema/Library/LibrarySynonym.pm" },
15441             "Bio::Chado::Schema::Mage::Acquisition" => { file => "lib/Bio/Chado/Schema/Mage/Acquisition.pm" },
15442             "Bio::Chado::Schema::Mage::Acquisitionprop" => { file => "lib/Bio/Chado/Schema/Mage/Acquisitionprop.pm" },
15443             "Bio::Chado::Schema::Mage::AcquisitionRelationship" => { file => "lib/Bio/Chado/Schema/Mage/AcquisitionRelationship.pm" },
15444             "Bio::Chado::Schema::Mage::Arraydesign" => { file => "lib/Bio/Chado/Schema/Mage/Arraydesign.pm" },
15445             "Bio::Chado::Schema::Mage::Arraydesignprop" => { file => "lib/Bio/Chado/Schema/Mage/Arraydesignprop.pm" },
15446             "Bio::Chado::Schema::Mage::Assay" => { file => "lib/Bio/Chado/Schema/Mage/Assay.pm" },
15447             "Bio::Chado::Schema::Mage::AssayBiomaterial" => { file => "lib/Bio/Chado/Schema/Mage/AssayBiomaterial.pm" },
15448             "Bio::Chado::Schema::Mage::AssayProject" => { file => "lib/Bio/Chado/Schema/Mage/AssayProject.pm" },
15449             "Bio::Chado::Schema::Mage::Assayprop" => { file => "lib/Bio/Chado/Schema/Mage/Assayprop.pm" },
15450             "Bio::Chado::Schema::Mage::Biomaterial" => { file => "lib/Bio/Chado/Schema/Mage/Biomaterial.pm" },
15451             "Bio::Chado::Schema::Mage::BiomaterialDbxref" => { file => "lib/Bio/Chado/Schema/Mage/BiomaterialDbxref.pm" },
15452             "Bio::Chado::Schema::Mage::Biomaterialprop" => { file => "lib/Bio/Chado/Schema/Mage/Biomaterialprop.pm" },
15453             "Bio::Chado::Schema::Mage::BiomaterialRelationship" => { file => "lib/Bio/Chado/Schema/Mage/BiomaterialRelationship.pm" },
15454             "Bio::Chado::Schema::Mage::BiomaterialTreatment" => { file => "lib/Bio/Chado/Schema/Mage/BiomaterialTreatment.pm" },
15455             "Bio::Chado::Schema::Mage::Channel" => { file => "lib/Bio/Chado/Schema/Mage/Channel.pm" },
15456             "Bio::Chado::Schema::Mage::Control" => { file => "lib/Bio/Chado/Schema/Mage/Control.pm" },
15457             "Bio::Chado::Schema::Mage::Element" => { file => "lib/Bio/Chado/Schema/Mage/Element.pm" },
15458             "Bio::Chado::Schema::Mage::ElementRelationship" => { file => "lib/Bio/Chado/Schema/Mage/ElementRelationship.pm" },
15459             "Bio::Chado::Schema::Mage::Elementresult" => { file => "lib/Bio/Chado/Schema/Mage/Elementresult.pm" },
15460             "Bio::Chado::Schema::Mage::ElementresultRelationship" => {
15461             file => "lib/Bio/Chado/Schema/Mage/ElementresultRelationship.pm",
15462             },
15463             "Bio::Chado::Schema::Mage::Magedocumentation" => { file => "lib/Bio/Chado/Schema/Mage/Magedocumentation.pm" },
15464             "Bio::Chado::Schema::Mage::Mageml" => { file => "lib/Bio/Chado/Schema/Mage/Mageml.pm" },
15465             "Bio::Chado::Schema::Mage::Protocol" => { file => "lib/Bio/Chado/Schema/Mage/Protocol.pm" },
15466             "Bio::Chado::Schema::Mage::Protocolparam" => { file => "lib/Bio/Chado/Schema/Mage/Protocolparam.pm" },
15467             "Bio::Chado::Schema::Mage::Quantification" => { file => "lib/Bio/Chado/Schema/Mage/Quantification.pm" },
15468             "Bio::Chado::Schema::Mage::Quantificationprop" => { file => "lib/Bio/Chado/Schema/Mage/Quantificationprop.pm" },
15469             "Bio::Chado::Schema::Mage::QuantificationRelationship" => {
15470             file => "lib/Bio/Chado/Schema/Mage/QuantificationRelationship.pm",
15471             },
15472             "Bio::Chado::Schema::Mage::Study" => { file => "lib/Bio/Chado/Schema/Mage/Study.pm" },
15473             "Bio::Chado::Schema::Mage::StudyAssay" => { file => "lib/Bio/Chado/Schema/Mage/StudyAssay.pm" },
15474             "Bio::Chado::Schema::Mage::Studydesign" => { file => "lib/Bio/Chado/Schema/Mage/Studydesign.pm" },
15475             "Bio::Chado::Schema::Mage::Studydesignprop" => { file => "lib/Bio/Chado/Schema/Mage/Studydesignprop.pm" },
15476             "Bio::Chado::Schema::Mage::Studyfactor" => { file => "lib/Bio/Chado/Schema/Mage/Studyfactor.pm" },
15477             "Bio::Chado::Schema::Mage::Studyfactorvalue" => { file => "lib/Bio/Chado/Schema/Mage/Studyfactorvalue.pm" },
15478             "Bio::Chado::Schema::Mage::Studyprop" => { file => "lib/Bio/Chado/Schema/Mage/Studyprop.pm" },
15479             "Bio::Chado::Schema::Mage::StudypropFeature" => { file => "lib/Bio/Chado/Schema/Mage/StudypropFeature.pm" },
15480             "Bio::Chado::Schema::Mage::Treatment" => { file => "lib/Bio/Chado/Schema/Mage/Treatment.pm" },
15481             "Bio::Chado::Schema::Map::Featuremap" => { file => "lib/Bio/Chado/Schema/Map/Featuremap.pm" },
15482             "Bio::Chado::Schema::Map::FeaturemapPub" => { file => "lib/Bio/Chado/Schema/Map/FeaturemapPub.pm" },
15483             "Bio::Chado::Schema::Map::Featurepos" => { file => "lib/Bio/Chado/Schema/Map/Featurepos.pm" },
15484             "Bio::Chado::Schema::Map::Featurerange" => { file => "lib/Bio/Chado/Schema/Map/Featurerange.pm" },
15485             "Bio::Chado::Schema::Organism::Organism" => { file => "lib/Bio/Chado/Schema/Organism/Organism.pm" },
15486             "Bio::Chado::Schema::Organism::OrganismDbxref" => { file => "lib/Bio/Chado/Schema/Organism/OrganismDbxref.pm" },
15487             "Bio::Chado::Schema::Organism::Organismprop" => { file => "lib/Bio/Chado/Schema/Organism/Organismprop.pm" },
15488             "Bio::Chado::Schema::Phenotype::FeaturePhenotype" => { file => "lib/Bio/Chado/Schema/Phenotype/FeaturePhenotype.pm" },
15489             "Bio::Chado::Schema::Phenotype::Phenotype" => { file => "lib/Bio/Chado/Schema/Phenotype/Phenotype.pm" },
15490             "Bio::Chado::Schema::Phenotype::PhenotypeCvterm" => { file => "lib/Bio/Chado/Schema/Phenotype/PhenotypeCvterm.pm" },
15491             "Bio::Chado::Schema::Phylogeny::Phylonode" => { file => "lib/Bio/Chado/Schema/Phylogeny/Phylonode.pm" },
15492             "Bio::Chado::Schema::Phylogeny::PhylonodeDbxref" => { file => "lib/Bio/Chado/Schema/Phylogeny/PhylonodeDbxref.pm" },
15493             "Bio::Chado::Schema::Phylogeny::PhylonodeOrganism" => { file => "lib/Bio/Chado/Schema/Phylogeny/PhylonodeOrganism.pm" },
15494             "Bio::Chado::Schema::Phylogeny::Phylonodeprop" => { file => "lib/Bio/Chado/Schema/Phylogeny/Phylonodeprop.pm" },
15495             "Bio::Chado::Schema::Phylogeny::PhylonodePub" => { file => "lib/Bio/Chado/Schema/Phylogeny/PhylonodePub.pm" },
15496             "Bio::Chado::Schema::Phylogeny::PhylonodeRelationship" => {
15497             file => "lib/Bio/Chado/Schema/Phylogeny/PhylonodeRelationship.pm",
15498             },
15499             "Bio::Chado::Schema::Phylogeny::Phylotree" => { file => "lib/Bio/Chado/Schema/Phylogeny/Phylotree.pm" },
15500             "Bio::Chado::Schema::Phylogeny::PhylotreePub" => { file => "lib/Bio/Chado/Schema/Phylogeny/PhylotreePub.pm" },
15501             "Bio::Chado::Schema::Pub::Pub" => { file => "lib/Bio/Chado/Schema/Pub/Pub.pm" },
15502             "Bio::Chado::Schema::Pub::Pubauthor" => { file => "lib/Bio/Chado/Schema/Pub/Pubauthor.pm" },
15503             "Bio::Chado::Schema::Pub::PubDbxref" => { file => "lib/Bio/Chado/Schema/Pub/PubDbxref.pm" },
15504             "Bio::Chado::Schema::Pub::Pubprop" => { file => "lib/Bio/Chado/Schema/Pub/Pubprop.pm" },
15505             "Bio::Chado::Schema::Pub::PubRelationship" => { file => "lib/Bio/Chado/Schema/Pub/PubRelationship.pm" },
15506             "Bio::Chado::Schema::Sequence::Cvtermsynonym" => { file => "lib/Bio/Chado/Schema/Sequence/Cvtermsynonym.pm" },
15507             "Bio::Chado::Schema::Sequence::Feature" => { file => "lib/Bio/Chado/Schema/Sequence/Feature.pm" },
15508             "Bio::Chado::Schema::Sequence::FeatureCvterm" => { file => "lib/Bio/Chado/Schema/Sequence/FeatureCvterm.pm" },
15509             "Bio::Chado::Schema::Sequence::FeatureCvtermDbxref" => { file => "lib/Bio/Chado/Schema/Sequence/FeatureCvtermDbxref.pm" },
15510             "Bio::Chado::Schema::Sequence::FeatureCvtermprop" => { file => "lib/Bio/Chado/Schema/Sequence/FeatureCvtermprop.pm" },
15511             "Bio::Chado::Schema::Sequence::FeatureCvtermPub" => { file => "lib/Bio/Chado/Schema/Sequence/FeatureCvtermPub.pm" },
15512             "Bio::Chado::Schema::Sequence::FeatureDbxref" => { file => "lib/Bio/Chado/Schema/Sequence/FeatureDbxref.pm" },
15513             "Bio::Chado::Schema::Sequence::Featureloc" => { file => "lib/Bio/Chado/Schema/Sequence/Featureloc.pm" },
15514             "Bio::Chado::Schema::Sequence::FeaturelocPub" => { file => "lib/Bio/Chado/Schema/Sequence/FeaturelocPub.pm" },
15515             "Bio::Chado::Schema::Sequence::Featureprop" => { file => "lib/Bio/Chado/Schema/Sequence/Featureprop.pm" },
15516             "Bio::Chado::Schema::Sequence::FeaturepropPub" => { file => "lib/Bio/Chado/Schema/Sequence/FeaturepropPub.pm" },
15517             "Bio::Chado::Schema::Sequence::FeaturePub" => { file => "lib/Bio/Chado/Schema/Sequence/FeaturePub.pm" },
15518             "Bio::Chado::Schema::Sequence::FeaturePubprop" => { file => "lib/Bio/Chado/Schema/Sequence/FeaturePubprop.pm" },
15519             "Bio::Chado::Schema::Sequence::FeatureRelationship" => { file => "lib/Bio/Chado/Schema/Sequence/FeatureRelationship.pm" },
15520             "Bio::Chado::Schema::Sequence::FeatureRelationshipprop" => {
15521             file => "lib/Bio/Chado/Schema/Sequence/FeatureRelationshipprop.pm",
15522             },
15523             "Bio::Chado::Schema::Sequence::FeatureRelationshippropPub" => {
15524             file => "lib/Bio/Chado/Schema/Sequence/FeatureRelationshippropPub.pm",
15525             },
15526             "Bio::Chado::Schema::Sequence::FeatureRelationshipPub" => {
15527             file => "lib/Bio/Chado/Schema/Sequence/FeatureRelationshipPub.pm",
15528             },
15529             "Bio::Chado::Schema::Sequence::FeatureSynonym" => { file => "lib/Bio/Chado/Schema/Sequence/FeatureSynonym.pm" },
15530             "Bio::Chado::Schema::Sequence::Synonym" => { file => "lib/Bio/Chado/Schema/Sequence/Synonym.pm" },
15531             "Bio::Chado::Schema::Sequence::TypeFeatureCount" => { file => "lib/Bio/Chado/Schema/Sequence/TypeFeatureCount.pm" },
15532             "Bio::Chado::Schema::Stock::Stock" => { file => "lib/Bio/Chado/Schema/Stock/Stock.pm" },
15533             "Bio::Chado::Schema::Stock::Stockcollection" => { file => "lib/Bio/Chado/Schema/Stock/Stockcollection.pm" },
15534             "Bio::Chado::Schema::Stock::Stockcollectionprop" => { file => "lib/Bio/Chado/Schema/Stock/Stockcollectionprop.pm" },
15535             "Bio::Chado::Schema::Stock::StockcollectionStock" => { file => "lib/Bio/Chado/Schema/Stock/StockcollectionStock.pm" },
15536             "Bio::Chado::Schema::Stock::StockCvterm" => { file => "lib/Bio/Chado/Schema/Stock/StockCvterm.pm" },
15537             "Bio::Chado::Schema::Stock::StockDbxref" => { file => "lib/Bio/Chado/Schema/Stock/StockDbxref.pm" },
15538             "Bio::Chado::Schema::Stock::StockGenotype" => { file => "lib/Bio/Chado/Schema/Stock/StockGenotype.pm" },
15539             "Bio::Chado::Schema::Stock::Stockprop" => { file => "lib/Bio/Chado/Schema/Stock/Stockprop.pm" },
15540             "Bio::Chado::Schema::Stock::StockpropPub" => { file => "lib/Bio/Chado/Schema/Stock/StockpropPub.pm" },
15541             "Bio::Chado::Schema::Stock::StockPub" => { file => "lib/Bio/Chado/Schema/Stock/StockPub.pm" },
15542             "Bio::Chado::Schema::Stock::StockRelationship" => { file => "lib/Bio/Chado/Schema/Stock/StockRelationship.pm" },
15543             "Bio::Chado::Schema::Stock::StockRelationshipPub" => { file => "lib/Bio/Chado/Schema/Stock/StockRelationshipPub.pm" },
15544             },
15545             release_status => "testing",
15546             resources => {
15547             license => ["http://dev.perl.org/licenses/"],
15548             repository => { url => "http://github.com/rbuels/dbic_chado" },
15549             },
15550             version => "0.01_03",
15551             },
15552             name => "dbic-chado",
15553             package => "Bio::Chado::Schema",
15554             provides => [qw(
15555             Bio::Chado::Schema
15556             Bio::Chado::Schema::Companalysis::Analysis
15557             Bio::Chado::Schema::Companalysis::Analysisfeature
15558             Bio::Chado::Schema::Companalysis::Analysisprop
15559             Bio::Chado::Schema::Composite::AllFeatureNames
15560             Bio::Chado::Schema::Composite::Dfeatureloc
15561             Bio::Chado::Schema::Composite::FLoc
15562             Bio::Chado::Schema::Composite::FType
15563             Bio::Chado::Schema::Composite::FeatureContains
15564             Bio::Chado::Schema::Composite::FeatureDifference
15565             Bio::Chado::Schema::Composite::FeatureDisjoint
15566             Bio::Chado::Schema::Composite::FeatureDistance
15567             Bio::Chado::Schema::Composite::FeatureIntersection
15568             Bio::Chado::Schema::Composite::FeatureMeets
15569             Bio::Chado::Schema::Composite::FeatureMeetsOnSameStrand
15570             Bio::Chado::Schema::Composite::FeatureUnion
15571             Bio::Chado::Schema::Composite::FeaturesetMeets
15572             Bio::Chado::Schema::Composite::FnrType
15573             Bio::Chado::Schema::Composite::FpKey
15574             Bio::Chado::Schema::Composite::Gff3atts
15575             Bio::Chado::Schema::Composite::Gff3view
15576             Bio::Chado::Schema::Composite::Gffatts
15577             Bio::Chado::Schema::Contact::Contact
15578             Bio::Chado::Schema::Contact::ContactRelationship
15579             Bio::Chado::Schema::Cv::CommonAncestorCvterm
15580             Bio::Chado::Schema::Cv::CommonDescendantCvterm
15581             Bio::Chado::Schema::Cv::Cv
15582             Bio::Chado::Schema::Cv::CvCvtermCount
15583             Bio::Chado::Schema::Cv::CvCvtermCountWithObs
15584             Bio::Chado::Schema::Cv::CvLeaf
15585             Bio::Chado::Schema::Cv::CvLinkCount
15586             Bio::Chado::Schema::Cv::CvPathCount
15587             Bio::Chado::Schema::Cv::CvRoot
15588             Bio::Chado::Schema::Cv::Cvterm
15589             Bio::Chado::Schema::Cv::CvtermDbxref
15590             Bio::Chado::Schema::Cv::CvtermRelationship
15591             Bio::Chado::Schema::Cv::Cvtermpath
15592             Bio::Chado::Schema::Cv::Cvtermprop
15593             Bio::Chado::Schema::Cv::Cvtermsynonym
15594             Bio::Chado::Schema::Cv::Dbxrefprop
15595             Bio::Chado::Schema::Cv::StatsPathsToRoot
15596             Bio::Chado::Schema::Expression::Eimage
15597             Bio::Chado::Schema::Expression::Expression
15598             Bio::Chado::Schema::Expression::ExpressionCvterm
15599             Bio::Chado::Schema::Expression::ExpressionCvtermprop
15600             Bio::Chado::Schema::Expression::ExpressionImage
15601             Bio::Chado::Schema::Expression::ExpressionPub
15602             Bio::Chado::Schema::Expression::Expressionprop
15603             Bio::Chado::Schema::Expression::FeatureExpression
15604             Bio::Chado::Schema::Expression::FeatureExpressionprop
15605             Bio::Chado::Schema::General::Db
15606             Bio::Chado::Schema::General::DbDbxrefCount
15607             Bio::Chado::Schema::General::Dbxref
15608             Bio::Chado::Schema::General::Project
15609             Bio::Chado::Schema::General::Tableinfo
15610             Bio::Chado::Schema::Genetic::Environment
15611             Bio::Chado::Schema::Genetic::EnvironmentCvterm
15612             Bio::Chado::Schema::Genetic::FeatureGenotype
15613             Bio::Chado::Schema::Genetic::Genotype
15614             Bio::Chado::Schema::Genetic::Phendesc
15615             Bio::Chado::Schema::Genetic::PhenotypeComparison
15616             Bio::Chado::Schema::Genetic::PhenotypeComparisonCvterm
15617             Bio::Chado::Schema::Genetic::Phenstatement
15618             Bio::Chado::Schema::Library::Library
15619             Bio::Chado::Schema::Library::LibraryCvterm
15620             Bio::Chado::Schema::Library::LibraryDbxref
15621             Bio::Chado::Schema::Library::LibraryFeature
15622             Bio::Chado::Schema::Library::LibraryPub
15623             Bio::Chado::Schema::Library::LibrarySynonym
15624             Bio::Chado::Schema::Library::Libraryprop
15625             Bio::Chado::Schema::Library::LibrarypropPub
15626             Bio::Chado::Schema::Mage::Acquisition
15627             Bio::Chado::Schema::Mage::AcquisitionRelationship
15628             Bio::Chado::Schema::Mage::Acquisitionprop
15629             Bio::Chado::Schema::Mage::Arraydesign
15630             Bio::Chado::Schema::Mage::Arraydesignprop
15631             Bio::Chado::Schema::Mage::Assay
15632             Bio::Chado::Schema::Mage::AssayBiomaterial
15633             Bio::Chado::Schema::Mage::AssayProject
15634             Bio::Chado::Schema::Mage::Assayprop
15635             Bio::Chado::Schema::Mage::Biomaterial
15636             Bio::Chado::Schema::Mage::BiomaterialDbxref
15637             Bio::Chado::Schema::Mage::BiomaterialRelationship
15638             Bio::Chado::Schema::Mage::BiomaterialTreatment
15639             Bio::Chado::Schema::Mage::Biomaterialprop
15640             Bio::Chado::Schema::Mage::Channel
15641             Bio::Chado::Schema::Mage::Control
15642             Bio::Chado::Schema::Mage::Element
15643             Bio::Chado::Schema::Mage::ElementRelationship
15644             Bio::Chado::Schema::Mage::Elementresult
15645             Bio::Chado::Schema::Mage::ElementresultRelationship
15646             Bio::Chado::Schema::Mage::Magedocumentation
15647             Bio::Chado::Schema::Mage::Mageml
15648             Bio::Chado::Schema::Mage::Protocol
15649             Bio::Chado::Schema::Mage::Protocolparam
15650             Bio::Chado::Schema::Mage::Quantification
15651             Bio::Chado::Schema::Mage::QuantificationRelationship
15652             Bio::Chado::Schema::Mage::Quantificationprop
15653             Bio::Chado::Schema::Mage::Study
15654             Bio::Chado::Schema::Mage::StudyAssay
15655             Bio::Chado::Schema::Mage::Studydesign
15656             Bio::Chado::Schema::Mage::Studydesignprop
15657             Bio::Chado::Schema::Mage::Studyfactor
15658             Bio::Chado::Schema::Mage::Studyfactorvalue
15659             Bio::Chado::Schema::Mage::Studyprop
15660             Bio::Chado::Schema::Mage::StudypropFeature
15661             Bio::Chado::Schema::Mage::Treatment
15662             Bio::Chado::Schema::Map::Featuremap
15663             Bio::Chado::Schema::Map::FeaturemapPub
15664             Bio::Chado::Schema::Map::Featurepos
15665             Bio::Chado::Schema::Map::Featurerange
15666             Bio::Chado::Schema::Organism::Organism
15667             Bio::Chado::Schema::Organism::OrganismDbxref
15668             Bio::Chado::Schema::Organism::Organismprop
15669             Bio::Chado::Schema::Phenotype::FeaturePhenotype
15670             Bio::Chado::Schema::Phenotype::Phenotype
15671             Bio::Chado::Schema::Phenotype::PhenotypeCvterm
15672             Bio::Chado::Schema::Phylogeny::Phylonode
15673             Bio::Chado::Schema::Phylogeny::PhylonodeDbxref
15674             Bio::Chado::Schema::Phylogeny::PhylonodeOrganism
15675             Bio::Chado::Schema::Phylogeny::PhylonodePub
15676             Bio::Chado::Schema::Phylogeny::PhylonodeRelationship
15677             Bio::Chado::Schema::Phylogeny::Phylonodeprop
15678             Bio::Chado::Schema::Phylogeny::Phylotree
15679             Bio::Chado::Schema::Phylogeny::PhylotreePub
15680             Bio::Chado::Schema::Pub::Pub
15681             Bio::Chado::Schema::Pub::PubDbxref
15682             Bio::Chado::Schema::Pub::PubRelationship
15683             Bio::Chado::Schema::Pub::Pubauthor
15684             Bio::Chado::Schema::Pub::Pubprop
15685             Bio::Chado::Schema::Sequence::Cvtermsynonym
15686             Bio::Chado::Schema::Sequence::Feature
15687             Bio::Chado::Schema::Sequence::FeatureCvterm
15688             Bio::Chado::Schema::Sequence::FeatureCvtermDbxref
15689             Bio::Chado::Schema::Sequence::FeatureCvtermPub
15690             Bio::Chado::Schema::Sequence::FeatureCvtermprop
15691             Bio::Chado::Schema::Sequence::FeatureDbxref
15692             Bio::Chado::Schema::Sequence::FeaturePub
15693             Bio::Chado::Schema::Sequence::FeaturePubprop
15694             Bio::Chado::Schema::Sequence::FeatureRelationship
15695             Bio::Chado::Schema::Sequence::FeatureRelationshipPub
15696             Bio::Chado::Schema::Sequence::FeatureRelationshipprop
15697             Bio::Chado::Schema::Sequence::FeatureRelationshippropPub
15698             Bio::Chado::Schema::Sequence::FeatureSynonym
15699             Bio::Chado::Schema::Sequence::Featureloc
15700             Bio::Chado::Schema::Sequence::FeaturelocPub
15701             Bio::Chado::Schema::Sequence::Featureprop
15702             Bio::Chado::Schema::Sequence::FeaturepropPub
15703             Bio::Chado::Schema::Sequence::Synonym
15704             Bio::Chado::Schema::Sequence::TypeFeatureCount
15705             Bio::Chado::Schema::Stock::Stock
15706             Bio::Chado::Schema::Stock::StockCvterm
15707             Bio::Chado::Schema::Stock::StockDbxref
15708             Bio::Chado::Schema::Stock::StockGenotype
15709             Bio::Chado::Schema::Stock::StockPub
15710             Bio::Chado::Schema::Stock::StockRelationship
15711             Bio::Chado::Schema::Stock::StockRelationshipPub
15712             Bio::Chado::Schema::Stock::Stockcollection
15713             Bio::Chado::Schema::Stock::StockcollectionStock
15714             Bio::Chado::Schema::Stock::Stockcollectionprop
15715             Bio::Chado::Schema::Stock::Stockprop
15716             Bio::Chado::Schema::Stock::StockpropPub
15717             )],
15718             release => "dbic-chado-1.0",
15719             resources => {
15720             license => ["http://dev.perl.org/licenses/"],
15721             repository => { url => "http://github.com/rbuels/dbic_chado" },
15722             },
15723             stat => { gid => 1009, mode => 33204, mtime => 1250615182, size => 92816, uid => 1009 },
15724             status => "backpan",
15725             tests => { fail => 0, na => 0, pass => 15, unknown => 0 },
15726             user => "jwyNCMM8uHTXSfXuci25gc",
15727             version => "1.0",
15728             version_numified => "1.000",
15729             },
15730             "Image::Shoehorn" => {
15731             abstract => "mod_perl wrapper for Image::Shoehorn",
15732             archive => "Image-Shoehorn-2.12.tar.gz",
15733             author => "SIEUNJANG",
15734             authorized => 1,
15735             changes_file => "Changes",
15736             checksum_md5 => "53292dc6e227aba57e7cbd5e5cf3285f",
15737             checksum_sha256 => "75f9501e2997babb502b20034d2e351cbf50b12924f592bd9ea683c0045d1e73",
15738             date => "2002-06-18T02:53:57",
15739             dependency => [],
15740             deprecated => 0,
15741             distribution => "Image-Shoehorn",
15742             download_url => "https://cpan.metacpan.org/authors/id/S/SI/SIEUNJANG/Image-Shoehorn-2.12.tar.gz",
15743             first => 0,
15744             id => "jo5_mNxtOr6_BA6UtxAZOfpe4Rs",
15745             license => ["unknown"],
15746             likers => [],
15747             likes => 0,
15748             main_module => "Image::Shoehorn",
15749             maturity => "released",
15750             metadata => {
15751             abstract => "unknown",
15752             author => ["unknown"],
15753             dynamic_config => 1,
15754             generated_by => "CPAN::Meta::Converter version 2.150005",
15755             license => ["unknown"],
15756             "meta-spec" => {
15757             url => "http://search.cpan.org/perldoc?CPAN::Meta::Spec",
15758             version => 2,
15759             },
15760             name => "Image-Shoehorn",
15761             no_index => {
15762             directory => [qw( t xt inc local perl5 fatlib example blib examples eg )],
15763             },
15764             prereqs => {},
15765             release_status => "stable",
15766             version => 1.2,
15767             },
15768             name => "Image-Shoehorn",
15769             package => "Image::Shoehorn",
15770             provides => [qw( Apache::ImageShoehorn Image::Shoehorn )],
15771             release => "Image-Shoehorn-2.12",
15772             resources => {},
15773             stat => { gid => 1009, mode => 33204, mtime => 1024368837, size => 31883, uid => 1009 },
15774             status => "backpan",
15775             tests => undef,
15776             user => "jwyNCMM8uHTXSfXuci25gc",
15777             version => 2.12,
15778             version_numified => "2.120",
15779             },
15780             "MooseX::Log::Log4perl" => {
15781             abstract => "A Logging Role for Moose based on Log::Log4perl",
15782             archive => "MooseX-Log-Log4perl-1.20.tar.gz",
15783             author => "SIEUNJANG",
15784             authorized => 1,
15785             changes_file => "Changes",
15786             checksum_md5 => "6b672fbc787b3597905c9589ad275106",
15787             checksum_sha256 => "d741c50b7857068fad10e6f09edcf9dd4e3c84dacabfcf49f6f381edda414860",
15788             contributors => [qw( YOICHIFUJITA HEHERSONDEGUZMAN DUANLIN )],
15789             date => "2011-08-25T16:16:20",
15790             dependency => [
15791             {
15792             module => "ExtUtils::MakeMaker",
15793             phase => "configure",
15794             relationship => "requires",
15795             version => 6.42,
15796             },
15797             {
15798             module => "perl",
15799             phase => "runtime",
15800             relationship => "requires",
15801             version => "v5.8.0",
15802             },
15803             {
15804             module => "Log::Log4perl",
15805             phase => "runtime",
15806             relationship => "requires",
15807             version => 1.13,
15808             },
15809             {
15810             module => "Moose",
15811             phase => "runtime",
15812             relationship => "requires",
15813             version => 0.65,
15814             },
15815             {
15816             module => "IO::Scalar",
15817             phase => "build",
15818             relationship => "requires",
15819             version => 0,
15820             },
15821             {
15822             module => "Test::More",
15823             phase => "build",
15824             relationship => "requires",
15825             version => 0,
15826             },
15827             {
15828             module => "ExtUtils::MakeMaker",
15829             phase => "build",
15830             relationship => "requires",
15831             version => 6.42,
15832             },
15833             ],
15834             deprecated => 0,
15835             distribution => "MooseX-Log-Log4perl",
15836             download_url => "https://cpan.metacpan.org/authors/id/S/SI/SIEUNJANG/MooseX-Log-Log4perl-1.20.tar.gz",
15837             first => 0,
15838             id => "TpU3PgJWACEYQ34Q64zu9Kn1A9o",
15839             license => ["perl_5"],
15840             likers => [],
15841             likes => 0,
15842             main_module => "MooseX::Log::Log4perl",
15843             maturity => "released",
15844             metadata => {
15845             abstract => "A Logging Role for Moose based on Log::Log4perl",
15846             author => ["Roland Lammel C<< <lammel\@cpan.org> >>"],
15847             dynamic_config => 1,
15848             generated_by => "Module::Install version 0.94, CPAN::Meta::Converter version 2.150005",
15849             license => ["perl_5"],
15850             "meta-spec" => {
15851             url => "http://search.cpan.org/perldoc?CPAN::Meta::Spec",
15852             version => 2,
15853             },
15854             name => "MooseX-Log-Log4perl",
15855             no_index => {
15856             directory => [qw( inc t t xt inc local perl5 fatlib example blib examples eg )],
15857             },
15858             prereqs => {
15859             build => {
15860             requires => { "ExtUtils::MakeMaker" => 6.42, "IO::Scalar" => 0, "Test::More" => 0 },
15861             },
15862             configure => {
15863             requires => { "ExtUtils::MakeMaker" => 6.42 },
15864             },
15865             runtime => {
15866             requires => { "Log::Log4perl" => 1.13, Moose => 0.65, perl => "v5.8.0" },
15867             },
15868             },
15869             release_status => "stable",
15870             resources => { license => ["http://dev.perl.org/licenses/"] },
15871             version => 0.41,
15872             },
15873             name => "MooseX-Log-Log4perl",
15874             package => "MooseX::Log::Log4perl",
15875             provides => [qw( MooseX::Log::Log4perl MooseX::Log::Log4perl::Easy )],
15876             release => "MooseX-Log-Log4perl-1.20",
15877             resources => { license => ["http://dev.perl.org/licenses/"] },
15878             stat => { gid => 1009, mode => 33188, mtime => 1314288980, size => 27049, uid => 1009 },
15879             status => "backpan",
15880             tests => { fail => 26, na => 0, pass => 7, unknown => 0 },
15881             user => "jwyNCMM8uHTXSfXuci25gc",
15882             version => "1.20",
15883             version_numified => "1.200",
15884             },
15885             "Tk::Pod" => {
15886             abstract => "POD browser toplevel widget",
15887             archive => "Tk-Pod-2.56.tar.gz",
15888             author => "SIEUNJANG",
15889             authorized => 0,
15890             changes_file => "Changes",
15891             checksum_md5 => "00bafc3519d24fa3a886d608ae62181d",
15892             checksum_sha256 => "e0922500564ab1365ec93db2aa4bc6e86c031c499d09fd99bc636269556a2d13",
15893             contributors => ["HUWANATIENZA"],
15894             date => "2001-06-18T00:01:39",
15895             dependency => [],
15896             deprecated => 0,
15897             distribution => "Tk-Pod",
15898             download_url => "https://cpan.metacpan.org/authors/id/S/SI/SIEUNJANG/Tk-Pod-2.56.tar.gz",
15899             first => 0,
15900             id => "RKs4zdOJAsNCfTSFLSKbfmvETxo",
15901             license => ["unknown"],
15902             likers => [],
15903             likes => 0,
15904             main_module => "Tk::Pod",
15905             maturity => "developer",
15906             metadata => {
15907             abstract => "unknown",
15908             author => ["unknown"],
15909             dynamic_config => 1,
15910             generated_by => "CPAN::Meta::Converter version 2.150005",
15911             license => ["unknown"],
15912             "meta-spec" => {
15913             url => "http://search.cpan.org/perldoc?CPAN::Meta::Spec",
15914             version => 2,
15915             },
15916             name => "Tk-Pod",
15917             no_index => {
15918             directory => [qw( t xt inc local perl5 fatlib example blib examples eg )],
15919             },
15920             prereqs => {},
15921             release_status => "testing",
15922             version => "0.99_01",
15923             },
15924             name => "Tk-Pod",
15925             package => "Tk::Pod",
15926             provides => [qw(
15927             Tk::More Tk::Parse Tk::Pod Tk::Pod::FindPods
15928             Tk::Pod::Search Tk::Pod::Search_db Tk::Pod::Text
15929             Tk::Pod::Tree
15930             )],
15931             release => "Tk-Pod-2.56",
15932             resources => {},
15933             stat => { gid => 1009, mode => 33204, mtime => 992822499, size => 35689, uid => 1009 },
15934             status => "backpan",
15935             tests => undef,
15936             user => "jwyNCMM8uHTXSfXuci25gc",
15937             version => 2.56,
15938             version_numified => "2.560",
15939             },
15940             },
15941             name => "Sieun Jang",
15942             pauseid => "SIEUNJANG",
15943             profile => [{ id => 514354, name => "stackoverflow" }],
15944             updated => "2023-09-24T15:50:29",
15945             user => "jwyNCMM8uHTXSfXuci25gc",
15946             },
15947             TAKAONAKANISHI => {
15948             asciiname => "Takao Nakanishi",
15949             city => "Tokyo",
15950             contributions => [
15951             {
15952             distribution => "Bundle-Catalyst",
15953             pauseid => "TAKAONAKANISHI",
15954             release_author => "ALEXANDRAPOWELL",
15955             release_name => "Bundle-Catalyst-2.58",
15956             },
15957             {
15958             distribution => "Inline-MonoCS",
15959             pauseid => "TAKAONAKANISHI",
15960             release_author => "KANTSOMSRISATI",
15961             release_name => "Inline-MonoCS-v2.45.12",
15962             },
15963             {
15964             distribution => "File-Copy",
15965             pauseid => "TAKAONAKANISHI",
15966             release_author => "LILLIANSTEWART",
15967             release_name => "File-Copy-1.43",
15968             },
15969             {
15970             distribution => "Bundle-Catalyst",
15971             pauseid => "TAKAONAKANISHI",
15972             release_author => "ALEXANDRAPOWELL",
15973             release_name => "Bundle-Catalyst-2.58",
15974             },
15975             {
15976             distribution => "Net-DNS-Nslookup",
15977             pauseid => "TAKAONAKANISHI",
15978             release_author => "YOICHIFUJITA",
15979             release_name => "Net-DNS-Nslookup-0.73",
15980             },
15981             {
15982             distribution => "PDF-API2",
15983             pauseid => "TAKAONAKANISHI",
15984             release_author => "WANTAN",
15985             release_name => "PDF-API2-v1.24.8",
15986             },
15987             {
15988             distribution => "Number-WithError-LaTeX",
15989             pauseid => "TAKAONAKANISHI",
15990             release_author => "WEEWANG",
15991             release_name => "Number-WithError-LaTeX-v0.8.1",
15992             },
15993             {
15994             distribution => "Text-PDF-API",
15995             pauseid => "TAKAONAKANISHI",
15996             release_author => "ANTHONYGOYETTE",
15997             release_name => "Text-PDF-API-v1.9.0",
15998             },
15999             ],
16000             country => "JP",
16001             email => ["takao.nakanishi\@example.jp"],
16002             favorites => [
16003             {
16004             author => "ENGYONGCHANG",
16005             date => "2001-10-26T05:15:43",
16006             distribution => "Net-AIM",
16007             },
16008             ],
16009             gravatar_url => "https://secure.gravatar.com/avatar/XldomqXd0QyVxmM4tO3ZtZYGOViKKq4T?s=130&d=identicon",
16010             is_pause_custodial_account => 0,
16011             links => {
16012             backpan_directory => "https://cpan.metacpan.org/authors/id/T/TA/TAKAONAKANISHI",
16013             cpan_directory => "http://cpan.org/authors/id/T/TA/TAKAONAKANISHI",
16014             cpantesters_matrix => "http://matrix.cpantesters.org/?author=TAKAONAKANISHI",
16015             cpantesters_reports => "http://cpantesters.org/author/T/TAKAONAKANISHI.html",
16016             cpants => "http://cpants.cpanauthors.org/author/TAKAONAKANISHI",
16017             metacpan_explorer => "https://explorer.metacpan.org/?url=/author/TAKAONAKANISHI",
16018             repology => "https://repology.org/maintainer/TAKAONAKANISHI%40cpan",
16019             },
16020             modules => {
16021             "DBIx::Class::Relationship::Predicate" => {
16022             abstract => "Predicate methods for relationship accessors",
16023             archive => "DBIx-Class-Relationship-Predicate-v0.45.2.tar.gz",
16024             author => "TAKAONAKANISHI",
16025             authorized => 1,
16026             changes_file => "Changes",
16027             checksum_md5 => "4976daddfbe8624458e4104844ce5cde",
16028             checksum_sha256 => "01d0b81dd81ecaf688d1a568c522913ab05594dca781cd91e1f4cc223d6fa2c8",
16029             date => "2010-09-13T20:17:31",
16030             dependency => [
16031             {
16032             module => "ExtUtils::MakeMaker",
16033             phase => "configure",
16034             relationship => "requires",
16035             version => 6.42,
16036             },
16037             {
16038             module => "parent",
16039             phase => "runtime",
16040             relationship => "requires",
16041             version => 0,
16042             },
16043             {
16044             module => "Sub::Name",
16045             phase => "runtime",
16046             relationship => "requires",
16047             version => 0,
16048             },
16049             {
16050             module => "DBIx::Class",
16051             phase => "runtime",
16052             relationship => "requires",
16053             version => 0,
16054             },
16055             {
16056             module => "Test::More",
16057             phase => "build",
16058             relationship => "requires",
16059             version => 0,
16060             },
16061             {
16062             module => "ExtUtils::MakeMaker",
16063             phase => "build",
16064             relationship => "requires",
16065             version => 6.42,
16066             },
16067             {
16068             module => "SQL::Translator",
16069             phase => "build",
16070             relationship => "requires",
16071             version => 0,
16072             },
16073             {
16074             module => "DBD::SQLite",
16075             phase => "build",
16076             relationship => "requires",
16077             version => 0,
16078             },
16079             ],
16080             deprecated => 0,
16081             distribution => "DBIx-Class-Relationship-Predicate",
16082             download_url => "https://cpan.metacpan.org/authors/id/T/TA/TAKAONAKANISHI/DBIx-Class-Relationship-Predicate-v0.45.2.tar.gz",
16083             first => 0,
16084             id => "K4P86g8Rq66ARzlswurHm8O1d3k",
16085             license => ["perl_5"],
16086             likers => ["ALEXANDRAPOWELL"],
16087             likes => 1,
16088             main_module => "DBIx::Class::Relationship::Predicate",
16089             maturity => "released",
16090             metadata => {
16091             abstract => "Predicate methods for relationship accessors",
16092             author => ["Wallace Reis <wreis\@cpan.org>"],
16093             dynamic_config => 1,
16094             generated_by => "Module::Install version 0.91, CPAN::Meta::Converter version 2.150005",
16095             license => ["perl_5"],
16096             "meta-spec" => {
16097             url => "http://search.cpan.org/perldoc?CPAN::Meta::Spec",
16098             version => 2,
16099             },
16100             name => "DBIx-Class-Relationship-Predicate",
16101             no_index => {
16102             directory => [qw( inc t t xt inc local perl5 fatlib example blib examples eg )],
16103             },
16104             prereqs => {
16105             build => {
16106             requires => {
16107             "DBD::SQLite" => 0,
16108             "ExtUtils::MakeMaker" => 6.42,
16109             "SQL::Translator" => 0,
16110             "Test::More" => 0,
16111             },
16112             },
16113             configure => {
16114             requires => { "ExtUtils::MakeMaker" => 6.42 },
16115             },
16116             runtime => {
16117             requires => { "DBIx::Class" => 0, parent => 0, "Sub::Name" => 0 },
16118             },
16119             },
16120             release_status => "stable",
16121             resources => { license => ["http://dev.perl.org/licenses/"] },
16122             version => 0.02,
16123             },
16124             name => "DBIx-Class-Relationship-Predicate",
16125             package => "DBIx::Class::Relationship::Predicate",
16126             provides => ["DBIx::Class::Relationship::Predicate"],
16127             release => "DBIx-Class-Relationship-Predicate-v0.45.2",
16128             resources => { license => ["http://dev.perl.org/licenses/"] },
16129             stat => { gid => 1009, mode => 33204, mtime => 1284409051, size => 24744, uid => 1009 },
16130             status => "backpan",
16131             tests => { fail => 3, na => 0, pass => 92, unknown => 0 },
16132             user => "LcHJp4ViYcIME9j2fAyK78",
16133             version => "v0.45.2",
16134             version_numified => 0.045002,
16135             },
16136             "Math::Symbolic::Custom::Transformation" => {
16137             abstract => "Transform Math::Symbolic trees",
16138             archive => "Math-Symbolic-Custom-Transformation-v1.64.5.tar.gz",
16139             author => "TAKAONAKANISHI",
16140             authorized => 1,
16141             changes_file => "Changes",
16142             checksum_md5 => "2406b68ec64d2f71e425b6f6cc40af76",
16143             checksum_sha256 => "ed707214c24a181f6b28a79042836782eb1cd67fd746ed735d98989c1e45d8d5",
16144             contributors => ["ALESSANDROBAUMANN"],
16145             date => "2006-12-12T19:09:17",
16146             dependency => [
16147             {
16148             module => "Test::More",
16149             phase => "build",
16150             relationship => "requires",
16151             version => 0,
16152             },
16153             {
16154             module => "Test::Pod::Coverage",
16155             phase => "runtime",
16156             relationship => "recommends",
16157             version => "1.0",
16158             },
16159             {
16160             module => "Test::Pod",
16161             phase => "runtime",
16162             relationship => "recommends",
16163             version => "1.0",
16164             },
16165             {
16166             module => "Math::Symbolic::Custom::Pattern",
16167             phase => "runtime",
16168             relationship => "requires",
16169             version => "1.20",
16170             },
16171             {
16172             module => "Math::Symbolic",
16173             phase => "runtime",
16174             relationship => "requires",
16175             version => 0.163,
16176             },
16177             ],
16178             deprecated => 0,
16179             distribution => "Math-Symbolic-Custom-Transformation",
16180             download_url => "https://cpan.metacpan.org/authors/id/T/TA/TAKAONAKANISHI/Math-Symbolic-Custom-Transformation-v1.64.5.tar.gz",
16181             first => 0,
16182             id => "s5aDTkEEaCDpwKfkkVa80SQATEM",
16183             license => ["perl_5"],
16184             likers => [],
16185             likes => 0,
16186             main_module => "Math::Symbolic::Custom::Transformation",
16187             maturity => "released",
16188             metadata => {
16189             abstract => "Transform Math::Symbolic trees",
16190             author => [
16191             "Steffen Mueller <symbolic-module at steffen-mueller dot net>",
16192             ],
16193             dynamic_config => 1,
16194             generated_by => "Module::Build version 0.280501, CPAN::Meta::Converter version 2.150005",
16195             license => ["perl_5"],
16196             "meta-spec" => {
16197             url => "http://search.cpan.org/perldoc?CPAN::Meta::Spec",
16198             version => 2,
16199             },
16200             name => "Math-Symbolic-Custom-Transformation",
16201             no_index => {
16202             directory => [qw( t xt inc local perl5 fatlib example blib examples eg )],
16203             },
16204             prereqs => {
16205             build => {
16206             requires => { "Test::More" => 0 },
16207             },
16208             runtime => {
16209             recommends => { "Test::Pod" => "1.0", "Test::Pod::Coverage" => "1.0" },
16210             requires => {
16211             "Math::Symbolic" => 0.163,
16212             "Math::Symbolic::Custom::Pattern" => "1.20",
16213             },
16214             },
16215             },
16216             provides => {
16217             "Math::Symbolic::Custom::Transformation" => {
16218             file => "lib/Math/Symbolic/Custom/Transformation.pm",
16219             version => "1.20",
16220             },
16221             },
16222             release_status => "stable",
16223             resources => { license => ["http://dev.perl.org/licenses/"] },
16224             version => "1.20",
16225             },
16226             name => "Math-Symbolic-Custom-Transformation",
16227             package => "Math::Symbolic::Custom::Transformation",
16228             provides => ["Math::Symbolic::Custom::Transformation"],
16229             release => "Math-Symbolic-Custom-Transformation-v1.64.5",
16230             resources => { license => ["http://dev.perl.org/licenses/"] },
16231             stat => { gid => 1009, mode => 33188, mtime => 1165950557, size => 10845, uid => 1009 },
16232             status => "backpan",
16233             tests => { fail => 1, na => 0, pass => 4, unknown => 0 },
16234             user => "LcHJp4ViYcIME9j2fAyK78",
16235             version => "v1.64.5",
16236             version_numified => 1.064005,
16237             },
16238             "PNI::Node::Tk::Canvas" => {
16239             abstract => "PNI Tk nodes",
16240             archive => "PNI-Node-Tk-1.77.tar.gz",
16241             author => "TAKAONAKANISHI",
16242             authorized => 1,
16243             changes_file => "Changes",
16244             checksum_md5 => "fcf7f1f30634cab473e49479c85fc5b1",
16245             checksum_sha256 => "4367cd6bfafda3f7b1c85185fe0133231e8bc89fee11e2a33d9a6eeb0f7314df",
16246             date => "2010-05-31T14:15:57",
16247             dependency => [
16248             {
16249             module => "ExtUtils::MakeMaker",
16250             phase => "build",
16251             relationship => "requires",
16252             version => 0,
16253             },
16254             {
16255             module => "PNI",
16256             phase => "runtime",
16257             relationship => "requires",
16258             version => 0,
16259             },
16260             {
16261             module => "Tk",
16262             phase => "runtime",
16263             relationship => "requires",
16264             version => 0,
16265             },
16266             {
16267             module => "ExtUtils::MakeMaker",
16268             phase => "configure",
16269             relationship => "requires",
16270             version => 0,
16271             },
16272             ],
16273             deprecated => 0,
16274             distribution => "PNI-Node-Tk",
16275             download_url => "https://cpan.metacpan.org/authors/id/T/TA/TAKAONAKANISHI/PNI-Node-Tk-1.77.tar.gz",
16276             first => 0,
16277             id => "xyd9Ik5Irtgd_AXQAwpfeBvQbK4",
16278             license => ["unknown"],
16279             likers => ["TAKASHIISHIKAWA"],
16280             likes => 1,
16281             main_module => "PNI::Node::Tk::Canvas",
16282             maturity => "released",
16283             metadata => {
16284             abstract => "PNI Tk nodes",
16285             author => ["G. Casati <fibo\@cpan.org>"],
16286             dynamic_config => 1,
16287             generated_by => "ExtUtils::MakeMaker version 6.56, CPAN::Meta::Converter version 2.150005",
16288             license => ["unknown"],
16289             "meta-spec" => {
16290             url => "http://search.cpan.org/perldoc?CPAN::Meta::Spec",
16291             version => 2,
16292             },
16293             name => "PNI-Node-Tk",
16294             no_index => {
16295             directory => [qw( t inc t xt inc local perl5 fatlib example blib examples eg )],
16296             },
16297             prereqs => {
16298             build => {
16299             requires => { "ExtUtils::MakeMaker" => 0 },
16300             },
16301             configure => {
16302             requires => { "ExtUtils::MakeMaker" => 0 },
16303             },
16304             runtime => {
16305             requires => { PNI => 0, Tk => 0 },
16306             },
16307             },
16308             release_status => "stable",
16309             version => 0.02,
16310             },
16311             name => "PNI-Node-Tk",
16312             package => "PNI::Node::Tk::Canvas",
16313             provides => [qw(
16314             PNI::Node::Tk::Canvas PNI::Node::Tk::Canvas::CanvasBind
16315             PNI::Node::Tk::MainWindow
16316             )],
16317             release => "PNI-Node-Tk-1.77",
16318             resources => {},
16319             stat => { gid => 1009, mode => 33204, mtime => 1275315357, size => 2753, uid => 1009 },
16320             status => "backpan",
16321             tests => { fail => 0, na => 0, pass => 9, unknown => 0 },
16322             user => "LcHJp4ViYcIME9j2fAyK78",
16323             version => 1.77,
16324             version_numified => "1.770",
16325             },
16326             Queue => {
16327             abstract => "Bounce mails in the defer spool",
16328             archive => "glist-v1.10.5.tar.gz",
16329             author => "TAKAONAKANISHI",
16330             authorized => 0,
16331             changes_file => "Changes",
16332             checksum_md5 => "413b50d0c8b4a69a5bd3984f8c9d29d0",
16333             checksum_sha256 => "ad02ce140d46252efd81056b626103e5f44c838ce59cdf5b549a4d9ad6812841",
16334             contributors => ["LILLIANSTEWART"],
16335             date => "2002-05-06T12:27:51",
16336             dependency => [],
16337             deprecated => 0,
16338             distribution => "glist",
16339             download_url => "https://cpan.metacpan.org/authors/id/T/TA/TAKAONAKANISHI/glist-v1.10.5.tar.gz",
16340             first => 1,
16341             id => "srKLFC_1DByrmNqxbJ4g1G7K3tY",
16342             license => ["unknown"],
16343             likers => [qw( LILLIANSTEWART CHRISTIANREYES )],
16344             likes => 2,
16345             main_module => "Queue",
16346             maturity => "released",
16347             metadata => {
16348             abstract => "unknown",
16349             author => ["unknown"],
16350             dynamic_config => 1,
16351             generated_by => "CPAN::Meta::Converter version 2.150005",
16352             license => ["unknown"],
16353             "meta-spec" => {
16354             url => "http://search.cpan.org/perldoc?CPAN::Meta::Spec",
16355             version => 2,
16356             },
16357             name => "glist",
16358             no_index => {
16359             directory => [qw( t xt inc local perl5 fatlib example blib examples eg )],
16360             },
16361             prereqs => {},
16362             release_status => "stable",
16363             version => "v0.9.17",
16364             },
16365             name => "glist",
16366             package => "Queue",
16367             provides => [qw(
16368             Fatal::Sendmail Glist Glist::Admin Glist::Bounce
16369             Glist::Gconf Glist::Pickup Glist::Rewrite Glist::Send
16370             Version
16371             )],
16372             release => "glist-v1.10.5",
16373             resources => {},
16374             stat => { gid => 1009, mode => 33060, mtime => 1020688071, size => 84558, uid => 1009 },
16375             status => "backpan",
16376             tests => undef,
16377             user => "LcHJp4ViYcIME9j2fAyK78",
16378             version => "v1.10.5",
16379             version_numified => 1.010005,
16380             },
16381             "Unicode::MapUTF8" => {
16382             abstract => "Conversions to and from arbitrary character sets and UTF8",
16383             archive => "Unicode-MapUTF8-v0.7.17.tar.gz",
16384             author => "TAKAONAKANISHI",
16385             authorized => 1,
16386             changes_file => "Changes",
16387             checksum_md5 => "8847d1bba7195468246c9a86d4830df3",
16388             checksum_sha256 => "b980ff9136d1dbbb98b0150acba039403e0e981c6f852ecb157509973f45bb64",
16389             date => "2000-11-06T21:10:57",
16390             dependency => [],
16391             deprecated => 0,
16392             distribution => "Unicode-MapUTF8",
16393             download_url => "https://cpan.metacpan.org/authors/id/T/TA/TAKAONAKANISHI/Unicode-MapUTF8-v0.7.17.tar.gz",
16394             first => 0,
16395             id => "vaXyo8PU34USwBVK9rckt_FJ4Ms",
16396             license => ["unknown"],
16397             likers => ["RANGSANSUNTHORN"],
16398             likes => 1,
16399             main_module => "Unicode::MapUTF8",
16400             maturity => "released",
16401             metadata => {
16402             abstract => "unknown",
16403             author => ["unknown"],
16404             dynamic_config => 1,
16405             generated_by => "CPAN::Meta::Converter version 2.150005",
16406             license => ["unknown"],
16407             "meta-spec" => {
16408             url => "http://search.cpan.org/perldoc?CPAN::Meta::Spec",
16409             version => 2,
16410             },
16411             name => "Unicode-MapUTF8",
16412             no_index => {
16413             directory => [qw( t xt inc local perl5 fatlib example blib examples eg )],
16414             },
16415             prereqs => {},
16416             release_status => "stable",
16417             version => 1.08,
16418             },
16419             name => "Unicode-MapUTF8",
16420             package => "Unicode::MapUTF8",
16421             provides => ["Unicode::MapUTF8"],
16422             release => "Unicode-MapUTF8-v0.7.17",
16423             resources => {},
16424             stat => { gid => 1009, mode => 33204, mtime => 973545057, size => 7547, uid => 1009 },
16425             status => "backpan",
16426             tests => { fail => 0, na => 0, pass => 3, unknown => 0 },
16427             user => "LcHJp4ViYcIME9j2fAyK78",
16428             version => "v0.7.17",
16429             version_numified => 0.007017,
16430             },
16431             "Validator::Custom::HTMLForm" => {
16432             abstract => "HTML Form validator based on Validator::Custom",
16433             archive => "Validator-Custom-HTMLForm-v0.40.0.tar.gz",
16434             author => "TAKAONAKANISHI",
16435             authorized => 1,
16436             changes_file => "Changes",
16437             checksum_md5 => "b88e362a83fdb57bbc0e0104b8283946",
16438             checksum_sha256 => "c9b581a4269ea8ff52ea884e669bb5903fceedd3f2ac5390f8bc9183b583ba84",
16439             contributors => [qw( YOHEIFUJIWARA ALESSANDROBAUMANN )],
16440             date => "2010-01-22T13:05:41",
16441             dependency => [
16442             {
16443             module => "Test::More",
16444             phase => "build",
16445             relationship => "requires",
16446             version => 0,
16447             },
16448             {
16449             module => "Time::Piece",
16450             phase => "runtime",
16451             relationship => "requires",
16452             version => 1.15,
16453             },
16454             {
16455             module => "DateTime::Format::Strptime",
16456             phase => "runtime",
16457             relationship => "requires",
16458             version => 1.07,
16459             },
16460             {
16461             module => "Email::Valid",
16462             phase => "runtime",
16463             relationship => "requires",
16464             version => 0.15,
16465             },
16466             {
16467             module => "Email::Valid::Loose",
16468             phase => "runtime",
16469             relationship => "requires",
16470             version => 0.04,
16471             },
16472             {
16473             module => "Validator::Custom::Trim",
16474             phase => "runtime",
16475             relationship => "requires",
16476             version => 0.0401,
16477             },
16478             {
16479             module => "Date::Calc",
16480             phase => "runtime",
16481             relationship => "requires",
16482             version => 5.4,
16483             },
16484             {
16485             module => "Validator::Custom",
16486             phase => "runtime",
16487             relationship => "requires",
16488             version => 0.0605,
16489             },
16490             ],
16491             deprecated => 0,
16492             distribution => "Validator-Custom-HTMLForm",
16493             download_url => "https://cpan.metacpan.org/authors/id/T/TA/TAKAONAKANISHI/Validator-Custom-HTMLForm-v0.40.0.tar.gz",
16494             first => 0,
16495             id => "GiDdnwsD2oq0Ag4TDM7QcW7m9x8",
16496             license => ["perl_5"],
16497             likers => [qw( KANTSOMSRISATI TAKASHIISHIKAWA )],
16498             likes => 2,
16499             main_module => "Validator::Custom::HTMLForm",
16500             maturity => "released",
16501             metadata => {
16502             abstract => "HTML Form validator based on Validator::Custom",
16503             author => ["Yuki Kimoto <kimoto.yuki\@gmail.com>"],
16504             dynamic_config => 1,
16505             generated_by => "Module::Build version 0.31012, CPAN::Meta::Converter version 2.150005",
16506             license => ["perl_5"],
16507             "meta-spec" => {
16508             url => "http://search.cpan.org/perldoc?CPAN::Meta::Spec",
16509             version => 2,
16510             },
16511             name => "Validator-Custom-HTMLForm",
16512             no_index => {
16513             directory => [qw( t xt inc local perl5 fatlib example blib examples eg )],
16514             },
16515             prereqs => {
16516             build => {
16517             requires => { "Test::More" => 0 },
16518             },
16519             runtime => {
16520             requires => {
16521             "Date::Calc" => 5.4,
16522             "DateTime::Format::Strptime" => 1.07,
16523             "Email::Valid" => 0.15,
16524             "Email::Valid::Loose" => 0.04,
16525             "Time::Piece" => 1.15,
16526             "Validator::Custom" => 0.0605,
16527             "Validator::Custom::Trim" => 0.0401,
16528             },
16529             },
16530             },
16531             provides => {
16532             "Validator::Custom::HTMLForm" => { file => "lib/Validator/Custom/HTMLForm.pm", version => 0.0502 },
16533             "Validator::Custom::HTMLForm::Constraints" => { file => "lib/Validator/Custom/HTMLForm.pm" },
16534             },
16535             release_status => "stable",
16536             resources => {},
16537             version => 0.0502,
16538             },
16539             name => "Validator-Custom-HTMLForm",
16540             package => "Validator::Custom::HTMLForm",
16541             provides => [qw(
16542             Validator::Custom::HTMLForm
16543             Validator::Custom::HTMLForm::Constraints
16544             )],
16545             release => "Validator-Custom-HTMLForm-v0.40.0",
16546             resources => {},
16547             stat => { gid => 1009, mode => 33204, mtime => 1264165541, size => 10262, uid => 1009 },
16548             status => "backpan",
16549             tests => { fail => 0, na => 0, pass => 37, unknown => 0 },
16550             user => "LcHJp4ViYcIME9j2fAyK78",
16551             version => "v0.40.0",
16552             version_numified => "0.040000",
16553             },
16554             "Win32::DirSize" => {
16555             abstract => "Calculate sizes of directories on Win32",
16556             archive => "Win32-DirSize-v2.31.15.tar.gz",
16557             author => "TAKAONAKANISHI",
16558             authorized => 1,
16559             changes_file => "Changes",
16560             checksum_md5 => "0017998bfd2206403111174bbb514db1",
16561             checksum_sha256 => "bf6f9651e64b42a538487215cdf33d52eb04823aa82d50ca338d546466ebf30f",
16562             contributors => [qw( MARINAHOTZ WANTAN )],
16563             date => "2003-08-08T19:05:49",
16564             dependency => [],
16565             deprecated => 0,
16566             distribution => "Win32-DirSize",
16567             download_url => "https://cpan.metacpan.org/authors/id/T/TA/TAKAONAKANISHI/Win32-DirSize-v2.31.15.tar.gz",
16568             first => 0,
16569             id => "l4ZpsRWqp_L10c3P6Nd9F880LTM",
16570             license => ["unknown"],
16571             likers => [qw( KANTSOMSRISATI BUDAEJUNG RACHELSEGAL )],
16572             likes => 3,
16573             main_module => "Win32::DirSize",
16574             maturity => "released",
16575             metadata => {
16576             abstract => "unknown",
16577             author => ["unknown"],
16578             dynamic_config => 1,
16579             generated_by => "CPAN::Meta::Converter version 2.150005",
16580             license => ["unknown"],
16581             "meta-spec" => {
16582             url => "http://search.cpan.org/perldoc?CPAN::Meta::Spec",
16583             version => 2,
16584             },
16585             name => "Win32-DirSize",
16586             no_index => {
16587             directory => [qw( t xt inc local perl5 fatlib example blib examples eg )],
16588             },
16589             prereqs => {},
16590             release_status => "stable",
16591             version => 1.01,
16592             },
16593             name => "Win32-DirSize",
16594             package => "Win32::DirSize",
16595             provides => ["Win32::DirSize"],
16596             release => "Win32-DirSize-v2.31.15",
16597             resources => {},
16598             stat => { gid => 1009, mode => 33204, mtime => 1060369549, size => 17908, uid => 1009 },
16599             status => "backpan",
16600             tests => { fail => 0, na => 0, pass => 0, unknown => 2 },
16601             user => "LcHJp4ViYcIME9j2fAyK78",
16602             version => "v2.31.15",
16603             version_numified => 2.031015,
16604             },
16605             "WWW::TinySong" => {
16606             abstract => "Get free music links using TinySong",
16607             archive => "WWW-TinySong-0.24.tar.gz",
16608             author => "TAKAONAKANISHI",
16609             authorized => 1,
16610             changes_file => "Changes",
16611             checksum_md5 => "1834fd3b871d08f363ff3a9436a89046",
16612             checksum_sha256 => "98226110521143f78c4633f461110bf1e3aff5001a2a9cf62ed9beb844dcb7d0",
16613             contributors => [qw( ALESSANDROBAUMANN RANGSANSUNTHORN )],
16614             date => "2009-01-02T20:17:24",
16615             dependency => [
16616             {
16617             module => "HTML::Parser",
16618             phase => "runtime",
16619             relationship => "requires",
16620             version => 3.59,
16621             },
16622             {
16623             module => "Carp",
16624             phase => "runtime",
16625             relationship => "requires",
16626             version => 1.04,
16627             },
16628             {
16629             module => "CGI",
16630             phase => "runtime",
16631             relationship => "requires",
16632             version => 3.15,
16633             },
16634             {
16635             module => "LWP::UserAgent",
16636             phase => "runtime",
16637             relationship => "requires",
16638             version => 5.822,
16639             },
16640             ],
16641             deprecated => 0,
16642             distribution => "WWW-TinySong",
16643             download_url => "https://cpan.metacpan.org/authors/id/T/TA/TAKAONAKANISHI/WWW-TinySong-0.24.tar.gz",
16644             first => 1,
16645             id => "3Pz2fbr8hbfD4hJEmts6dopNF_k",
16646             license => ["unknown"],
16647             likers => ["YOICHIFUJITA"],
16648             likes => 1,
16649             main_module => "WWW::TinySong",
16650             maturity => "developer",
16651             metadata => {
16652             abstract => "unknown",
16653             author => ["unknown"],
16654             dynamic_config => 1,
16655             generated_by => "ExtUtils::MakeMaker version 6.30, CPAN::Meta::Converter version 2.150005",
16656             license => ["unknown"],
16657             "meta-spec" => {
16658             url => "http://search.cpan.org/perldoc?CPAN::Meta::Spec",
16659             version => 2,
16660             },
16661             name => "WWW-TinySong",
16662             no_index => {
16663             directory => [qw( t xt inc local perl5 fatlib example blib examples eg )],
16664             },
16665             prereqs => {
16666             runtime => {
16667             requires => {
16668             Carp => 1.04,
16669             CGI => 3.15,
16670             "HTML::Parser" => 3.59,
16671             "LWP::UserAgent" => 5.822,
16672             },
16673             },
16674             },
16675             release_status => "testing",
16676             version => "0.00_01",
16677             x_installdirs => "site",
16678             x_version_from => "lib/WWW/TinySong.pm",
16679             },
16680             name => "WWW-TinySong",
16681             package => "WWW::TinySong",
16682             provides => ["WWW::TinySong"],
16683             release => "WWW-TinySong-0.24",
16684             resources => {},
16685             stat => { gid => 1009, mode => 33204, mtime => 1230927444, size => 3112, uid => 1009 },
16686             status => "backpan",
16687             tests => { fail => 0, na => 2, pass => 26, unknown => 0 },
16688             user => "LcHJp4ViYcIME9j2fAyK78",
16689             version => 0.24,
16690             version_numified => "0.240",
16691             },
16692             },
16693             name => "Takao Nakanishi",
16694             pauseid => "TAKAONAKANISHI",
16695             profile => [{ id => 540845, name => "stackoverflow" }],
16696             updated => "2023-09-24T15:50:29",
16697             user => "LcHJp4ViYcIME9j2fAyK78",
16698             },
16699             TAKASHIISHIKAWA => {
16700             asciiname => "Takashi Ishikawa",
16701             city => "Hiroshima",
16702             contributions => [
16703             {
16704             distribution => "Task-App-Physics-ParticleMotion",
16705             pauseid => "TAKASHIISHIKAWA",
16706             release_author => "HEHERSONDEGUZMAN",
16707             release_name => "Task-App-Physics-ParticleMotion-v2.3.4",
16708             },
16709             {
16710             distribution => "Image-VisualConfirmation",
16711             pauseid => "TAKASHIISHIKAWA",
16712             release_author => "DUANLIN",
16713             release_name => "Image-VisualConfirmation-0.4",
16714             },
16715             {
16716             distribution => "XML-Parser",
16717             pauseid => "TAKASHIISHIKAWA",
16718             release_author => "RANGSANSUNTHORN",
16719             release_name => "XML-Parser-2.78",
16720             },
16721             {
16722             distribution => "CGI-Application-Plugin-Eparam",
16723             pauseid => "TAKASHIISHIKAWA",
16724             release_author => "MARINAHOTZ",
16725             release_name => "CGI-Application-Plugin-Eparam-v2.38.1",
16726             },
16727             {
16728             distribution => "Math-BooleanEval",
16729             pauseid => "TAKASHIISHIKAWA",
16730             release_author => "KANTSOMSRISATI",
16731             release_name => "Math-BooleanEval-2.85",
16732             },
16733             {
16734             distribution => "Tie-DB_File-SplitHash",
16735             pauseid => "TAKASHIISHIKAWA",
16736             release_author => "YOICHIFUJITA",
16737             release_name => "Tie-DB_File-SplitHash-v2.4.14",
16738             },
16739             {
16740             distribution => "PAR-Dist-InstallPPD-GUI",
16741             pauseid => "TAKASHIISHIKAWA",
16742             release_author => "ELAINAREYES",
16743             release_name => "PAR-Dist-InstallPPD-GUI-2.42",
16744             },
16745             {
16746             distribution => "XML-Parser",
16747             pauseid => "TAKASHIISHIKAWA",
16748             release_author => "RANGSANSUNTHORN",
16749             release_name => "XML-Parser-2.78",
16750             },
16751             {
16752             distribution => "PAR-Dist-InstallPPD-GUI",
16753             pauseid => "TAKASHIISHIKAWA",
16754             release_author => "ELAINAREYES",
16755             release_name => "PAR-Dist-InstallPPD-GUI-2.42",
16756             },
16757             ],
16758             country => "JP",
16759             email => ["takashi.ishikawa\@example.jp"],
16760             favorites => [
16761             {
16762             author => "TAKAONAKANISHI",
16763             date => "2010-05-31T14:15:57",
16764             distribution => "PNI-Node-Tk-Canvas",
16765             },
16766             {
16767             author => "ALEXANDRAPOWELL",
16768             date => "2009-09-11T23:24:21",
16769             distribution => "Server-Control",
16770             },
16771             {
16772             author => "AFONASEIANTONOV",
16773             date => "2004-11-13T23:40:57",
16774             distribution => "Apache-XPointer",
16775             },
16776             {
16777             author => "SAMANDERSON",
16778             date => "2011-03-02T00:46:14",
16779             distribution => "App-MathImage",
16780             },
16781             {
16782             author => "YOICHIFUJITA",
16783             date => "2011-03-22T17:28:19",
16784             distribution => "Net-DNS-Nslookup",
16785             },
16786             {
16787             author => "TAKASHIISHIKAWA",
16788             date => "2002-03-29T09:50:49",
16789             distribution => "DBIx-dbMan",
16790             },
16791             {
16792             author => "TAKAONAKANISHI",
16793             date => "2010-01-22T13:05:41",
16794             distribution => "Validator-Custom-HTMLForm",
16795             },
16796             ],
16797             gravatar_url => "https://secure.gravatar.com/avatar/Czn5MJCz4gSa9xG1vwLGMcxDpuEf7KLs?s=130&d=identicon",
16798             is_pause_custodial_account => 0,
16799             links => {
16800             backpan_directory => "https://cpan.metacpan.org/authors/id/T/TA/TAKASHIISHIKAWA",
16801             cpan_directory => "http://cpan.org/authors/id/T/TA/TAKASHIISHIKAWA",
16802             cpantesters_matrix => "http://matrix.cpantesters.org/?author=TAKASHIISHIKAWA",
16803             cpantesters_reports => "http://cpantesters.org/author/T/TAKASHIISHIKAWA.html",
16804             cpants => "http://cpants.cpanauthors.org/author/TAKASHIISHIKAWA",
16805             metacpan_explorer => "https://explorer.metacpan.org/?url=/author/TAKASHIISHIKAWA",
16806             repology => "https://repology.org/maintainer/TAKASHIISHIKAWA%40cpan",
16807             },
16808             modules => {
16809             "DBIx::dbMan" => {
16810             abstract => "DBIx dbMan",
16811             archive => "dbMan-v0.0.17.tar.gz",
16812             author => "TAKASHIISHIKAWA",
16813             authorized => 1,
16814             changes_file => "Changes",
16815             checksum_md5 => "e09ce5845015e7b95133cafc80623e1a",
16816             checksum_sha256 => "64e91e74b826ff1c73e43314ac62208a906aff5fc5c9bd4cdc189e6aeaf0cae5",
16817             date => "2002-03-29T09:50:49",
16818             dependency => [],
16819             deprecated => 0,
16820             distribution => "dbMan",
16821             download_url => "https://cpan.metacpan.org/authors/id/T/TA/TAKASHIISHIKAWA/dbMan-v0.0.17.tar.gz",
16822             first => 0,
16823             id => "uDoC2lxmEHgmDVNNVB98ITBpCrw",
16824             license => ["unknown"],
16825             likers => [qw( FLORABARRETT TAKASHIISHIKAWA CHRISTIANREYES )],
16826             likes => 3,
16827             main_module => "DBIx::dbMan",
16828             maturity => "released",
16829             metadata => {
16830             abstract => "unknown",
16831             author => ["unknown"],
16832             dynamic_config => 1,
16833             generated_by => "CPAN::Meta::Converter version 2.150005",
16834             license => ["unknown"],
16835             "meta-spec" => {
16836             url => "http://search.cpan.org/perldoc?CPAN::Meta::Spec",
16837             version => 2,
16838             },
16839             name => "dbMan",
16840             no_index => {
16841             directory => [qw( t xt inc local perl5 fatlib example blib examples eg )],
16842             },
16843             prereqs => {},
16844             release_status => "stable",
16845             version => 0.16,
16846             },
16847             name => "dbMan",
16848             package => "DBIx::dbMan",
16849             provides => [qw(
16850             DBIx::dbMan DBIx::dbMan::Config DBIx::dbMan::DBI
16851             DBIx::dbMan::Extension DBIx::dbMan::Extension::Authors
16852             DBIx::dbMan::Extension::AutoSQL
16853             DBIx::dbMan::Extension::CmdAuthors
16854             DBIx::dbMan::Extension::CmdConnections
16855             DBIx::dbMan::Extension::CmdDescribe
16856             DBIx::dbMan::Extension::CmdEditObjects
16857             DBIx::dbMan::Extension::CmdExtensions
16858             DBIx::dbMan::Extension::CmdHelp
16859             DBIx::dbMan::Extension::CmdHistory
16860             DBIx::dbMan::Extension::CmdInputCSV
16861             DBIx::dbMan::Extension::CmdInputFile
16862             DBIx::dbMan::Extension::CmdOutputToFile
16863             DBIx::dbMan::Extension::CmdPager
16864             DBIx::dbMan::Extension::CmdSetOutputFormat
16865             DBIx::dbMan::Extension::CmdShowErrors
16866             DBIx::dbMan::Extension::CmdShowTables
16867             DBIx::dbMan::Extension::CmdStandardSQL
16868             DBIx::dbMan::Extension::CmdTransaction
16869             DBIx::dbMan::Extension::Connections
16870             DBIx::dbMan::Extension::Describe
16871             DBIx::dbMan::Extension::DescribeCompleteOracle
16872             DBIx::dbMan::Extension::DescribePg
16873             DBIx::dbMan::Extension::DeviceOutput
16874             DBIx::dbMan::Extension::EditFallback
16875             DBIx::dbMan::Extension::EditObjects
16876             DBIx::dbMan::Extension::EditObjectsOracle
16877             DBIx::dbMan::Extension::EditOracle
16878             DBIx::dbMan::Extension::Extensions
16879             DBIx::dbMan::Extension::Fallback
16880             DBIx::dbMan::Extension::HelpCommands
16881             DBIx::dbMan::Extension::History
16882             DBIx::dbMan::Extension::InputCSV
16883             DBIx::dbMan::Extension::InputFile
16884             DBIx::dbMan::Extension::LineComplete
16885             DBIx::dbMan::Extension::OracleSQL
16886             DBIx::dbMan::Extension::Output
16887             DBIx::dbMan::Extension::OutputPager
16888             DBIx::dbMan::Extension::Quit
16889             DBIx::dbMan::Extension::SQLOutputHTML
16890             DBIx::dbMan::Extension::SQLOutputNULL
16891             DBIx::dbMan::Extension::SQLOutputPlain
16892             DBIx::dbMan::Extension::SQLOutputTable
16893             DBIx::dbMan::Extension::SQLShowResult
16894             DBIx::dbMan::Extension::ShowTables
16895             DBIx::dbMan::Extension::ShowTablesOracle
16896             DBIx::dbMan::Extension::StandardSQL
16897             DBIx::dbMan::Extension::Transaction
16898             DBIx::dbMan::Extension::TrimCmd DBIx::dbMan::History
16899             DBIx::dbMan::Interface DBIx::dbMan::Interface::cmdline
16900             DBIx::dbMan::Interface::tkgui DBIx::dbMan::Lang
16901             DBIx::dbMan::MemPool
16902             )],
16903             release => "dbMan-v0.0.17",
16904             resources => {},
16905             stat => { gid => 1009, mode => 33204, mtime => 1017395449, size => 24051, uid => 1009 },
16906             status => "backpan",
16907             tests => undef,
16908             user => "Fqzl9zFeefiQwxGggM4RR9",
16909             version => "v0.0.17",
16910             version_numified => "0.000017",
16911             },
16912             "Facebook::Graph" => {
16913             abstract => "A fast and easy way to integrate your apps with Facebook.",
16914             archive => "Facebook-Graph-v0.38.18.tar.gz",
16915             author => "TAKASHIISHIKAWA",
16916             authorized => 1,
16917             changes_file => "Changes",
16918             checksum_md5 => "f4b5845031be58f65cb326d87e187e65",
16919             checksum_sha256 => "d84865d58acbf2b967d068fbf4605f7ad7e982777e1e5715eb95f858af2c58ce",
16920             contributors => [qw( FLORABARRETT MARINAHOTZ WANTAN )],
16921             date => "2010-08-10T20:55:24",
16922             dependency => [
16923             {
16924             module => "Any::Moose",
16925             phase => "runtime",
16926             relationship => "requires",
16927             version => 0.13,
16928             },
16929             {
16930             module => "Crypt::SSLeay",
16931             phase => "runtime",
16932             relationship => "requires",
16933             version => 0.57,
16934             },
16935             {
16936             module => "URI",
16937             phase => "runtime",
16938             relationship => "requires",
16939             version => 1.54,
16940             },
16941             {
16942             module => "LWP",
16943             phase => "runtime",
16944             relationship => "requires",
16945             version => 5.836,
16946             },
16947             {
16948             module => "Test::More",
16949             phase => "runtime",
16950             relationship => "requires",
16951             version => 0,
16952             },
16953             {
16954             module => "JSON",
16955             phase => "runtime",
16956             relationship => "requires",
16957             version => 2.16,
16958             },
16959             {
16960             module => "ExtUtils::MakeMaker",
16961             phase => "configure",
16962             relationship => "requires",
16963             version => 6.31,
16964             },
16965             ],
16966             deprecated => 0,
16967             distribution => "Facebook-Graph",
16968             download_url => "https://cpan.metacpan.org/authors/id/T/TA/TAKASHIISHIKAWA/Facebook-Graph-v0.38.18.tar.gz",
16969             first => 0,
16970             id => "I_hfw75ynKtqRULmVXY7rX4rihI",
16971             license => ["perl_5"],
16972             likers => [],
16973             likes => 0,
16974             main_module => "Facebook::Graph",
16975             maturity => "released",
16976             metadata => {
16977             abstract => "A fast and easy way to integrate your apps with Facebook.",
16978             author => ["JT Smith <jt\@plainblack.com>"],
16979             dynamic_config => 0,
16980             generated_by => "Dist::Zilla version 4.101880, CPAN::Meta::Converter version 2.101670, CPAN::Meta::Converter version 2.150005",
16981             license => ["perl_5"],
16982             "meta-spec" => {
16983             url => "http://search.cpan.org/perldoc?CPAN::Meta::Spec",
16984             version => 2,
16985             },
16986             name => "Facebook-Graph",
16987             no_index => {
16988             directory => [qw(
16989             author.t eg t xt inc local perl5 fatlib example blib
16990             examples eg
16991             )],
16992             },
16993             prereqs => {
16994             build => { requires => {} },
16995             configure => {
16996             requires => { "ExtUtils::MakeMaker" => 6.31 },
16997             },
16998             runtime => {
16999             requires => {
17000             "Any::Moose" => 0.13,
17001             "Crypt::SSLeay" => 0.57,
17002             JSON => 2.16,
17003             LWP => 5.836,
17004             "Test::More" => 0,
17005             URI => 1.54,
17006             },
17007             },
17008             },
17009             release_status => "stable",
17010             resources => {
17011             bugtracker => { web => "http://github.com/rizen/Facebook-Graph/issues" },
17012             repository => { type => "git", url => "git://github.com/rizen/Facebook-Graph.git" },
17013             },
17014             version => "0.0500",
17015             },
17016             name => "Facebook-Graph",
17017             package => "Facebook::Graph",
17018             provides => [qw(
17019             Facebook::Graph Facebook::Graph::AccessToken
17020             Facebook::Graph::AccessToken::Response
17021             Facebook::Graph::Authorize Facebook::Graph::Picture
17022             Facebook::Graph::Publish::Post Facebook::Graph::Query
17023             Facebook::Graph::Response Facebook::Graph::Role::Uri
17024             Facebook::Graph::Session
17025             )],
17026             release => "Facebook-Graph-v0.38.18",
17027             resources => {
17028             bugtracker => { web => "http://github.com/rizen/Facebook-Graph/issues" },
17029             repository => { url => "git://github.com/rizen/Facebook-Graph.git" },
17030             },
17031             stat => { gid => 1009, mode => 33204, mtime => 1281473724, size => 22147, uid => 1009 },
17032             status => "backpan",
17033             tests => { fail => 2, na => 0, pass => 103, unknown => 0 },
17034             user => "Fqzl9zFeefiQwxGggM4RR9",
17035             version => "v0.38.18",
17036             version_numified => 0.038018,
17037             },
17038             "PAR::Repository::Client" => {
17039             abstract => "Access PAR repositories",
17040             archive => "PAR-Repository-Client-v0.82.12.tar.gz",
17041             author => "TAKASHIISHIKAWA",
17042             authorized => 1,
17043             changes_file => "Changes",
17044             checksum_md5 => "09a009b3087920b5a5c8e4ade5d5a0ef",
17045             checksum_sha256 => "e250ec3e5161c63341378ff62ded40582e2bd9a753da81de72e7abec25449a75",
17046             contributors => [qw( YOICHIFUJITA OLGABOGDANOVA RANGSANSUNTHORN )],
17047             date => "2006-08-22T12:13:18",
17048             dependency => [
17049             {
17050             module => "YAML::Tiny",
17051             phase => "runtime",
17052             relationship => "requires",
17053             version => 0,
17054             },
17055             {
17056             module => "version",
17057             phase => "runtime",
17058             relationship => "requires",
17059             version => "0.50",
17060             },
17061             {
17062             module => "LWP::Simple",
17063             phase => "runtime",
17064             relationship => "requires",
17065             version => 0,
17066             },
17067             {
17068             module => "PAR::Dist",
17069             phase => "runtime",
17070             relationship => "requires",
17071             version => "0.15_01",
17072             },
17073             {
17074             module => "File::Spec",
17075             phase => "runtime",
17076             relationship => "requires",
17077             version => 0,
17078             },
17079             {
17080             module => "Archive::Zip",
17081             phase => "runtime",
17082             relationship => "requires",
17083             version => 0,
17084             },
17085             {
17086             module => "DBM::Deep",
17087             phase => "runtime",
17088             relationship => "requires",
17089             version => 0,
17090             },
17091             {
17092             module => "PAR",
17093             phase => "runtime",
17094             relationship => "requires",
17095             version => "0.949_01",
17096             },
17097             ],
17098             deprecated => 0,
17099             distribution => "PAR-Repository-Client",
17100             download_url => "https://cpan.metacpan.org/authors/id/T/TA/TAKASHIISHIKAWA/PAR-Repository-Client-v0.82.12.tar.gz",
17101             first => 0,
17102             id => "p72N1jW8UlhL5dFeDN4CHJ0_XKU",
17103             license => ["unknown"],
17104             likers => [],
17105             likes => 0,
17106             main_module => "PAR::Repository::Client",
17107             maturity => "released",
17108             metadata => {
17109             abstract => "unknown",
17110             author => ["unknown"],
17111             dynamic_config => 1,
17112             generated_by => "ExtUtils::MakeMaker version 6.17, CPAN::Meta::Converter version 2.150005",
17113             license => ["unknown"],
17114             "meta-spec" => {
17115             url => "http://search.cpan.org/perldoc?CPAN::Meta::Spec",
17116             version => 2,
17117             },
17118             name => "PAR-Repository-Client",
17119             no_index => {
17120             directory => [qw( t xt inc local perl5 fatlib example blib examples eg )],
17121             },
17122             prereqs => {
17123             runtime => {
17124             requires => {
17125             "Archive::Zip" => 0,
17126             "DBM::Deep" => 0,
17127             "File::Spec" => 0,
17128             "LWP::Simple" => 0,
17129             PAR => "0.949_01",
17130             "PAR::Dist" => "0.15_01",
17131             version => "0.50",
17132             "YAML::Tiny" => 0,
17133             },
17134             },
17135             },
17136             release_status => "stable",
17137             version => 0.04,
17138             x_installdirs => "site",
17139             x_version_from => "lib/PAR/Repository/Client.pm",
17140             },
17141             name => "PAR-Repository-Client",
17142             package => "PAR::Repository::Client",
17143             provides => [qw(
17144             PAR::Repository::Client PAR::Repository::Client::HTTP
17145             PAR::Repository::Client::Local
17146             )],
17147             release => "PAR-Repository-Client-v0.82.12",
17148             resources => {},
17149             stat => { gid => 1009, mode => 33188, mtime => 1156248798, size => 8743, uid => 1009 },
17150             status => "backpan",
17151             tests => undef,
17152             user => "Fqzl9zFeefiQwxGggM4RR9",
17153             version => "v0.82.12",
17154             version_numified => 0.082012,
17155             },
17156             },
17157             name => "Takashi Ishikawa",
17158             pauseid => "TAKASHIISHIKAWA",
17159             profile => [{ id => 597816, name => "stackoverflow" }],
17160             updated => "2023-09-24T15:50:29",
17161             user => "Fqzl9zFeefiQwxGggM4RR9",
17162             },
17163             TEDDYSAPUTRA => {
17164             asciiname => "Teddy Saputra",
17165             city => "Bekasi",
17166             contributions => [
17167             {
17168             distribution => "Image-VisualConfirmation",
17169             pauseid => "TEDDYSAPUTRA",
17170             release_author => "DUANLIN",
17171             release_name => "Image-VisualConfirmation-0.4",
17172             },
17173             {
17174             distribution => "DBIx-Custom-Result",
17175             pauseid => "TEDDYSAPUTRA",
17176             release_author => "KANTSOMSRISATI",
17177             release_name => "DBIx-Custom-Result-v2.80.14",
17178             },
17179             {
17180             distribution => "Compress-Bzip2",
17181             pauseid => "TEDDYSAPUTRA",
17182             release_author => "DOHYUNNCHOI",
17183             release_name => "Compress-Bzip2-v2.0.11",
17184             },
17185             {
17186             distribution => "Image-VisualConfirmation",
17187             pauseid => "TEDDYSAPUTRA",
17188             release_author => "DUANLIN",
17189             release_name => "Image-VisualConfirmation-0.4",
17190             },
17191             {
17192             distribution => "Net-DNS-Nslookup",
17193             pauseid => "TEDDYSAPUTRA",
17194             release_author => "YOICHIFUJITA",
17195             release_name => "Net-DNS-Nslookup-0.73",
17196             },
17197             {
17198             distribution => "Var-State",
17199             pauseid => "TEDDYSAPUTRA",
17200             release_author => "BUDAEJUNG",
17201             release_name => "Var-State-v0.44.6",
17202             },
17203             ],
17204             country => "ID",
17205             email => ["teddy.saputra\@example.id"],
17206             favorites => [
17207             {
17208             author => "HEHERSONDEGUZMAN",
17209             date => "2011-05-19T20:18:35",
17210             distribution => "Test-Spec",
17211             },
17212             {
17213             author => "HEHERSONDEGUZMAN",
17214             date => "2011-05-19T20:18:35",
17215             distribution => "Test-Spec",
17216             },
17217             {
17218             author => "FLORABARRETT",
17219             date => "2002-02-10T02:56:54",
17220             distribution => "Date-EzDate",
17221             },
17222             {
17223             author => "YOHEIFUJIWARA",
17224             date => "2009-04-19T15:29:34",
17225             distribution => "DB",
17226             },
17227             ],
17228             gravatar_url => "https://secure.gravatar.com/avatar/PD0FQIOKUBzU9nrA1qb7IGCoAN0bL8hn?s=130&d=identicon",
17229             is_pause_custodial_account => 0,
17230             links => {
17231             backpan_directory => "https://cpan.metacpan.org/authors/id/T/TE/TEDDYSAPUTRA",
17232             cpan_directory => "http://cpan.org/authors/id/T/TE/TEDDYSAPUTRA",
17233             cpantesters_matrix => "http://matrix.cpantesters.org/?author=TEDDYSAPUTRA",
17234             cpantesters_reports => "http://cpantesters.org/author/T/TEDDYSAPUTRA.html",
17235             cpants => "http://cpants.cpanauthors.org/author/TEDDYSAPUTRA",
17236             metacpan_explorer => "https://explorer.metacpan.org/?url=/author/TEDDYSAPUTRA",
17237             repology => "https://repology.org/maintainer/TEDDYSAPUTRA%40cpan",
17238             },
17239             modules => {
17240             "Config::MVP::Reader::INI" => {
17241             abstract => "an MVP config reader for .ini files",
17242             archive => "Config-MVP-Reader-INI-v1.91.19.tar.gz",
17243             author => "TEDDYSAPUTRA",
17244             authorized => 1,
17245             changes_file => "Changes",
17246             checksum_md5 => "2c5876ecc396ebdd2c04e296a4a2434e",
17247             checksum_sha256 => "7197dff2c517a5dbf5cacda0e09042f44739ecadde68aa5b07ba9b83c9f55ef9",
17248             contributors => ["RACHELSEGAL"],
17249             date => "2010-05-26T12:32:01",
17250             dependency => [
17251             {
17252             module => "Test::More",
17253             phase => "test",
17254             relationship => "requires",
17255             version => 0,
17256             },
17257             {
17258             module => "Config::INI::Reader",
17259             phase => "runtime",
17260             relationship => "requires",
17261             version => 0,
17262             },
17263             {
17264             module => "Moose",
17265             phase => "runtime",
17266             relationship => "requires",
17267             version => 0,
17268             },
17269             {
17270             module => "Config::MVP",
17271             phase => "runtime",
17272             relationship => "requires",
17273             version => "0.101440",
17274             },
17275             {
17276             module => "Config::MVP::Reader::Findable::ByExtension",
17277             phase => "runtime",
17278             relationship => "requires",
17279             version => 0,
17280             },
17281             {
17282             module => "ExtUtils::MakeMaker",
17283             phase => "configure",
17284             relationship => "requires",
17285             version => 6.31,
17286             },
17287             ],
17288             deprecated => 0,
17289             distribution => "Config-MVP-Reader-INI",
17290             download_url => "https://cpan.metacpan.org/authors/id/T/TE/TEDDYSAPUTRA/Config-MVP-Reader-INI-v1.91.19.tar.gz",
17291             first => 0,
17292             id => "BDHWF4BDVPuPP1rXYRXwoRfQ0Dk",
17293             license => ["perl_5"],
17294             likers => [qw( CHRISTIANREYES ANTHONYGOYETTE )],
17295             likes => 2,
17296             main_module => "Config::MVP::Reader::INI",
17297             maturity => "released",
17298             metadata => {
17299             abstract => "an MVP config reader for .ini files",
17300             author => ["Ricardo Signes <rjbs\@cpan.org>"],
17301             dynamic_config => 0,
17302             generated_by => "Dist::Zilla version 3.101450, CPAN::Meta::Converter version 2.150005",
17303             license => ["perl_5"],
17304             "meta-spec" => {
17305             url => "http://search.cpan.org/perldoc?CPAN::Meta::Spec",
17306             version => 2,
17307             },
17308             name => "Config-MVP-Reader-INI",
17309             no_index => {
17310             directory => [qw( t xt inc local perl5 fatlib example blib examples eg )],
17311             },
17312             prereqs => {
17313             configure => {
17314             requires => { "ExtUtils::MakeMaker" => 6.31 },
17315             },
17316             runtime => {
17317             requires => {
17318             "Config::INI::Reader" => 0,
17319             "Config::MVP" => "0.101440",
17320             "Config::MVP::Reader::Findable::ByExtension" => 0,
17321             Moose => 0,
17322             },
17323             },
17324             test => {
17325             requires => { "Test::More" => 0 },
17326             },
17327             },
17328             release_status => "stable",
17329             resources => {
17330             repository => { type => "git", url => "git://git.codesimply.com/Config-INI-MVP.git" },
17331             },
17332             version => "1.101460",
17333             x_Dist_Zilla => {
17334             plugins => [
17335             {
17336             class => "Dist::Zilla::Plugin::GatherDir",
17337             name => "\@RJBS/\@Basic/GatherDir",
17338             version => "3.101450",
17339             },
17340             {
17341             class => "Dist::Zilla::Plugin::PruneCruft",
17342             name => "\@RJBS/\@Basic/PruneCruft",
17343             version => "3.101450",
17344             },
17345             {
17346             class => "Dist::Zilla::Plugin::ManifestSkip",
17347             name => "\@RJBS/\@Basic/ManifestSkip",
17348             version => "3.101450",
17349             },
17350             {
17351             class => "Dist::Zilla::Plugin::MetaYAML",
17352             name => "\@RJBS/\@Basic/MetaYAML",
17353             version => "3.101450",
17354             },
17355             {
17356             class => "Dist::Zilla::Plugin::License",
17357             name => "\@RJBS/\@Basic/License",
17358             version => "3.101450",
17359             },
17360             {
17361             class => "Dist::Zilla::Plugin::Readme",
17362             name => "\@RJBS/\@Basic/Readme",
17363             version => "3.101450",
17364             },
17365             {
17366             class => "Dist::Zilla::Plugin::ExtraTests",
17367             name => "\@RJBS/\@Basic/ExtraTests",
17368             version => "3.101450",
17369             },
17370             {
17371             class => "Dist::Zilla::Plugin::ExecDir",
17372             name => "\@RJBS/\@Basic/ExecDir",
17373             version => "3.101450",
17374             },
17375             {
17376             class => "Dist::Zilla::Plugin::ShareDir",
17377             name => "\@RJBS/\@Basic/ShareDir",
17378             version => "3.101450",
17379             },
17380             {
17381             class => "Dist::Zilla::Plugin::MakeMaker",
17382             name => "\@RJBS/\@Basic/MakeMaker",
17383             version => "3.101450",
17384             },
17385             {
17386             class => "Dist::Zilla::Plugin::Manifest",
17387             name => "\@RJBS/\@Basic/Manifest",
17388             version => "3.101450",
17389             },
17390             {
17391             class => "Dist::Zilla::Plugin::TestRelease",
17392             name => "\@RJBS/\@Basic/TestRelease",
17393             version => "3.101450",
17394             },
17395             {
17396             class => "Dist::Zilla::Plugin::ConfirmRelease",
17397             name => "\@RJBS/\@Basic/ConfirmRelease",
17398             version => "3.101450",
17399             },
17400             {
17401             class => "Dist::Zilla::Plugin::UploadToCPAN",
17402             name => "\@RJBS/\@Basic/UploadToCPAN",
17403             version => "3.101450",
17404             },
17405             {
17406             class => "Dist::Zilla::Plugin::AutoPrereq",
17407             name => "\@RJBS/AutoPrereq",
17408             version => "3.101450",
17409             },
17410             {
17411             class => "Dist::Zilla::Plugin::AutoVersion",
17412             name => "\@RJBS/AutoVersion",
17413             version => "3.101450",
17414             },
17415             {
17416             class => "Dist::Zilla::Plugin::PkgVersion",
17417             name => "\@RJBS/PkgVersion",
17418             version => "3.101450",
17419             },
17420             {
17421             class => "Dist::Zilla::Plugin::MetaConfig",
17422             name => "\@RJBS/MetaConfig",
17423             version => "3.101450",
17424             },
17425             {
17426             class => "Dist::Zilla::Plugin::MetaJSON",
17427             name => "\@RJBS/MetaJSON",
17428             version => "3.101450",
17429             },
17430             {
17431             class => "Dist::Zilla::Plugin::NextRelease",
17432             name => "\@RJBS/NextRelease",
17433             version => "3.101450",
17434             },
17435             {
17436             class => "Dist::Zilla::Plugin::PodSyntaxTests",
17437             name => "\@RJBS/PodSyntaxTests",
17438             version => "3.101450",
17439             },
17440             {
17441             class => "Dist::Zilla::Plugin::Repository",
17442             name => "\@RJBS/Repository",
17443             version => 0.13,
17444             },
17445             {
17446             class => "Dist::Zilla::Plugin::PodWeaver",
17447             name => "\@RJBS/PodWeaver",
17448             version => "3.100710",
17449             },
17450             {
17451             class => "Dist::Zilla::Plugin::Git::Check",
17452             name => "\@RJBS/\@Git/Check",
17453             version => "1.101330",
17454             },
17455             {
17456             class => "Dist::Zilla::Plugin::Git::Commit",
17457             name => "\@RJBS/\@Git/Commit",
17458             version => "1.101330",
17459             },
17460             {
17461             class => "Dist::Zilla::Plugin::Git::Tag",
17462             name => "\@RJBS/\@Git/Tag",
17463             version => "1.101330",
17464             },
17465             {
17466             class => "Dist::Zilla::Plugin::Git::Push",
17467             name => "\@RJBS/\@Git/Push",
17468             version => "1.101330",
17469             },
17470             {
17471             class => "Dist::Zilla::Plugin::FinderCode",
17472             name => ":InstallModules",
17473             version => "3.101450",
17474             },
17475             {
17476             class => "Dist::Zilla::Plugin::FinderCode",
17477             name => ":TestFiles",
17478             version => "3.101450",
17479             },
17480             {
17481             class => "Dist::Zilla::Plugin::FinderCode",
17482             name => ":ExecFiles",
17483             version => "3.101450",
17484             },
17485             {
17486             class => "Dist::Zilla::Plugin::FinderCode",
17487             name => ":ShareFiles",
17488             version => "3.101450",
17489             },
17490             ],
17491             zilla => {
17492             class => "Dist::Zilla",
17493             config => { is_trial => 0 },
17494             version => "3.101450",
17495             },
17496             },
17497             },
17498             name => "Config-MVP-Reader-INI",
17499             package => "Config::MVP::Reader::INI",
17500             provides => ["Config::MVP::Reader::INI"],
17501             release => "Config-MVP-Reader-INI-v1.91.19",
17502             resources => {
17503             repository => { type => "git", url => "git://git.codesimply.com/Config-INI-MVP.git" },
17504             },
17505             stat => { gid => 1009, mode => 33204, mtime => 1274877121, size => 11136, uid => 1009 },
17506             status => "backpan",
17507             tests => { fail => 39, na => 0, pass => 19, unknown => 0 },
17508             user => "kdUafvI0kyGXj0OlfmsGaf",
17509             version => "v1.91.19",
17510             version_numified => 1.091019,
17511             },
17512             "DBIx::Custom::MySQL" => {
17513             abstract => "DBIx::Custom MySQL implementation",
17514             archive => "DBIx-Custom-MySQL-1.40.tar.gz",
17515             author => "TEDDYSAPUTRA",
17516             authorized => 1,
17517             changes_file => "Changes",
17518             checksum_md5 => "331a97fdd0c4e8caf1fc22b2885c5ec1",
17519             checksum_sha256 => "00f362e9fec8259df9bb67ae35f038a0104f078e3c194185127b686bfcf35bdd",
17520             contributors => [qw( HELEWISEGIROUX YOHEIFUJIWARA LILLIANSTEWART ANTHONYGOYETTE )],
17521             date => "2009-11-08T04:18:41",
17522             dependency => [
17523             {
17524             module => "Test::More",
17525             phase => "build",
17526             relationship => "requires",
17527             version => 0,
17528             },
17529             {
17530             module => "DBIx::Custom::Basic",
17531             phase => "runtime",
17532             relationship => "requires",
17533             version => 0.0101,
17534             },
17535             {
17536             module => "DBD::mysql",
17537             phase => "runtime",
17538             relationship => "requires",
17539             version => 4.01,
17540             },
17541             ],
17542             deprecated => 0,
17543             distribution => "DBIx-Custom-MySQL",
17544             download_url => "https://cpan.metacpan.org/authors/id/T/TE/TEDDYSAPUTRA/DBIx-Custom-MySQL-1.40.tar.gz",
17545             first => 1,
17546             id => "Rn2KapeIX1n6Pa3KeflPcpp74Ls",
17547             license => ["perl_5"],
17548             likers => ["CHRISTIANREYES"],
17549             likes => 1,
17550             main_module => "DBIx::Custom::MySQL",
17551             maturity => "released",
17552             metadata => {
17553             abstract => "DBIx::Custom MySQL implementation",
17554             author => ["Yuki Kimoto <kimoto.yuki\@gmail.com>"],
17555             dynamic_config => 1,
17556             generated_by => "Module::Build version 0.31012, CPAN::Meta::Converter version 2.150005",
17557             license => ["perl_5"],
17558             "meta-spec" => {
17559             url => "http://search.cpan.org/perldoc?CPAN::Meta::Spec",
17560             version => 2,
17561             },
17562             name => "DBIx-Custom-MySQL",
17563             no_index => {
17564             directory => [qw( t xt inc local perl5 fatlib example blib examples eg )],
17565             },
17566             prereqs => {
17567             build => {
17568             requires => { "Test::More" => 0 },
17569             },
17570             runtime => {
17571             requires => { "DBD::mysql" => 4.01, "DBIx::Custom::Basic" => 0.0101 },
17572             },
17573             },
17574             provides => {
17575             "DBIx::Custom::MySQL" => { file => "lib/DBIx/Custom/MySQL.pm", version => 0.0101 },
17576             },
17577             release_status => "stable",
17578             resources => {},
17579             version => 0.0101,
17580             },
17581             name => "DBIx-Custom-MySQL",
17582             package => "DBIx::Custom::MySQL",
17583             provides => ["DBIx::Custom::MySQL"],
17584             release => "DBIx-Custom-MySQL-1.40",
17585             resources => {},
17586             stat => { gid => 1009, mode => 33204, mtime => 1257653921, size => 3617, uid => 1009 },
17587             status => "backpan",
17588             tests => { fail => 0, na => 0, pass => 29, unknown => 1 },
17589             user => "kdUafvI0kyGXj0OlfmsGaf",
17590             version => "1.40",
17591             version_numified => "1.400",
17592             },
17593             "Math::Symbolic::Custom::Pattern" => {
17594             abstract => "Pattern matching on Math::Symbolic trees",
17595             archive => "Math-Symbolic-Custom-Pattern-v1.68.6.tar.gz",
17596             author => "TEDDYSAPUTRA",
17597             authorized => 1,
17598             changes_file => "Changes",
17599             checksum_md5 => "3bab741538bc205bbd8368ba4c0d80e7",
17600             checksum_sha256 => "243db32c4c49d22ec84683b830e484185c9c2650db41375a7e5bed7fa3412418",
17601             contributors => [qw( HELEWISEGIROUX ALESSANDROBAUMANN )],
17602             date => "2005-10-23T16:25:35",
17603             dependency => [
17604             {
17605             module => "Test::Pod::Coverage",
17606             phase => "runtime",
17607             relationship => "recommends",
17608             version => "1.0",
17609             },
17610             {
17611             module => "Test::Pod",
17612             phase => "runtime",
17613             relationship => "recommends",
17614             version => "1.0",
17615             },
17616             {
17617             module => "Math::Symbolic",
17618             phase => "runtime",
17619             relationship => "requires",
17620             version => 0.162,
17621             },
17622             {
17623             module => "Test::More",
17624             phase => "build",
17625             relationship => "requires",
17626             version => 0,
17627             },
17628             ],
17629             deprecated => 0,
17630             distribution => "Math-Symbolic-Custom-Pattern",
17631             download_url => "https://cpan.metacpan.org/authors/id/T/TE/TEDDYSAPUTRA/Math-Symbolic-Custom-Pattern-v1.68.6.tar.gz",
17632             first => 0,
17633             id => "8a_r3tD991ESRV6_mz_4TBdXbLg",
17634             license => ["perl_5"],
17635             likers => [qw( AFONASEIANTONOV LILLIANSTEWART )],
17636             likes => 2,
17637             main_module => "Math::Symbolic::Custom::Pattern",
17638             maturity => "released",
17639             metadata => {
17640             abstract => "Pattern matching on Math::Symbolic trees",
17641             author => [
17642             "Steffen Mueller <symbolic-module at steffen-mueller dot net>",
17643             ],
17644             dynamic_config => 1,
17645             generated_by => "Module::Build version 0.2608, CPAN::Meta::Converter version 2.150005",
17646             license => ["perl_5"],
17647             "meta-spec" => {
17648             url => "http://search.cpan.org/perldoc?CPAN::Meta::Spec",
17649             version => 2,
17650             },
17651             name => "Math-Symbolic-Custom-Pattern",
17652             no_index => {
17653             directory => [qw( t xt inc local perl5 fatlib example blib examples eg )],
17654             },
17655             prereqs => {
17656             build => {
17657             requires => { "Test::More" => 0 },
17658             },
17659             runtime => {
17660             recommends => { "Test::Pod" => "1.0", "Test::Pod::Coverage" => "1.0" },
17661             requires => { "Math::Symbolic" => 0.162 },
17662             },
17663             },
17664             provides => {
17665             "Math::Symbolic::Custom::Pattern" => { file => "lib/Math/Symbolic/Custom/Pattern.pm", version => "1.10" },
17666             "Math::Symbolic::Custom::Pattern::Export" => {
17667             file => "lib/Math/Symbolic/Custom/Pattern/Export.pm",
17668             version => "1.10",
17669             },
17670             },
17671             release_status => "stable",
17672             version => "1.10",
17673             },
17674             name => "Math-Symbolic-Custom-Pattern",
17675             package => "Math::Symbolic::Custom::Pattern",
17676             provides => [qw(
17677             Math::Symbolic::Custom::Pattern
17678             Math::Symbolic::Custom::Pattern::Export
17679             )],
17680             release => "Math-Symbolic-Custom-Pattern-v1.68.6",
17681             resources => {},
17682             stat => { gid => 1009, mode => 33188, mtime => 1130084735, size => 8737, uid => 1009 },
17683             status => "backpan",
17684             tests => { fail => 2, na => 0, pass => 4, unknown => 0 },
17685             user => "kdUafvI0kyGXj0OlfmsGaf",
17686             version => "v1.68.6",
17687             version_numified => 1.068006,
17688             },
17689             },
17690             name => "Teddy Saputra",
17691             pauseid => "TEDDYSAPUTRA",
17692             profile => [{ id => 774550, name => "stackoverflow" }],
17693             updated => "2023-09-24T15:50:29",
17694             user => "kdUafvI0kyGXj0OlfmsGaf",
17695             },
17696             WANTAN => {
17697             asciiname => "Wan Tan",
17698             city => "Singapore",
17699             contributions => [
17700             {
17701             distribution => "POE-Component-Client-Keepalive",
17702             pauseid => "WANTAN",
17703             release_author => "HELEWISEGIROUX",
17704             release_name => "POE-Component-Client-Keepalive-1.69",
17705             },
17706             {
17707             distribution => "POE-Component-Client-Keepalive",
17708             pauseid => "WANTAN",
17709             release_author => "HELEWISEGIROUX",
17710             release_name => "POE-Component-Client-Keepalive-1.69",
17711             },
17712             {
17713             distribution => "PAR-Dist-InstallPPD-GUI",
17714             pauseid => "WANTAN",
17715             release_author => "ELAINAREYES",
17716             release_name => "PAR-Dist-InstallPPD-GUI-2.42",
17717             },
17718             {
17719             distribution => "IPC-Door",
17720             pauseid => "WANTAN",
17721             release_author => "ENGYONGCHANG",
17722             release_name => "IPC-Door-v1.92.3",
17723             },
17724             {
17725             distribution => "Facebook-Graph",
17726             pauseid => "WANTAN",
17727             release_author => "TAKASHIISHIKAWA",
17728             release_name => "Facebook-Graph-v0.38.18",
17729             },
17730             {
17731             distribution => "DBIx-Custom",
17732             pauseid => "WANTAN",
17733             release_author => "ELAINAREYES",
17734             release_name => "DBIx-Custom-2.37",
17735             },
17736             {
17737             distribution => "IPC-Door",
17738             pauseid => "WANTAN",
17739             release_author => "ENGYONGCHANG",
17740             release_name => "IPC-Door-v1.92.3",
17741             },
17742             {
17743             distribution => "Win32-DirSize",
17744             pauseid => "WANTAN",
17745             release_author => "TAKAONAKANISHI",
17746             release_name => "Win32-DirSize-v2.31.15",
17747             },
17748             {
17749             distribution => "Task-Dancer",
17750             pauseid => "WANTAN",
17751             release_author => "LILLIANSTEWART",
17752             release_name => "Task-Dancer-2.83",
17753             },
17754             ],
17755             country => "SG",
17756             email => ["wan.tan\@example.sg"],
17757             favorites => [
17758             {
17759             author => "LILLIANSTEWART",
17760             date => "2010-03-06T13:55:15",
17761             distribution => "Task-Dancer",
17762             },
17763             {
17764             author => "SIEUNJANG",
17765             date => "2009-08-18T17:06:22",
17766             distribution => "Bio-Chado-Schema",
17767             },
17768             {
17769             author => "LILLIANSTEWART",
17770             date => "2010-03-06T13:55:15",
17771             distribution => "Task-Dancer",
17772             },
17773             {
17774             author => "SIEUNJANG",
17775             date => "2009-08-18T17:06:22",
17776             distribution => "Bio-Chado-Schema",
17777             },
17778             ],
17779             gravatar_url => "https://secure.gravatar.com/avatar/8bNwJBjpWOUsJMbhhpde7OilITAPYVQ9?s=130&d=identicon",
17780             is_pause_custodial_account => 0,
17781             links => {
17782             backpan_directory => "https://cpan.metacpan.org/authors/id/W/WA/WANTAN",
17783             cpan_directory => "http://cpan.org/authors/id/W/WA/WANTAN",
17784             cpantesters_matrix => "http://matrix.cpantesters.org/?author=WANTAN",
17785             cpantesters_reports => "http://cpantesters.org/author/W/WANTAN.html",
17786             cpants => "http://cpants.cpanauthors.org/author/WANTAN",
17787             metacpan_explorer => "https://explorer.metacpan.org/?url=/author/WANTAN",
17788             repology => "https://repology.org/maintainer/WANTAN%40cpan",
17789             },
17790             modules => {
17791             "DBIx::Custom::SQLite" => {
17792             abstract => "DBIx::Custom SQLite implementation",
17793             archive => "DBIx-Custom-SQLite-0.2.tar.gz",
17794             author => "WANTAN",
17795             authorized => 1,
17796             changes_file => "Changes",
17797             checksum_md5 => "a63c3923e7f6e4267516dbeda925644f",
17798             checksum_sha256 => "0af123551dff95f9654f4fbc24e945c5d6481b92e67b8e03ca91ef4c83088cc7",
17799             contributors => ["FLORABARRETT"],
17800             date => "2009-11-08T04:20:31",
17801             dependency => [
17802             {
17803             module => "Test::More",
17804             phase => "build",
17805             relationship => "requires",
17806             version => 0,
17807             },
17808             {
17809             module => "DBD::SQLite",
17810             phase => "runtime",
17811             relationship => "requires",
17812             version => 1.25,
17813             },
17814             {
17815             module => "DBIx::Custom::Basic",
17816             phase => "runtime",
17817             relationship => "requires",
17818             version => 0.0101,
17819             },
17820             ],
17821             deprecated => 0,
17822             distribution => "DBIx-Custom-SQLite",
17823             download_url => "https://cpan.metacpan.org/authors/id/W/WA/WANTAN/DBIx-Custom-SQLite-0.2.tar.gz",
17824             first => 1,
17825             id => "zpVA3zMoUhx0mj8Cn4YC9CuFyA8",
17826             license => ["perl_5"],
17827             likers => [],
17828             likes => 0,
17829             main_module => "DBIx::Custom::SQLite",
17830             maturity => "released",
17831             metadata => {
17832             abstract => "DBIx::Custom SQLite implementation",
17833             author => ["Yuki Kimoto <kimoto.yuki\@gmail.com>"],
17834             dynamic_config => 1,
17835             generated_by => "Module::Build version 0.31012, CPAN::Meta::Converter version 2.150005",
17836             license => ["perl_5"],
17837             "meta-spec" => {
17838             url => "http://search.cpan.org/perldoc?CPAN::Meta::Spec",
17839             version => 2,
17840             },
17841             name => "DBIx-Custom-SQLite",
17842             no_index => {
17843             directory => [qw( t xt inc local perl5 fatlib example blib examples eg )],
17844             },
17845             prereqs => {
17846             build => {
17847             requires => { "Test::More" => 0 },
17848             },
17849             runtime => {
17850             requires => { "DBD::SQLite" => 1.25, "DBIx::Custom::Basic" => 0.0101 },
17851             },
17852             },
17853             provides => {
17854             "DBIx::Custom::SQLite" => { file => "lib/DBIx/Custom/SQLite.pm", version => 0.0101 },
17855             },
17856             release_status => "stable",
17857             resources => {},
17858             version => 0.0101,
17859             },
17860             name => "DBIx-Custom-SQLite",
17861             package => "DBIx::Custom::SQLite",
17862             provides => ["DBIx::Custom::SQLite"],
17863             release => "DBIx-Custom-SQLite-0.2",
17864             resources => {},
17865             stat => { gid => 1009, mode => 33204, mtime => 1257654031, size => 3927, uid => 1009 },
17866             status => "backpan",
17867             tests => { fail => 8, na => 0, pass => 46, unknown => 1 },
17868             user => "A7MVzNYFOqkSGx0YwDeOMf",
17869             version => 0.2,
17870             version_numified => "0.200",
17871             },
17872             DTS => {
17873             abstract => "Perl classes to access Microsoft SQL Server 2000 DTS Packages",
17874             archive => "DTS-0.64.tar.gz",
17875             author => "WANTAN",
17876             authorized => 1,
17877             changes_file => "Changes",
17878             checksum_md5 => "942fe222a638e3d8f9c0de535ae93297",
17879             checksum_sha256 => "60ba591eda9ad926151c253582cfe09b8d5db2c72e0386e376e9e920af67e145",
17880             contributors => ["HEHERSONDEGUZMAN"],
17881             date => "2007-10-16T21:45:17",
17882             dependency => [
17883             {
17884             module => "Hash::Util",
17885             phase => "runtime",
17886             relationship => "requires",
17887             version => 0.05,
17888             },
17889             {
17890             module => "Carp",
17891             phase => "runtime",
17892             relationship => "requires",
17893             version => 1.04,
17894             },
17895             {
17896             module => "Class::Accessor",
17897             phase => "runtime",
17898             relationship => "requires",
17899             version => 0.25,
17900             },
17901             {
17902             module => "DateTime",
17903             phase => "runtime",
17904             relationship => "requires",
17905             version => 0.35,
17906             },
17907             {
17908             module => "Win32::OLE",
17909             phase => "runtime",
17910             relationship => "requires",
17911             version => 0.1704,
17912             },
17913             ],
17914             deprecated => 0,
17915             distribution => "DTS",
17916             download_url => "https://cpan.metacpan.org/authors/id/W/WA/WANTAN/DTS-0.64.tar.gz",
17917             first => 0,
17918             id => "nGHmFCSVmbq_qQgKlDJGHCSjGH4",
17919             license => ["unknown"],
17920             likers => [qw( ANTHONYGOYETTE MINSUNGJUNG )],
17921             likes => 2,
17922             main_module => "DTS",
17923             maturity => "released",
17924             metadata => {
17925             abstract => "unknown",
17926             author => ["unknown"],
17927             dynamic_config => 1,
17928             generated_by => "ExtUtils::MakeMaker version 6.30, CPAN::Meta::Converter version 2.150005",
17929             license => ["unknown"],
17930             "meta-spec" => {
17931             url => "http://search.cpan.org/perldoc?CPAN::Meta::Spec",
17932             version => 2,
17933             },
17934             name => "DTS",
17935             no_index => {
17936             directory => [qw( t xt inc local perl5 fatlib example blib examples eg )],
17937             },
17938             prereqs => {
17939             runtime => {
17940             requires => {
17941             Carp => 1.04,
17942             "Class::Accessor" => 0.25,
17943             DateTime => 0.35,
17944             "Hash::Util" => 0.05,
17945             "Win32::OLE" => 0.1704,
17946             },
17947             },
17948             },
17949             release_status => "stable",
17950             version => 0.02,
17951             x_installdirs => "site",
17952             x_version_from => "lib/DTS.pm",
17953             },
17954             name => "DTS",
17955             package => "DTS",
17956             provides => [qw(
17957             DTS DTS::Application DTS::Assignment
17958             DTS::Assignment::Constant DTS::Assignment::DataFile
17959             DTS::Assignment::Destination
17960             DTS::Assignment::Destination::Connection
17961             DTS::Assignment::Destination::GlobalVar
17962             DTS::Assignment::Destination::Package
17963             DTS::Assignment::Destination::Task
17964             DTS::Assignment::DestinationFactory
17965             DTS::Assignment::EnvVar DTS::Assignment::GlobalVar
17966             DTS::Assignment::INI DTS::Assignment::Query
17967             DTS::AssignmentFactory DTS::AssignmentTypes
17968             DTS::Connection DTS::Credential DTS::Package DTS::Task
17969             DTS::Task::DataPump DTS::Task::DynamicProperty
17970             DTS::Task::ExecutePackage DTS::Task::SendEmail
17971             DTS::TaskFactory DTS::TaskTypes
17972             )],
17973             release => "DTS-0.64",
17974             resources => {},
17975             stat => { gid => 1009, mode => 33204, mtime => 1192571117, size => 96543, uid => 1009 },
17976             status => "backpan",
17977             tests => { fail => 0, na => 8, pass => 0, unknown => 0 },
17978             user => "A7MVzNYFOqkSGx0YwDeOMf",
17979             version => 0.64,
17980             version_numified => "0.640",
17981             },
17982             "PDF::API2" => {
17983             abstract => "objects representing POD input paragraphs, commands, etc.",
17984             archive => "PDF-API2-v1.24.8.tar.gz",
17985             author => "WANTAN",
17986             authorized => 0,
17987             changes_file => "Changes",
17988             checksum_md5 => "cb425f79c1ab12ee58fb8d95eab93b68",
17989             checksum_sha256 => "5629b22a6435cefcf8c31cb9c20eb6f889b75f60a3c55e44bd3444cbb71dc75c",
17990             contributors => [qw( TAKAONAKANISHI RANGSANSUNTHORN )],
17991             date => "2001-12-14T00:00:58",
17992             dependency => [],
17993             deprecated => 0,
17994             distribution => "PDF-API2",
17995             download_url => "https://cpan.metacpan.org/authors/id/W/WA/WANTAN/PDF-API2-v1.24.8.tar.gz",
17996             first => 0,
17997             id => "gdrtW4dy8LAqD0YYPPoUmsAlSGo",
17998             license => ["unknown"],
17999             likers => [qw( ALEXANDRAPOWELL KANTSOMSRISATI )],
18000             likes => 2,
18001             main_module => "PDF::API2",
18002             maturity => "released",
18003             metadata => {
18004             abstract => "unknown",
18005             author => ["unknown"],
18006             dynamic_config => 1,
18007             generated_by => "CPAN::Meta::Converter version 2.150005",
18008             license => ["unknown"],
18009             "meta-spec" => {
18010             url => "http://search.cpan.org/perldoc?CPAN::Meta::Spec",
18011             version => 2,
18012             },
18013             name => "PDF-API2",
18014             no_index => {
18015             directory => [qw( t xt inc local perl5 fatlib example blib examples eg )],
18016             },
18017             prereqs => {},
18018             release_status => "testing",
18019             version => "v0.2.1.0_",
18020             },
18021             name => "PDF-API2",
18022             package => "PDF::API2",
18023             provides => [qw(
18024             PDF::API2 PDF::API2::Annotation PDF::API2::Barcode
18025             PDF::API2::Color PDF::API2::ColorSpace
18026             PDF::API2::Content PDF::API2::CoreFont
18027             PDF::API2::ExtGState PDF::API2::Font PDF::API2::Gfx
18028             PDF::API2::Hybrid PDF::API2::IOString PDF::API2::Image
18029             PDF::API2::JPEG PDF::API2::Matrix PDF::API2::Outline
18030             PDF::API2::Outlines PDF::API2::PNG PDF::API2::PPM
18031             PDF::API2::PSFont PDF::API2::Page PDF::API2::Pattern
18032             PDF::API2::PdfImage PDF::API2::TTFont PDF::API2::Text
18033             PDF::API2::UniMap PDF::API2::Util PDF::API2::xFont
18034             Text::PDF::AFont Text::PDF::Crypt Text::PDF::Crypt::MD5
18035             )],
18036             release => "PDF-API2-v1.24.8",
18037             resources => {},
18038             stat => { gid => 1009, mode => 33204, mtime => 1008288058, size => 512332, uid => 1009 },
18039             status => "backpan",
18040             tests => undef,
18041             user => "A7MVzNYFOqkSGx0YwDeOMf",
18042             version => "v1.24.8",
18043             version_numified => 1.024008,
18044             },
18045             },
18046             name => "Wan Tan",
18047             pauseid => "WANTAN",
18048             profile => [{ id => 651205, name => "stackoverflow" }],
18049             updated => "2023-09-24T15:50:29",
18050             user => "A7MVzNYFOqkSGx0YwDeOMf",
18051             },
18052             WEEWANG => {
18053             asciiname => "Wee Wang",
18054             city => "Singapore",
18055             contributions => [
18056             {
18057             distribution => "Server-Control",
18058             pauseid => "WEEWANG",
18059             release_author => "ALEXANDRAPOWELL",
18060             release_name => "Server-Control-0.24",
18061             },
18062             {
18063             distribution => "Simo-Constrain",
18064             pauseid => "WEEWANG",
18065             release_author => "MINSUNGJUNG",
18066             release_name => "Simo-Constrain-v1.89.10",
18067             },
18068             ],
18069             country => "SG",
18070             email => ["wee.wang\@example.sg"],
18071             favorites => [
18072             {
18073             author => "MINSUNGJUNG",
18074             date => "2006-06-30T19:12:26",
18075             distribution => "Module-ScanDeps",
18076             },
18077             {
18078             author => "MARINAHOTZ",
18079             date => "2010-05-17T03:03:15",
18080             distribution => "App-Hachero",
18081             },
18082             ],
18083             gravatar_url => "https://secure.gravatar.com/avatar/jTrAAwP2FAkC4RI6rScTla1rx8hSAJnV?s=130&d=identicon",
18084             is_pause_custodial_account => 0,
18085             links => {
18086             backpan_directory => "https://cpan.metacpan.org/authors/id/W/WE/WEEWANG",
18087             cpan_directory => "http://cpan.org/authors/id/W/WE/WEEWANG",
18088             cpantesters_matrix => "http://matrix.cpantesters.org/?author=WEEWANG",
18089             cpantesters_reports => "http://cpantesters.org/author/W/WEEWANG.html",
18090             cpants => "http://cpants.cpanauthors.org/author/WEEWANG",
18091             metacpan_explorer => "https://explorer.metacpan.org/?url=/author/WEEWANG",
18092             repology => "https://repology.org/maintainer/WEEWANG%40cpan",
18093             },
18094             modules => {
18095             "App::Build" => {
18096             abstract => "extends Module::Build to build/install/configure entire applications (i.e. web applications), not just modules and programs",
18097             archive => "App-Build-2.34.tar.gz",
18098             author => "WEEWANG",
18099             authorized => 1,
18100             changes_file => "Changes",
18101             checksum_md5 => "c9fdd9ea8fb50696cb75b8e29daf0a77",
18102             checksum_sha256 => "839003d17664b71084a0a724cc84fb26f9fdf37153e86020171cdfd57b865b8a",
18103             contributors => ["DOHYUNNCHOI"],
18104             date => "2006-02-16T15:46:14",
18105             dependency => [
18106             {
18107             module => "Module::Build",
18108             phase => "build",
18109             relationship => "requires",
18110             version => 0,
18111             },
18112             {
18113             module => "File::Spec",
18114             phase => "runtime",
18115             relationship => "requires",
18116             version => 0,
18117             },
18118             {
18119             module => "Module::Build",
18120             phase => "runtime",
18121             relationship => "requires",
18122             version => 0,
18123             },
18124             {
18125             module => "App::Options",
18126             phase => "runtime",
18127             relationship => "requires",
18128             version => 0,
18129             },
18130             ],
18131             deprecated => 0,
18132             distribution => "App-Build",
18133             download_url => "https://cpan.metacpan.org/authors/id/W/WE/WEEWANG/App-Build-2.34.tar.gz",
18134             first => 0,
18135             id => "lExtOsJ65d_6l2M4YC7q4jlpR5U",
18136             license => ["perl_5"],
18137             likers => [qw( HELEWISEGIROUX DUANLIN )],
18138             likes => 2,
18139             main_module => "App::Build",
18140             maturity => "released",
18141             metadata => {
18142             abstract => "extends Module::Build to build/install/configure entire applications (i.e. web applications), not just modules and programs",
18143             author => ["spadkins\@gmail.com"],
18144             dynamic_config => 1,
18145             generated_by => "Module::Build version 0.2611, CPAN::Meta::Converter version 2.150005",
18146             license => ["perl_5"],
18147             "meta-spec" => {
18148             url => "http://search.cpan.org/perldoc?CPAN::Meta::Spec",
18149             version => 2,
18150             },
18151             name => "App-Build",
18152             no_index => {
18153             directory => [qw( t xt inc local perl5 fatlib example blib examples eg )],
18154             },
18155             prereqs => {
18156             build => {
18157             requires => { "Module::Build" => 0 },
18158             },
18159             runtime => {
18160             requires => { "App::Options" => 0, "File::Spec" => 0, "Module::Build" => 0 },
18161             },
18162             },
18163             provides => {
18164             "App::Build" => { file => "lib/App/Build.pm", version => 0.62 },
18165             },
18166             release_status => "stable",
18167             version => 0.62,
18168             },
18169             name => "App-Build",
18170             package => "App::Build",
18171             provides => ["App::Build"],
18172             release => "App-Build-2.34",
18173             resources => {},
18174             stat => { gid => 1009, mode => 33188, mtime => 1140104774, size => 11002, uid => 1009 },
18175             status => "backpan",
18176             tests => { fail => 1, na => 0, pass => 1, unknown => 0 },
18177             user => "QFFqyCNOYksRDZGzCpPm2k",
18178             version => 2.34,
18179             version_numified => "2.340",
18180             },
18181             "Geo::Postcodes::DK" => {
18182             abstract => "Danish postcodes with associated information",
18183             archive => "Geo-Postcodes-DK-2.13.tar.gz",
18184             author => "WEEWANG",
18185             authorized => 1,
18186             changes_file => "Changes",
18187             checksum_md5 => "e2bc315c64aad742e1c4b6cf4aec51d4",
18188             checksum_sha256 => "02a310412b437ceb7e694753c2cb4b5c85d49b823b1c7c409111e6af6102f8e6",
18189             contributors => [qw( ENGYONGCHANG ALESSANDROBAUMANN MINSUNGJUNG )],
18190             date => "2006-07-18T21:06:19",
18191             dependency => [],
18192             deprecated => 0,
18193             distribution => "Geo-Postcodes-DK",
18194             download_url => "https://cpan.metacpan.org/authors/id/W/WE/WEEWANG/Geo-Postcodes-DK-2.13.tar.gz",
18195             first => 0,
18196             id => "Rib3mEJvBCU0k0q19_SYRmsCbmQ",
18197             license => ["unknown"],
18198             likers => [],
18199             likes => 0,
18200             main_module => "Geo::Postcodes::DK",
18201             maturity => "released",
18202             metadata => {
18203             abstract => "unknown",
18204             author => ["unknown"],
18205             dynamic_config => 1,
18206             generated_by => "CPAN::Meta::Converter version 2.150005",
18207             license => ["unknown"],
18208             "meta-spec" => {
18209             url => "http://search.cpan.org/perldoc?CPAN::Meta::Spec",
18210             version => 2,
18211             },
18212             name => "Geo-Postcodes-DK",
18213             no_index => {
18214             directory => [qw( t xt inc local perl5 fatlib example blib examples eg )],
18215             },
18216             prereqs => {},
18217             release_status => "stable",
18218             version => 0.02,
18219             },
18220             name => "Geo-Postcodes-DK",
18221             package => "Geo::Postcodes::DK",
18222             provides => ["Geo::Postcodes::DK"],
18223             release => "Geo-Postcodes-DK-2.13",
18224             resources => {},
18225             stat => { gid => 1009, mode => 33188, mtime => 1153256779, size => 21941, uid => 1009 },
18226             status => "backpan",
18227             tests => { fail => 0, na => 0, pass => 3, unknown => 0 },
18228             user => "QFFqyCNOYksRDZGzCpPm2k",
18229             version => 2.13,
18230             version_numified => "2.130",
18231             },
18232             "Number::WithError::LaTeX" => {
18233             abstract => "LaTeX output for Number::WithError",
18234             archive => "Number-WithError-LaTeX-v0.8.1.tar.gz",
18235             author => "WEEWANG",
18236             authorized => 1,
18237             changes_file => "Changes",
18238             checksum_md5 => "53349800cc637b64dab703ac586dfe1e",
18239             checksum_sha256 => "70c8616e38930627a022e29b33d6cb950963447b9c2026f1b8a89dd1d0274b72",
18240             contributors => ["TAKAONAKANISHI"],
18241             date => "2006-08-30T11:22:43",
18242             dependency => [
18243             {
18244             module => "Test::LectroTest",
18245             phase => "build",
18246             relationship => "requires",
18247             version => 0,
18248             },
18249             {
18250             module => "Test::More",
18251             phase => "build",
18252             relationship => "requires",
18253             version => 0.47,
18254             },
18255             {
18256             module => "perl",
18257             phase => "runtime",
18258             relationship => "requires",
18259             version => "v5.8.0",
18260             },
18261             {
18262             module => "TeX::Encode",
18263             phase => "runtime",
18264             relationship => "requires",
18265             version => 0.4,
18266             },
18267             {
18268             module => "Math::BigFloat",
18269             phase => "runtime",
18270             relationship => "requires",
18271             version => 0,
18272             },
18273             {
18274             module => "Number::WithError",
18275             phase => "runtime",
18276             relationship => "requires",
18277             version => 0.02,
18278             },
18279             {
18280             module => "prefork",
18281             phase => "runtime",
18282             relationship => "requires",
18283             version => "1.00",
18284             },
18285             {
18286             module => "Math::SymbolicX::Inline",
18287             phase => "runtime",
18288             relationship => "requires",
18289             version => "1.00",
18290             },
18291             {
18292             module => "Params::Util",
18293             phase => "runtime",
18294             relationship => "requires",
18295             version => "0.10",
18296             },
18297             ],
18298             deprecated => 0,
18299             distribution => "Number-WithError-LaTeX",
18300             download_url => "https://cpan.metacpan.org/authors/id/W/WE/WEEWANG/Number-WithError-LaTeX-v0.8.1.tar.gz",
18301             first => 0,
18302             id => "myjUbDdkNd9SfkLhCDNPd6oicQY",
18303             license => ["perl_5"],
18304             likers => [],
18305             likes => 0,
18306             main_module => "Number::WithError::LaTeX",
18307             maturity => "released",
18308             metadata => {
18309             abstract => "LaTeX output for Number::WithError",
18310             author => [
18311             "Steffen Mueller <modules at steffen-mueller dot net>, L<http://steffen-mueller.net/>",
18312             ],
18313             dynamic_config => 1,
18314             generated_by => "Module::Install version 0.64, CPAN::Meta::Converter version 2.150005",
18315             license => ["perl_5"],
18316             "meta-spec" => {
18317             url => "http://search.cpan.org/perldoc?CPAN::Meta::Spec",
18318             version => 2,
18319             },
18320             name => "Number-WithError-LaTeX",
18321             no_index => {
18322             directory => [qw( inc t t xt inc local perl5 fatlib example blib examples eg )],
18323             },
18324             prereqs => {
18325             build => {
18326             requires => { "Test::LectroTest" => 0, "Test::More" => 0.47 },
18327             },
18328             runtime => {
18329             requires => {
18330             "Math::BigFloat" => 0,
18331             "Math::SymbolicX::Inline" => "1.00",
18332             "Number::WithError" => 0.02,
18333             "Params::Util" => "0.10",
18334             perl => "v5.8.0",
18335             prefork => "1.00",
18336             "TeX::Encode" => 0.4,
18337             },
18338             },
18339             },
18340             release_status => "stable",
18341             version => 0.04,
18342             },
18343             name => "Number-WithError-LaTeX",
18344             package => "Number::WithError::LaTeX",
18345             provides => ["Number::WithError::LaTeX"],
18346             release => "Number-WithError-LaTeX-v0.8.1",
18347             resources => {},
18348             stat => { gid => 1009, mode => 33188, mtime => 1156936963, size => 18493, uid => 1009 },
18349             status => "backpan",
18350             tests => undef,
18351             user => "QFFqyCNOYksRDZGzCpPm2k",
18352             version => "v0.8.1",
18353             version_numified => 0.008001,
18354             },
18355             "POE::Loop::Tk" => {
18356             abstract => "Tk event loop support for POE.",
18357             archive => "POE-Loop-Tk-0.74.tar.gz",
18358             author => "WEEWANG",
18359             authorized => 1,
18360             changes_file => "Changes",
18361             checksum_md5 => "34cabf5dbf36bd2e9f3e6f9d4e68a3c9",
18362             checksum_sha256 => "d9fb6b210ca945c7f45553850cbf496c87cc983755ac86acc9ea82c9a6cc675f",
18363             date => "2009-08-26T15:58:32",
18364             dependency => [
18365             {
18366             module => "ExtUtils::MakeMaker",
18367             phase => "build",
18368             relationship => "requires",
18369             version => 0,
18370             },
18371             {
18372             module => "POE::Test::Loops",
18373             phase => "build",
18374             relationship => "requires",
18375             version => 1.021,
18376             },
18377             {
18378             module => "Tk",
18379             phase => "runtime",
18380             relationship => "requires",
18381             version => 804.028,
18382             },
18383             {
18384             module => "POE",
18385             phase => "runtime",
18386             relationship => "requires",
18387             version => 1.007,
18388             },
18389             {
18390             module => "POE::Test::Loops",
18391             phase => "runtime",
18392             relationship => "requires",
18393             version => 1.021,
18394             },
18395             {
18396             module => "POE::Test::Loops",
18397             phase => "configure",
18398             relationship => "requires",
18399             version => 1.021,
18400             },
18401             {
18402             module => "ExtUtils::MakeMaker",
18403             phase => "configure",
18404             relationship => "requires",
18405             version => 0,
18406             },
18407             ],
18408             deprecated => 0,
18409             distribution => "POE-Loop-Tk",
18410             download_url => "https://cpan.metacpan.org/authors/id/W/WE/WEEWANG/POE-Loop-Tk-0.74.tar.gz",
18411             first => 0,
18412             id => "DIwSdlXASZwcLPCw_ht91OFzK7k",
18413             license => ["unknown"],
18414             likers => [],
18415             likes => 0,
18416             main_module => "POE::Loop::Tk",
18417             maturity => "released",
18418             metadata => {
18419             abstract => "Tk event loop support for POE.",
18420             author => ["Rocco Caputo <rcaputo\@cpan.org>"],
18421             dynamic_config => 1,
18422             generated_by => "ExtUtils::MakeMaker version 6.54, CPAN::Meta::Converter version 2.150005",
18423             license => ["unknown"],
18424             "meta-spec" => {
18425             url => "http://search.cpan.org/perldoc?CPAN::Meta::Spec",
18426             version => 2,
18427             },
18428             name => "POE-Loop-Tk",
18429             no_index => {
18430             directory => [qw( t inc t xt inc local perl5 fatlib example blib examples eg )],
18431             },
18432             prereqs => {
18433             build => {
18434             requires => { "ExtUtils::MakeMaker" => 0, "POE::Test::Loops" => 1.021 },
18435             },
18436             configure => {
18437             requires => { "ExtUtils::MakeMaker" => 0, "POE::Test::Loops" => 1.021 },
18438             },
18439             runtime => {
18440             requires => { POE => 1.007, "POE::Test::Loops" => 1.021, Tk => 804.028 },
18441             },
18442             },
18443             release_status => "stable",
18444             resources => {
18445             license => ["http://dev.perl.org/licenses/"],
18446             repository => {
18447             url => "https://poe.svn.sourceforge.net/svnroot/poe/trunk/polo-tk",
18448             },
18449             },
18450             version => 1.301,
18451             },
18452             name => "POE-Loop-Tk",
18453             package => "POE::Loop::Tk",
18454             provides => [qw(
18455             POE::Kernel POE::Kernel POE::Kernel POE::Loop::Tk
18456             POE::Loop::Tk POE::Loop::TkActiveState
18457             POE::Loop::TkCommon
18458             )],
18459             release => "POE-Loop-Tk-0.74",
18460             resources => {
18461             license => ["http://dev.perl.org/licenses/"],
18462             repository => {
18463             url => "https://poe.svn.sourceforge.net/svnroot/poe/trunk/polo-tk",
18464             },
18465             },
18466             stat => { gid => 1009, mode => 33204, mtime => 1251302312, size => 8240, uid => 1009 },
18467             status => "backpan",
18468             tests => { fail => 0, na => 0, pass => 7, unknown => 21 },
18469             user => "QFFqyCNOYksRDZGzCpPm2k",
18470             version => 0.74,
18471             version_numified => "0.740",
18472             },
18473             },
18474             name => "Wee Wang",
18475             pauseid => "WEEWANG",
18476             profile => [{ id => 663947, name => "stackoverflow" }],
18477             updated => "2023-09-24T15:50:29",
18478             user => "QFFqyCNOYksRDZGzCpPm2k",
18479             },
18480             YOHEIFUJIWARA => {
18481             asciiname => "Yōhei Fujiwara",
18482             city => "Fukuoka",
18483             contributions => [
18484             {
18485             distribution => "Inline-MonoCS",
18486             pauseid => "YOHEIFUJIWARA",
18487             release_author => "KANTSOMSRISATI",
18488             release_name => "Inline-MonoCS-v2.45.12",
18489             },
18490             {
18491             distribution => "Dist-Zilla-Plugin-ProgCriticTests",
18492             pauseid => "YOHEIFUJIWARA",
18493             release_author => "RACHELSEGAL",
18494             release_name => "Dist-Zilla-Plugin-ProgCriticTests-v1.48.19",
18495             },
18496             {
18497             distribution => "makepp",
18498             pauseid => "YOHEIFUJIWARA",
18499             release_author => "MINSUNGJUNG",
18500             release_name => "makepp-2.66",
18501             },
18502             {
18503             distribution => "DBIx-Custom-MySQL",
18504             pauseid => "YOHEIFUJIWARA",
18505             release_author => "TEDDYSAPUTRA",
18506             release_name => "DBIx-Custom-MySQL-1.40",
18507             },
18508             {
18509             distribution => "Task-Dancer",
18510             pauseid => "YOHEIFUJIWARA",
18511             release_author => "LILLIANSTEWART",
18512             release_name => "Task-Dancer-2.83",
18513             },
18514             {
18515             distribution => "Validator-Custom-HTMLForm",
18516             pauseid => "YOHEIFUJIWARA",
18517             release_author => "TAKAONAKANISHI",
18518             release_name => "Validator-Custom-HTMLForm-v0.40.0",
18519             },
18520             {
18521             distribution => "Text-Match-FastAlternatives",
18522             pauseid => "YOHEIFUJIWARA",
18523             release_author => "OLGABOGDANOVA",
18524             release_name => "Text-Match-FastAlternatives-v1.88.18",
18525             },
18526             {
18527             distribution => "Image-VisualConfirmation",
18528             pauseid => "YOHEIFUJIWARA",
18529             release_author => "DUANLIN",
18530             release_name => "Image-VisualConfirmation-0.4",
18531             },
18532             ],
18533             country => "JP",
18534             email => ["yohei.fujiwara\@example.jp"],
18535             favorites => [
18536             {
18537             author => "MARINAHOTZ",
18538             date => "2010-05-17T03:03:15",
18539             distribution => "App-Hachero",
18540             },
18541             {
18542             author => "FLORABARRETT",
18543             date => "2002-02-10T02:56:54",
18544             distribution => "Date-EzDate",
18545             },
18546             {
18547             author => "FLORABARRETT",
18548             date => "2006-09-14T08:29:46",
18549             distribution => "PAR-Repository",
18550             },
18551             ],
18552             gravatar_url => "https://secure.gravatar.com/avatar/YX3BvVEBNcPzCZ81VwXfAatHIGxfgdfP?s=130&d=identicon",
18553             is_pause_custodial_account => 0,
18554             links => {
18555             backpan_directory => "https://cpan.metacpan.org/authors/id/Y/YO/YOHEIFUJIWARA",
18556             cpan_directory => "http://cpan.org/authors/id/Y/YO/YOHEIFUJIWARA",
18557             cpantesters_matrix => "http://matrix.cpantesters.org/?author=YOHEIFUJIWARA",
18558             cpantesters_reports => "http://cpantesters.org/author/Y/YOHEIFUJIWARA.html",
18559             cpants => "http://cpants.cpanauthors.org/author/YOHEIFUJIWARA",
18560             metacpan_explorer => "https://explorer.metacpan.org/?url=/author/YOHEIFUJIWARA",
18561             repology => "https://repology.org/maintainer/YOHEIFUJIWARA%40cpan",
18562             },
18563             modules => {
18564             "Bundle::Tie::FileLRUCache" => {
18565             abstract => "A bundle to install all Tie::FileLRUCache related modules",
18566             archive => "Bundle-Tie-FileLRUCache-v2.12.9.tar.gz",
18567             author => "YOHEIFUJIWARA",
18568             authorized => 1,
18569             changes_file => "Changes",
18570             checksum_md5 => "7a04d3fd867072b56c19f8fb95b31539",
18571             checksum_sha256 => "d69e82dc4bcd1385e52a831aae92d0d2397f5f0fc162dd09df987bb670af1256",
18572             date => "1999-06-18T15:34:07",
18573             dependency => [],
18574             deprecated => 0,
18575             distribution => "Bundle-Tie-FileLRUCache",
18576             download_url => "https://cpan.metacpan.org/authors/id/Y/YO/YOHEIFUJIWARA/Bundle-Tie-FileLRUCache-v2.12.9.tar.gz",
18577             first => 1,
18578             id => "HBWTi2GkP_yrUb6bigSiZM_0G_k",
18579             license => ["unknown"],
18580             likers => ["DUANLIN"],
18581             likes => 1,
18582             main_module => "Bundle::Tie::FileLRUCache",
18583             maturity => "released",
18584             metadata => {
18585             abstract => "unknown",
18586             author => ["unknown"],
18587             dynamic_config => 1,
18588             generated_by => "CPAN::Meta::Converter version 2.150005",
18589             license => ["unknown"],
18590             "meta-spec" => {
18591             url => "http://search.cpan.org/perldoc?CPAN::Meta::Spec",
18592             version => 2,
18593             },
18594             name => "Bundle-Tie-FileLRUCache",
18595             no_index => {
18596             directory => [qw( t xt inc local perl5 fatlib example blib examples eg )],
18597             },
18598             prereqs => {},
18599             release_status => "stable",
18600             version => 1.01,
18601             },
18602             name => "Bundle-Tie-FileLRUCache",
18603             package => "Bundle::Tie::FileLRUCache",
18604             provides => ["Bundle::Tie::FileLRUCache"],
18605             release => "Bundle-Tie-FileLRUCache-v2.12.9",
18606             resources => {},
18607             stat => { gid => 1009, mode => 33204, mtime => 929720047, size => 859, uid => 1009 },
18608             status => "backpan",
18609             tests => undef,
18610             user => "b7RYLJwFNwLj5WS2rqakQm",
18611             version => "v2.12.9",
18612             version_numified => 2.012009,
18613             },
18614             Catalyst => {
18615             abstract => "Catalyst",
18616             archive => "Catalyst-v1.92.2.tar.gz",
18617             author => "YOHEIFUJIWARA",
18618             authorized => 1,
18619             changes_file => "Changes",
18620             checksum_md5 => "c6c1106e9bae0731e4461bd4f8bfb7d5",
18621             checksum_sha256 => "73137fe01eb38f8c088740f9ba82d6b23e4c549b7667e2c52305e9bd7f6576be",
18622             contributors => ["FLORABARRETT"],
18623             date => "2006-12-12T16:15:50",
18624             dependency => [
18625             {
18626             module => "perl",
18627             phase => "runtime",
18628             relationship => "requires",
18629             version => "v5.6.1",
18630             },
18631             {
18632             module => "Catalyst::Runtime",
18633             phase => "runtime",
18634             relationship => "requires",
18635             version => 5.7,
18636             },
18637             ],
18638             deprecated => 0,
18639             distribution => "Catalyst",
18640             download_url => "https://cpan.metacpan.org/authors/id/Y/YO/YOHEIFUJIWARA/Catalyst-v1.92.2.tar.gz",
18641             first => 0,
18642             id => "_p3Z6p_anb6wHtSUxjsAeALlCkk",
18643             license => ["perl_5"],
18644             likers => [],
18645             likes => 0,
18646             main_module => "Catalyst",
18647             maturity => "released",
18648             metadata => {
18649             abstract => "unknown",
18650             author => ["unknown"],
18651             dynamic_config => 1,
18652             generated_by => "Module::Install version 0.64, CPAN::Meta::Converter version 2.150005",
18653             license => ["perl_5"],
18654             "meta-spec" => {
18655             url => "http://search.cpan.org/perldoc?CPAN::Meta::Spec",
18656             version => 2,
18657             },
18658             name => "Catalyst",
18659             no_index => {
18660             directory => [qw( inc t t xt inc local perl5 fatlib example blib examples eg )],
18661             },
18662             prereqs => {
18663             runtime => {
18664             requires => { "Catalyst::Runtime" => 5.7, perl => "v5.6.1" },
18665             },
18666             },
18667             release_status => "stable",
18668             version => "5.7000",
18669             },
18670             name => "Catalyst",
18671             package => "Catalyst",
18672             provides => [],
18673             release => "Catalyst-v1.92.2",
18674             resources => {},
18675             stat => { gid => 1009, mode => 33188, mtime => 1165940150, size => 10626, uid => 1009 },
18676             status => "backpan",
18677             tests => undef,
18678             user => "b7RYLJwFNwLj5WS2rqakQm",
18679             version => "v1.92.2",
18680             version_numified => 1.092002,
18681             },
18682             DB => {
18683             abstract => "Very simple framework for Object Oriented Perl.",
18684             archive => "Simo-v1.55.19.tar.gz",
18685             author => "YOHEIFUJIWARA",
18686             authorized => 0,
18687             changes_file => "Changes",
18688             checksum_md5 => "99abea532f8b9b0367d28b0d15fddd7d",
18689             checksum_sha256 => "2cea0784ce40584c488b2cd36c0f227968280253dd4eec5b92ddcc2dd0b62dc1",
18690             contributors => ["MINSUNGJUNG"],
18691             date => "2009-04-19T15:29:34",
18692             dependency => [
18693             {
18694             module => "Simo::Error",
18695             phase => "build",
18696             relationship => "requires",
18697             version => 0.0206,
18698             },
18699             {
18700             module => "Test::More",
18701             phase => "build",
18702             relationship => "requires",
18703             version => 0,
18704             },
18705             {
18706             module => "Simo::Util",
18707             phase => "runtime",
18708             relationship => "requires",
18709             version => 0.0301,
18710             },
18711             {
18712             module => "Storable",
18713             phase => "runtime",
18714             relationship => "requires",
18715             version => 0,
18716             },
18717             ],
18718             deprecated => 0,
18719             distribution => "Simo",
18720             download_url => "https://cpan.metacpan.org/authors/id/Y/YO/YOHEIFUJIWARA/Simo-v1.55.19.tar.gz",
18721             first => 0,
18722             id => "f8cvGRKm6_mParoKEKFkO15q9WY",
18723             license => ["perl_5"],
18724             likers => [qw( TEDDYSAPUTRA SAMANDERSON )],
18725             likes => 2,
18726             main_module => "DB",
18727             maturity => "released",
18728             metadata => {
18729             abstract => "Very simple framework for Object Oriented Perl.",
18730             author => ["Yuki <kimoto.yuki\@gmail.com>"],
18731             dynamic_config => 1,
18732             generated_by => "Module::Build version 0.31012, CPAN::Meta::Converter version 2.150005",
18733             license => ["perl_5"],
18734             "meta-spec" => {
18735             url => "http://search.cpan.org/perldoc?CPAN::Meta::Spec",
18736             version => 2,
18737             },
18738             name => "Simo",
18739             no_index => {
18740             directory => [qw( t xt inc local perl5 fatlib example blib examples eg )],
18741             },
18742             prereqs => {
18743             build => {
18744             requires => { "Simo::Error" => 0.0206, "Test::More" => 0 },
18745             },
18746             runtime => {
18747             requires => { "Simo::Util" => 0.0301, Storable => 0 },
18748             },
18749             },
18750             provides => {
18751             DB => { file => "lib/Simo.pm" },
18752             Simo => { file => "lib/Simo.pm", version => 0.1103 },
18753             },
18754             release_status => "stable",
18755             resources => {},
18756             version => 0.1103,
18757             },
18758             name => "Simo",
18759             package => "DB",
18760             provides => ["Simo"],
18761             release => "Simo-v1.55.19",
18762             resources => {},
18763             stat => { gid => 1009, mode => 33204, mtime => 1240154974, size => 25197, uid => 1009 },
18764             status => "backpan",
18765             tests => { fail => 0, na => 1, pass => 0, unknown => 0 },
18766             user => "b7RYLJwFNwLj5WS2rqakQm",
18767             version => "v1.55.19",
18768             version_numified => 1.055019,
18769             },
18770             "DBD::Trini" => {
18771             abstract => "Pure Perl DBMS",
18772             archive => "DBD-Trini-v0.77.10.tar.gz",
18773             author => "YOHEIFUJIWARA",
18774             authorized => 1,
18775             changes_file => "Changes",
18776             checksum_md5 => "bfdc2467dc4704e2068b3333fc731609",
18777             checksum_sha256 => "ab512de4b4f1918f5d57f4642a9b7834ead72139d8f55f427554ca08565b8c30",
18778             date => "2003-07-15T07:18:15",
18779             dependency => [],
18780             deprecated => 0,
18781             distribution => "DBD-Trini",
18782             download_url => "https://cpan.metacpan.org/authors/id/Y/YO/YOHEIFUJIWARA/DBD-Trini-v0.77.10.tar.gz",
18783             first => 1,
18784             id => "BBZ7qbHiAyQ8nKg4kQ6_7J0LUFc",
18785             license => ["unknown"],
18786             likers => ["ENGYONGCHANG"],
18787             likes => 1,
18788             main_module => "DBD::Trini",
18789             maturity => "released",
18790             metadata => {
18791             abstract => "unknown",
18792             author => ["unknown"],
18793             dynamic_config => 1,
18794             generated_by => "CPAN::Meta::Converter version 2.150005",
18795             license => ["unknown"],
18796             "meta-spec" => {
18797             url => "http://search.cpan.org/perldoc?CPAN::Meta::Spec",
18798             version => 2,
18799             },
18800             name => "DBD-Trini",
18801             no_index => {
18802             directory => [qw( t xt inc local perl5 fatlib example blib examples eg )],
18803             },
18804             prereqs => {},
18805             release_status => "stable",
18806             version => 0.01,
18807             },
18808             name => "DBD-Trini",
18809             package => "DBD::Trini",
18810             provides => [qw(
18811             DBD::Trini DBD::Trini::PosBlock DBD::Trini::Record
18812             DBD::Trini::Recordset DBD::Trini::Table
18813             DBD::Trini::datatypes::Memo
18814             DBD::Trini::datatypes::VarChar DBD::Trini::db
18815             DBD::Trini::dr DBD::Trini::st
18816             )],
18817             release => "DBD-Trini-v0.77.10",
18818             resources => {},
18819             stat => { gid => 1009, mode => 33188, mtime => 1058253495, size => 21157, uid => 1009 },
18820             status => "backpan",
18821             tests => undef,
18822             user => "b7RYLJwFNwLj5WS2rqakQm",
18823             version => "v0.77.10",
18824             version_numified => "0.077010",
18825             },
18826             "Tk::TIFF" => {
18827             abstract => "Tk TIFF",
18828             archive => "Tk-TIFF-2.72.tar.gz",
18829             author => "YOHEIFUJIWARA",
18830             authorized => 1,
18831             changes_file => "Changes",
18832             checksum_md5 => "2932d9b2a3b6ec5ddac32b534fa366ba",
18833             checksum_sha256 => "c3825fe76233561ea405bd4990d7a6e60188bf9b22cde3c8743376d6a409da04",
18834             contributors => ["ENGYONGCHANG"],
18835             date => "1999-04-14T18:18:22",
18836             dependency => [],
18837             deprecated => 0,
18838             distribution => "Tk-TIFF",
18839             download_url => "https://cpan.metacpan.org/authors/id/Y/YO/YOHEIFUJIWARA/Tk-TIFF-2.72.tar.gz",
18840             first => 0,
18841             id => "_ooOnVQGx9ByNTzciiv5024V4dg",
18842             license => ["unknown"],
18843             likers => [qw( KANTSOMSRISATI YOICHIFUJITA SAMANDERSON )],
18844             likes => 3,
18845             main_module => "Tk::TIFF",
18846             maturity => "released",
18847             metadata => {
18848             abstract => "unknown",
18849             author => ["unknown"],
18850             dynamic_config => 1,
18851             generated_by => "CPAN::Meta::Converter version 2.150005",
18852             license => ["unknown"],
18853             "meta-spec" => {
18854             url => "http://search.cpan.org/perldoc?CPAN::Meta::Spec",
18855             version => 2,
18856             },
18857             name => "Tk-TIFF",
18858             no_index => {
18859             directory => [qw( t xt inc local perl5 fatlib example blib examples eg )],
18860             },
18861             prereqs => {},
18862             release_status => "stable",
18863             version => 0.06,
18864             },
18865             name => "Tk-TIFF",
18866             package => "Tk::TIFF",
18867             provides => ["Tk::TIFF"],
18868             release => "Tk-TIFF-2.72",
18869             resources => {},
18870             stat => { gid => 1009, mode => 33204, mtime => 924113902, size => 33417, uid => 1009 },
18871             status => "backpan",
18872             tests => undef,
18873             user => "b7RYLJwFNwLj5WS2rqakQm",
18874             version => 2.72,
18875             version_numified => "2.720",
18876             },
18877             },
18878             name => "Yōhei Fujiwara",
18879             pauseid => "YOHEIFUJIWARA",
18880             profile => [{ id => 559701, name => "stackoverflow" }],
18881             updated => "2023-09-24T15:50:29",
18882             user => "b7RYLJwFNwLj5WS2rqakQm",
18883             },
18884             YOICHIFUJITA => {
18885             asciiname => "Yōichi Fujita",
18886             city => "Osaka",
18887             contributions => [
18888             {
18889             distribution => "MooseX-Log-Log4perl",
18890             pauseid => "YOICHIFUJITA",
18891             release_author => "SIEUNJANG",
18892             release_name => "MooseX-Log-Log4perl-1.20",
18893             },
18894             {
18895             distribution => "dbic-chado",
18896             pauseid => "YOICHIFUJITA",
18897             release_author => "SIEUNJANG",
18898             release_name => "dbic-chado-1.0",
18899             },
18900             {
18901             distribution => "PAR-Repository-Client",
18902             pauseid => "YOICHIFUJITA",
18903             release_author => "TAKASHIISHIKAWA",
18904             release_name => "PAR-Repository-Client-v0.82.12",
18905             },
18906             {
18907             distribution => "Image-VisualConfirmation",
18908             pauseid => "YOICHIFUJITA",
18909             release_author => "DUANLIN",
18910             release_name => "Image-VisualConfirmation-0.4",
18911             },
18912             {
18913             distribution => "DBIx-Custom",
18914             pauseid => "YOICHIFUJITA",
18915             release_author => "ELAINAREYES",
18916             release_name => "DBIx-Custom-2.37",
18917             },
18918             {
18919             distribution => "Bundle-Catalyst",
18920             pauseid => "YOICHIFUJITA",
18921             release_author => "ALEXANDRAPOWELL",
18922             release_name => "Bundle-Catalyst-2.58",
18923             },
18924             {
18925             distribution => "App-gh",
18926             pauseid => "YOICHIFUJITA",
18927             release_author => "MARINAHOTZ",
18928             release_name => "App-gh-2.3",
18929             },
18930             ],
18931             country => "JP",
18932             email => ["yoichi.fujita\@example.jp"],
18933             favorites => [
18934             {
18935             author => "TAKAONAKANISHI",
18936             date => "2009-01-02T20:17:24",
18937             distribution => "WWW-TinySong",
18938             },
18939             {
18940             author => "YOHEIFUJIWARA",
18941             date => "1999-04-14T18:18:22",
18942             distribution => "Tk-TIFF",
18943             },
18944             {
18945             author => "HEHERSONDEGUZMAN",
18946             date => "2005-03-23T00:39:39",
18947             distribution => "Catalyst-Plugin-Ajax",
18948             },
18949             ],
18950             gravatar_url => "https://secure.gravatar.com/avatar/G0ecSH4jYnSybgPUIakCpfcrr4746KKY?s=130&d=identicon",
18951             is_pause_custodial_account => 0,
18952             links => {
18953             backpan_directory => "https://cpan.metacpan.org/authors/id/Y/YO/YOICHIFUJITA",
18954             cpan_directory => "http://cpan.org/authors/id/Y/YO/YOICHIFUJITA",
18955             cpantesters_matrix => "http://matrix.cpantesters.org/?author=YOICHIFUJITA",
18956             cpantesters_reports => "http://cpantesters.org/author/Y/YOICHIFUJITA.html",
18957             cpants => "http://cpants.cpanauthors.org/author/YOICHIFUJITA",
18958             metacpan_explorer => "https://explorer.metacpan.org/?url=/author/YOICHIFUJITA",
18959             repology => "https://repology.org/maintainer/YOICHIFUJITA%40cpan",
18960             },
18961             modules => {
18962             "Net::DNS::Nslookup" => {
18963             abstract => "Perl module for getting simple nslookup output.",
18964             archive => "Net-DNS-Nslookup-0.73.tar.gz",
18965             author => "YOICHIFUJITA",
18966             authorized => 0,
18967             changes_file => "Changes",
18968             checksum_md5 => "8ab3b4c50ef0efbee70bc62d478d7df5",
18969             checksum_sha256 => "6307e52362547f2931ddf4d2000d84d3955dbf5255cdade33752c22b703540ca",
18970             contributors => [qw(
18971             TEDDYSAPUTRA MARINAHOTZ TAKAONAKANISHI OLGABOGDANOVA
18972             OLGABOGDANOVA
18973             )],
18974             date => "2011-03-22T17:28:19",
18975             dependency => [],
18976             deprecated => 0,
18977             distribution => "Net-DNS-Nslookup",
18978             download_url => "https://cpan.metacpan.org/authors/id/Y/YO/YOICHIFUJITA/Net-DNS-Nslookup-0.73.tar.gz",
18979             first => 1,
18980             id => "wJCLVpJuNbEDiUNZjeozpzfGlKo",
18981             license => ["unknown"],
18982             likers => ["TAKASHIISHIKAWA"],
18983             likes => 1,
18984             main_module => "Net::DNS::Nslookup",
18985             maturity => "released",
18986             metadata => {
18987             abstract => "unknown",
18988             author => ["unknown"],
18989             dynamic_config => 1,
18990             generated_by => "CPAN::Meta::Converter version 2.150005",
18991             license => ["unknown"],
18992             "meta-spec" => {
18993             url => "http://search.cpan.org/perldoc?CPAN::Meta::Spec",
18994             version => 2,
18995             },
18996             name => "Net-DNS-Nslookup",
18997             no_index => {
18998             directory => [qw( t xt inc local perl5 fatlib example blib examples eg )],
18999             },
19000             prereqs => {},
19001             release_status => "stable",
19002             version => 0.01,
19003             },
19004             name => "Net-DNS-Nslookup",
19005             package => "Net::DNS::Nslookup",
19006             provides => [],
19007             release => "Net-DNS-Nslookup-0.73",
19008             resources => {},
19009             stat => { gid => 1009, mode => 33204, mtime => 1300814899, size => 1941, uid => 1009 },
19010             status => "backpan",
19011             tests => { fail => 113, na => 0, pass => 4, unknown => 1 },
19012             user => "X8ddRBo9R6gWRiPHKowgzq",
19013             version => 0.73,
19014             version_numified => "0.730",
19015             },
19016             "Palm::PDB" => {
19017             abstract => "Handles standard AppInfo block",
19018             archive => "p5-Palm-2.38.tar.gz",
19019             author => "YOICHIFUJITA",
19020             authorized => 1,
19021             changes_file => "Changes",
19022             checksum_md5 => "0d8b6097375ff4cfd38479c5b3b1adce",
19023             checksum_sha256 => "ee65f66914f183c22997b2932c126bf592baa2dc5df5dc155ae659be2877698c",
19024             contributors => [qw( HUWANATIENZA HEHERSONDEGUZMAN )],
19025             date => "2000-04-24T11:54:11",
19026             dependency => [],
19027             deprecated => 0,
19028             distribution => "p5-Palm",
19029             download_url => "https://cpan.metacpan.org/authors/id/Y/YO/YOICHIFUJITA/p5-Palm-2.38.tar.gz",
19030             first => 1,
19031             id => "dUk4CdIqW68_aiwlSFAgkwpFeNE",
19032             license => ["unknown"],
19033             likers => [],
19034             likes => 0,
19035             main_module => "Palm::PDB",
19036             maturity => "released",
19037             metadata => {
19038             abstract => "unknown",
19039             author => ["unknown"],
19040             dynamic_config => 1,
19041             generated_by => "CPAN::Meta::Converter version 2.150005",
19042             license => ["unknown"],
19043             "meta-spec" => {
19044             url => "http://search.cpan.org/perldoc?CPAN::Meta::Spec",
19045             version => 2,
19046             },
19047             name => "p5-Palm",
19048             no_index => {
19049             directory => [qw( t xt inc local perl5 fatlib example blib examples eg )],
19050             },
19051             prereqs => {},
19052             release_status => "stable",
19053             version => "v1.1.3",
19054             },
19055             name => "p5-Palm",
19056             package => "Palm::PDB",
19057             provides => [qw(
19058             Palm::Address Palm::Datebook Palm::Mail Palm::Memo
19059             Palm::PDB Palm::Raw Palm::StdAppInfo Palm::ToDo
19060             )],
19061             release => "p5-Palm-2.38",
19062             resources => {},
19063             stat => { gid => 1009, mode => 33204, mtime => 956577251, size => 30259, uid => 1009 },
19064             status => "backpan",
19065             tests => undef,
19066             user => "X8ddRBo9R6gWRiPHKowgzq",
19067             version => 2.38,
19068             version_numified => "2.380",
19069             },
19070             "Tie::DB_File::SplitHash" => {
19071             abstract => "A wrapper around the DB_File Berkeley database system",
19072             archive => "Tie-DB_File-SplitHash-v2.4.14.tar.gz",
19073             author => "YOICHIFUJITA",
19074             authorized => 1,
19075             changes_file => "Changes",
19076             checksum_md5 => "58392a57d60f8afd276db3ee658635a1",
19077             checksum_sha256 => "ca0ff80b90328ef0db1252fc636636c5a7ef071b128915c382938507da3cfd48",
19078             contributors => [qw( ALEXANDRAPOWELL TAKASHIISHIKAWA )],
19079             date => "1999-06-16T21:05:31",
19080             dependency => [],
19081             deprecated => 0,
19082             distribution => "Tie-DB_File-SplitHash",
19083             download_url => "https://cpan.metacpan.org/authors/id/Y/YO/YOICHIFUJITA/Tie-DB_File-SplitHash-v2.4.14.tar.gz",
19084             first => 1,
19085             id => "6SQuW1cPx99Y1MNMSBHCrFQMvdU",
19086             license => ["unknown"],
19087             likers => [],
19088             likes => 0,
19089             main_module => "Tie::DB_File::SplitHash",
19090             maturity => "released",
19091             metadata => {
19092             abstract => "unknown",
19093             author => ["unknown"],
19094             dynamic_config => 1,
19095             generated_by => "CPAN::Meta::Converter version 2.150005",
19096             license => ["unknown"],
19097             "meta-spec" => {
19098             url => "http://search.cpan.org/perldoc?CPAN::Meta::Spec",
19099             version => 2,
19100             },
19101             name => "Tie-DB_File-SplitHash",
19102             no_index => {
19103             directory => [qw( t xt inc local perl5 fatlib example blib examples eg )],
19104             },
19105             prereqs => {},
19106             release_status => "stable",
19107             version => "1.00",
19108             },
19109             name => "Tie-DB_File-SplitHash",
19110             package => "Tie::DB_File::SplitHash",
19111             provides => ["Tie::DB_File::SplitHash"],
19112             release => "Tie-DB_File-SplitHash-v2.4.14",
19113             resources => {},
19114             stat => { gid => 1009, mode => 33204, mtime => 929567131, size => 3543, uid => 1009 },
19115             status => "backpan",
19116             tests => undef,
19117             user => "X8ddRBo9R6gWRiPHKowgzq",
19118             version => "v2.4.14",
19119             version_numified => 2.004014,
19120             },
19121             },
19122             name => "Yōichi Fujita",
19123             pauseid => "YOICHIFUJITA",
19124             profile => [{ id => 423665, name => "stackoverflow" }],
19125             updated => "2023-09-24T15:50:29",
19126             user => "X8ddRBo9R6gWRiPHKowgzq",
19127             },
19128             },
19129             }
19130             EOT
19131              
19132             # NOTE: $DIFF_RAW_TEMPLATE
19133             our $DIFF_RAW_TEMPLATE = <<'EOT';
19134             diff -r ${prev_rel}/CHANGES ${rel}/CHANGES
19135             2a3,5
19136             > ${vers} ${today}T13:10:37
19137             > - Updated name returned
19138             >
19139             diff -r ${prev_rel}/CONTRIBUTING.md ${rel}/CONTRIBUTING.md
19140             32c32
19141             < The versioning style used is dotted decimal, such as `${prev}`
19142             ---
19143             > The versioning style used is dotted decimal, such as `${vers}`
19144             diff -r ${prev_rel}/lib/${path1} ${rel}/lib/${path2}
19145             3c3
19146             < ## Version ${prev}
19147             ---
19148             > ## Version ${vers}
19149             7c7
19150             < ## Modified ${before}
19151             ---
19152             > ## Modified ${today}
19153             19c19
19154             < $VERSION = '${prev}';
19155             ---
19156             > $VERSION = '${vers}';
19157             29c29
19158             < sub name { return( "John Doe" ); }
19159             ---
19160             > sub name { return( "Urashima Taro" ); }
19161             48c48
19162             < ${prev}
19163             ---
19164             > ${vers}
19165             diff -r ${prev_rel}/META.json ${rel}/META.json
19166             60c60
19167             < "version" : "${prev}",
19168             ---
19169             > "version" : "${vers}",
19170             diff -r ${prev_rel}/META.yml ${rel}/META.yml
19171             32c32
19172             < version: ${prev}
19173             ---
19174             > version: ${vers}
19175             EOT
19176              
19177             # NOTE: $DIFF_JSON_TEMPLATE
19178             our $DIFF_JSON_TEMPLATE = <<'EOT';
19179             {
19180             "source" : "${author}/${prev_rel}",
19181             "statistics" : [
19182             {
19183             "deletions" : 0,
19184             "diff" : "diff --git a/var/tmp/source/${author}/${prev_rel}/CHANGES b/var/tmp/target/${author}/${next_rel}/CHANGES\n--- a/var/tmp/source/${author}/${prev_rel}/CHANGES\n+++ b/var/tmp/target/${author}/${next_rel}/CHANGES\n@@ -2,5 +3,5 @@\n ${vers} ${today}T13:10:37+0900\n - Updated name returned\n",
19185             "insertions" : 1,
19186             "source" : "${author}/${prev_rel}/CHANGES",
19187             "target" : "${author}/${next_rel}/CHANGES"
19188             },
19189             {
19190             "deletions" : 1,
19191             "diff" : "diff --git a/var/tmp/source/${author}/${prev_rel}/CONTRIBUTING.md b/var/tmp/target/${author}/${next_rel}/CONTRIBUTING.md\n--- a/var/tmp/source/${author}/${prev_rel}/CONTRIBUTING.md\n+++ b/var/tmp/target/${author}/${next_rel}/CONTRIBUTING.md\n@@ -32 +32 @@\n - The versioning style used is dotted decimal, such as `v0.1.0`\n + The versioning style used is dotted decimal, such as `v0.1.1`\n",
19192             "insertions" : 1,
19193             "source" : "${author}/${prev_rel}/CONTRIBUTING.md",
19194             "target" : "${author}/${next_rel}/CONTRIBUTING.md"
19195             },
19196             {
19197             "deletions" : 5,
19198             "diff" : "diff --git a/var/tmp/source/${author}/${prev_rel}/lib/${path1} b/var/tmp/target/${author}/${next_rel}/lib/${path2}\n--- a/var/tmp/source/${author}/${prev_rel}/lib/${path1}\n+++ b/var/tmp/target/${author}/${next_rel}/lib/${path2}\n@@ -3 +3 @@\n - ## Version ${prev}\n + Version ${vers}\n@@ -7 +7 @@\n - ## Modified ${before}\n + ## Modified ${today}\n@@ -19 +19 @@\n - $VERSION = '${prev}';\n + $VERSION = '${vers}';\n@@ -29 +29 @@\n - sub name { return( \"John Doe\" ); }\n + sub name { return( \"Urashima Taro\" ); }\n@@ -48 + 48 @@\n - ${prev}\n + ${vers}",
19199             "insertions" : 5,
19200             "source" : "${author}/${prev_rel}/lib/${path1}",
19201             "target" : "${author}/${next_rel}/lib/${path2}"
19202             },
19203             {
19204             "deletions" : 1,
19205             "diff" : "diff --git a/var/tmp/source/${author}/${prev_rel}/META.json b/var/tmp/target/${author}/${next_rel}/META.json\n--- a/var/tmp/source/${author}/${prev_rel}/META.json\n+++ b/var/tmp/target/${author}/${next_rel}/META.json\n@@ -60 +60 @@\n - \"version\" : \"${prev}\",\n + \"version\" : \"${vers}\",\n",
19206             "insertions" : 1,
19207             "source" : "${author}/${prev_rel}/META.json",
19208             "target" : "${author}/${next_rel}/META.json"
19209             },
19210             {
19211             "deletions" : 1,
19212             "diff" : "diff --git a/var/tmp/source/${author}/${prev_rel}/META.yml b/var/tmp/target/${author}/${next_rel}/META.yml\n--- a/var/tmp/source/${author}/${prev_rel}/META.yml\n+++ b/var/tmp/target/${author}/${next_rel}/META.yml\n@@ -32 +32 @@\n - version: ${prev}\n + version: ${vers}\n",
19213             "insertions" : 1,
19214             "source" : "${author}/${prev_rel}/META.yml",
19215             "target" : "${author}/${next_rel}/META.yml"
19216             }
19217             ],
19218             "target" : "${author}/${next_rel}"
19219             }
19220             EOT
19221              
19222             1;
19223             # NOTE: POD
19224             __END__