Class: FPM::Package::Virtualenv

Inherits:
FPM::Package show all
Defined in:
lib/fpm/package/virtualenv.rb

Overview

Support for python virtualenv packages.

This supports input, but not output.

Instance Attribute Summary

Attributes inherited from FPM::Package

#architecture, #attributes, #attrs, #category, #config_files, #conflicts, #dependencies, #description, #directories, #epoch, #iteration, #license, #maintainer, #name, #provides, #replaces, #scripts, #url, #vendor, #version

Instance Method Summary collapse

Methods inherited from FPM::Package

apply_options, #build_path, #cleanup, #cleanup_build, #cleanup_staging, #convert, #converted_from, default_attributes, #edit_file, #files, inherited, #initialize, option, #output, #script, #staging_path, #to_s, #type, type, types

Methods included from Util

#copied_entries, #copy_entry, #copy_metadata, #default_shell, #expand_pessimistic_constraints, #logger, #mknod_w, #program_exists?, #program_in_path?, #safesystem, #safesystemout, #tar_cmd, #with

Constructor Details

This class inherits a constructor from FPM::Package

Instance Method Details

#input(package) ⇒ Object

Input a package.

`package` can look like `psutil==2.2.1` or `psutil`.


34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
# File 'lib/fpm/package/virtualenv.rb', line 34

def input(package)
  installdir = attributes[:virtualenv_install_location]
  m = /^([^=]+)==([^=]+)$/.match(package)
  package_version = nil

  if m
    package_name = m[1]
    package_version = m[2]
    self.version ||= package_version
  else
    package_name = package
    package_version = nil
  end

  virtualenv_name = package_name

  self.name ||= package_name

  if self.attributes[:virtualenv_fix_name?]
    self.name = [self.attributes[:virtualenv_package_name_prefix],
                 self.name].join("-")
  end

  virtualenv_folder =
    File.join(installdir,
              virtualenv_name)

  virtualenv_build_folder = build_path(virtualenv_folder)

  ::FileUtils.mkdir_p(virtualenv_build_folder)

  safesystem("virtualenv", virtualenv_build_folder)
  pip_exe = File.join(virtualenv_build_folder, "bin", "pip")
  python_exe = File.join(virtualenv_build_folder, "bin", "python")

  # Why is this hack here? It looks important, so I'll keep it in.
  safesystem(pip_exe, "install", "-U", "-i",
             attributes[:virtualenv_pypi],
             "pip", "distribute")
  safesystem(pip_exe, "uninstall", "-y", "distribute")

  safesystem(pip_exe, "install", "-i",
             attributes[:virtualenv_pypi],
             package)

  if package_version.nil?
    frozen = safesystemout(pip_exe, "freeze")
    package_version = frozen[/#{package}==[^=]+$/].split("==")[1].chomp!
    self.version ||= package_version
  end

  ::Dir[build_path + "/**/*"].each do |f|
    if ! File.world_readable? f
      File.lchmod(File.stat(f).mode | 444)
    end
  end

  ::Dir.chdir(virtualenv_build_folder) do
    safesystem("virtualenv-tools", "--update-path", virtualenv_folder)
  end

  if !attributes[:virtualenv_other_files_dir].nil?
    # Copy all files from other dir to build_path
    Find.find(attributes[:virtualenv_other_files_dir]) do |path|
      src = path.gsub(/^#{attributes[:virtualenv_other_files_dir]}/, '')
      dst = File.join(build_path, src)
      copy_entry(path, dst, preserve=true, remove_destination=true)
      (path, dst)
    end
  end

  remove_python_compiled_files virtualenv_build_folder

  # use dir to set stuff up properly, mainly so I don't have to reimplement
  # the chdir/prefix stuff special for tar.
  dir = convert(FPM::Package::Dir)

  if attributes[:chdir]
    dir.attributes[:chdir] = File.join(build_path, attributes[:chdir])
  else
    dir.attributes[:chdir] = build_path
  end

  cleanup_staging
  # Tell 'dir' to input "." and chdir/prefix will help it figure out the
  # rest.
  dir.input(".")
  @staging_path = dir.staging_path
  dir.cleanup_build

end