Module: Development

Defined in:
lib/development.rb,
lib/namespaces.rb

Overview

Singleton that manages configurations and requires.

Defined Under Namespace

Modules: ConfigurationInterface, Require Classes: Directory, Gem, Gemset

Constant Summary collapse

ConfigurationFileName =

Name of configuration file: .development.rb.

'.development.rb'

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.attempt_load_from_general_load_paths(gem_directory_name, gem_require_name) ⇒ ::Development

Attempt to load gem from general load paths if any are provided.

Parameters:

  • gem_directory_name

    Gem directory in hyphenated gem-subgem format.

  • gem_require_name

    Gem name in slashed gem/subgem format.

Returns:



590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
# File 'lib/development.rb', line 590

def self.attempt_load_from_general_load_paths( gem_directory_name, gem_require_name )
  
  gem_require_name = gem_directory_name.to_sym
  
  did_load = false
  
  # look in each path for gem - use first to match
  @general_load_paths.each do |this_load_path|

    if path_is_gem_directory?( this_load_path, gem_require_name )

      load_gem_in_path( this_load_path, gem_require_name )
      @loaded_gems[ gem_require_name ] = true
      did_load = true
      break

    elsif path_contains_gem_directory?( this_load_path, gem_directory_name, gem_require_name )

      gem_location = ::File.join( this_load_path, gem_directory_name )

      load_gem_in_path( gem_location, gem_require_name )
      @loaded_gems[ gem_require_name ] = true
      did_load = true
      break

    end

  end
  
  return did_load
  
end

.clearDevelopment

Reset internal tracking variables.

Returns:



53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
# File 'lib/development.rb', line 53

def self.clear
  
  @enable_for_all = false

  @directories.clear

  @gems.clear
  @gemsets.clear

  @general_load_paths.clear

  @loaded_gems.clear
  
  return self
  
end

.directoriesHash{Symbol=>::Development::Directory}

Get Hash of named directory names to paths.

Returns:



272
273
274
275
276
# File 'lib/development.rb', line 272

def self.directories

  return @directories

end

.self.directory(name, path, gem_or_gemset, ...) ⇒ ::Development::Directory

Return path for directory name.

Parameters:

  • directory_name

    Name of named directory.

  • path_parts

    The first can be a Symbol naming a directory; any can be String describing directory path.

Returns:



225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
# File 'lib/development.rb', line 225

def self.directory( name, *path_parts )
  
  name = name.to_sym

  if directory_instance = @directories[ name ]
    unless path_parts.empty?
      directory_instance.set_path( *path_parts )
    end
  else
    if path_parts.empty?
      raise ::ArgumentError, 'Path required to create directory :' << name.to_s + '.'
    end
    @directories[ name ] = directory_instance = Directory.new( name, *path_parts )
  end

  return directory_instance
  
end

.disable!::Development .disable(gem_or_gemset, ...) ⇒ ::Development

Disable gems.

Overloads:

  • .disable(gem_or_gemset, ...) ⇒ ::Development

    Parameters:

    • gem_or_gemset

      Gem or Gemset instance or name to disable.

Returns:



422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
# File 'lib/development.rb', line 422

def self.disable!( *gem_or_gemset_names )

  if gem_or_gemset_names.empty?

    @enable_for_all = false
    @gems.each do |this_gem_name, this_gem|
      this_gem.disable!
    end
    @gemsets.each do |this_gemset_name, this_gemset|
      this_gemset.disable!
    end

  else

    gem_or_gemset_names.each do |this_gemset_or_gem_name|
      this_gem_or_gemset_reference_name = this_gemset_or_gem_name.to_s.gsub( '/', '-' ).to_sym
      if gem_instance = @gems[ this_gem_or_gemset_reference_name ]
        gem_instance.disable!
      end
      if gemset_instance = @gemsets[ this_gem_or_gemset_reference_name ]
        gemset_instance.disable!
      end
    end

  end

  return self

end

.enable!::Development .enable(gem_or_gemset, ...) ⇒ ::Development

Enable gems.

Overloads:

  • .enable(gem_or_gemset, ...) ⇒ ::Development

    Parameters:

    • gem_or_gemset

      Gem or Gemset instance or name to enable.

Returns:



367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
# File 'lib/development.rb', line 367

def self.enable!( *gem_or_gemset_names )
  
  if gem_or_gemset_names.empty?

    @enable_for_all = true
    @gems.each do |this_gem_name, this_gem|
      this_gem.enable!
    end
    @gemsets.each do |this_gemset_name, this_gemset|
      this_gemset.enable!
    end

  else

    gem_or_gemset_names.each do |this_gemset_or_gem_name|
      if this_gemset_or_gem_name.is_a?( ::Hash )
        this_gemset_or_gem_name.each do |this_gem, this_path|
          gem_instance = gem( this_gem )
          gem_instance.set_directory( this_path )
          gem_instance.enable!
        end
      else
        this_gem_or_gemset_reference_name = this_gemset_or_gem_name.to_s.gsub( '/', '-' ).to_sym
        if gem_instance = @gems[ this_gem_or_gemset_reference_name ]
          gem_instance.enable!
        end
        if gemset_instance = @gemsets[ this_gem_or_gemset_reference_name ]
          gemset_instance.enable!
        end
      end
    end

  end
  
  return self
  
end

.enabled_for_all?true, false

Query whether Development is set to search in general paths for any gem, even if not explicitly enabled.

Returns:

  • (true, false)

    Whether general gem search is enabled.



344
345
346
347
348
# File 'lib/development.rb', line 344

def self.enabled_for_all?
  
  return @enable_for_all
  
end

.gem(name, directory_or_path = nil) ⇒ ::Development::Gem

Define a gem or retrieve defined gem.

Parameters:

  • name

    Name of gem.

  • directory_or_path (defaults to: nil)

    Development::Directory or String describing path.

Returns:



87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
# File 'lib/development.rb', line 87

def self.gem( name, directory_or_path = nil )

  gem_require_name = name.to_s.gsub( '/', '-' )

  name = gem_require_name.to_sym

  if gem_instance = @gems[ name ]
    if directory_or_path
      gem_instance.set_directory( directory_or_path )
    end
  else
    @gems[ name ] = gem_instance = Gem.new( name, directory_or_path )
  end
  
  return gem_instance

end

.gemsHash{Symbol=>Array<::Development::Gem>}

Get hash of gems.

Returns:

  • (Hash{Symbol=>Array<::Development::Gem>})

    Hash of gemsets and their gem or gemset members.



133
134
135
136
137
# File 'lib/development.rb', line 133

def self.gems
  
  return @gems
  
end

.self.gemset(name, gem_or_gemset, ...) ⇒ ::Development::Gemset

Define a gem or retrieve defined gem.

Parameters:

  • name

    Name of gemset.

  • gem_or_gemset

    Gem or Gemset name or instance.

Returns:



158
159
160
161
162
163
164
165
166
167
168
169
170
# File 'lib/development.rb', line 158

def self.gemset( name, *gems_or_gemsets )

  name = name.to_sym
  
  unless gemset_instance = @gemsets[ name ]
    @gemsets[ name ] = gemset_instance = Gemset.new( name )
  end
  
  gemset_instance.add( *gems_or_gemsets )
  
  return gemset_instance
  
end

.gemsetsHash{Symbol=>Array<::Development::Gemset>}

Get hash of gemsets and their gem or gemset members.

Returns:



200
201
202
203
204
# File 'lib/development.rb', line 200

def self.gemsets
  
  return @gemsets
  
end

.general_load_path(path) ⇒ ::Development

Define general load path.

Parameters:

  • path

    String describing directory path.

Returns:



291
292
293
294
295
296
297
# File 'lib/development.rb', line 291

def self.general_load_path( path )
  
  @general_load_paths.push( ::File.expand_path( path ) )
  
  return self
  
end

.general_load_pathsArray<String>

Get Array of paths that will be used for general loading purposes if a specific gem path is not given.

Returns:

  • (Array<String>)

    Paths to be used for general loading purposes.



329
330
331
332
333
# File 'lib/development.rb', line 329

def self.general_load_paths

  return @general_load_paths

end

.get_directory(name) ⇒ ::Development::Directory

Return directory with name.

Parameters:

  • name

    Name of directory to return.

Returns:



257
258
259
260
261
# File 'lib/development.rb', line 257

def self.get_directory( name )
  
  return @directories[ name.to_sym ]
  
end

.get_gem(name) ⇒ ::Development::Gem

Retrieve defined gem.

Parameters:

  • name

    Name of gem.

Returns:



118
119
120
121
122
# File 'lib/development.rb', line 118

def self.get_gem( name )
  
  return @gems[ name.to_sym ]
  
end

.get_gemset(name) ⇒ ::Development::Gemset

Retrieve defined gemset.

Parameters:

  • name

    Name of gemset.

Returns:



185
186
187
188
189
# File 'lib/development.rb', line 185

def self.get_gemset( name )
  
  return @gemsets[ name.to_sym ]
  
end

.initializeDevelopment

Initialize internal tracking variables.

Returns:



27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
# File 'lib/development.rb', line 27

def self.initialize

  @enable_for_all = false
  
  @directories = { }
  
  @gems = { }
  @gemsets = { }

  @general_load_paths = [ ]

  @loaded_gems = { }

  return self
  
end

.load_configuration_file(path) ⇒ ::Development

Load Development configuration file.

Parameters:

  • path

    Location of configuration file.

Returns:



731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
# File 'lib/development.rb', line 731

def self.load_configuration_file( path )
  
  absolute_path = ::File.expand_path( path )
  
  if ::File.exists?( absolute_path )
    ::Development::ConfigurationInterface.module_eval do
      alias_method :gem, :gem_method
    end
    load( absolute_path )
    ::Development::ConfigurationInterface.module_eval do
      remove_method :gem
    end
  end
  
  return self
  
end

.load_gem_in_path(load_path, gem_require_name) ⇒ true, false

Load gem from gem directory path. Assumes gem is present in path.

Parameters:

  • load_path

    Path where gem directory might be located.

  • gem_require_name

    Name of gem. Assumes gem/subname is used rather than gem-subname.

Returns:

  • (true, false)

    Whether gem name is present.



711
712
713
714
715
716
# File 'lib/development.rb', line 711

def self.load_gem_in_path( load_path, gem_require_name )
      
  gem_require_file = ::File.join( load_path, 'lib', gem_directory_name ) + '.rb'
  require_relative( ::File.expand_path( gem_require_file ) )
  
end

.load_gem_instance(gem_instance, gem_directory_name, gem_require_name) ⇒ ::Development

Load gem using configuration information provides by gem instance.

Parameters:

  • gem_instance

    Gem instance.

  • gem_directory_name

    Gem directory in hyphenated gem-subgem format.

  • gem_require_name

    Gem name in slashed gem/subgem format.

Returns:



556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
# File 'lib/development.rb', line 556

def self.load_gem_instance( gem_instance, gem_directory_name, gem_require_name )
  
  gem_location = gem_instance.directory.path

  if path_is_gem_directory?( gem_location, gem_require_name )
    # already set
  elsif path_contains_gem_directory?( gem_location, gem_directory_name, gem_require_name )
    gem_location = ::File.join( gem_location, gem_directory_name )
  end

  load_gem_in_path( gem_location, gem_require_name )
  @loaded_gems[ gem_require_name.to_sym ] = true
  
  return self
  
end

.path_contains_gem_directory?(load_path, gem_directory_name, gem_require_name) ⇒ true, false

Query whether gem name is present at load path, meaning load path specifies the directory holding gem directory.

Parameters:

  • load_path

    Path where gem directory might be located.

  • gem_directory_name

    Name of gem. Assumes gem-subname is used rather than gem/subname.

  • gem_require_name

    Name of gem. Assumes gem/subname is used rather than gem-subname.

Returns:

  • (true, false)

    Whether gem name is present.



675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
# File 'lib/development.rb', line 675

def self.path_contains_gem_directory?( load_path, gem_directory_name, gem_require_name )
  
  exists_at_load_path = false
  
  gem_path = ::File.join( load_path, gem_directory_name )
  
  gem_require_file = ::File.join( gem_path, 'lib', gem_require_name ) + '.rb'

  if ::Dir.exist?( ::File.expand_path( gem_path ) ) and 
     ::File.exist?( ::File.expand_path( gem_require_file ) )
    
    exists_at_load_path = true
  
  end
  
  return exists_at_load_path
  
end

.path_is_gem_directory?(load_path, gem_require_name) ⇒ true, false

Query whether gem name is present in load path, meaning load path specifies the gem directory.

Parameters:

  • load_path

    Path where gem directory might be located.

  • gem_require_name

    Name of gem. Assumes gem-subname is used rather than gem/subname.

Returns:

  • (true, false)

    Whether gem name is present.



640
641
642
643
644
645
646
647
648
649
650
651
652
# File 'lib/development.rb', line 640

def self.path_is_gem_directory?( load_path, gem_require_name )
  
  exists_at_load_path = false
  
  gem_require_file = ::File.join( load_path, 'lib', gem_require_name ) + '.rb'

  if ::File.exist?( ::File.expand_path( gem_require_file ) )
    exists_at_load_path = true
  end
  
  return exists_at_load_path
  
end

.remove_general_load_path(path) ⇒ ::Development

Remove general load path.

Parameters:

  • path

    String describing directory path.

Returns:



312
313
314
315
316
317
318
# File 'lib/development.rb', line 312

def self.remove_general_load_path( path )
  
  @general_load_paths.delete( ::File.expand_path( path ) )
  
  return self
  
end

.require(gem_name_or_path) ⇒ true, false

Filters requires to match configuration specifications for loading development paths instead of production gems.

Parameters:

Returns:

  • (true, false)

    Whether Development handled gem_name_or_path (true) or processing should continue (false).



492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
# File 'lib/development.rb', line 492

def self.require( gem_name_or_path )
  
  did_load = nil

  # if our path ends with an extension we are not requiring a gem and thus not responsible for managing it
  if ::File.extname( gem_name_or_path ).empty?

    gem_directory_name = gem_name_or_path.to_s.gsub( '/', '-' )
    gem_require_name = gem_name_or_path.to_s.gsub( '-', '/' )
    
    gem_reference_name = gem_directory_name.to_sym
    
    if @loaded_gems.has_key?( gem_reference_name )
      
      did_load = false

    else

      # look for gem name in enabled gems/gemsets
      if gem_instance = @gems[ gem_reference_name ]

        if gem_instance.enabled?
          load_gem_instance( gem_instance, gem_directory_name, gem_require_name )
          did_load = true
        elsif @enable_for_all && ! gem_instance.disabled?
          did_load = attempt_load_from_general_load_paths( gem_directory_name, gem_require_name )
        end
      
      # otherwise see if we perform general loading
      end
      
      if ! did_load and @enable_for_all
        attempt_load_from_general_load_paths( gem_directory_name, gem_require_name )
      end
      
    end
    
  end
  
  return did_load
  
end

Instance Method Details

#loaded?(gem_name) ⇒ true, false

Query whether gem was loaded via Development rather than standard require.

Parameters:

  • gem_name

    Name of gem.

Returns:

  • (true, false)

    Whether gem was loaded via Development.



465
466
467
468
469
470
471
# File 'lib/development.rb', line 465

def loaded?( gem_name )
  
  gem_require_name = gem_name.to_s.gsub( '/', '-' )
  
  return @loaded_gems.has_key?( gem_require_name.to_sym )
  
end