Create a gist now

Instantly share code, notes, and snippets.

What would you like to do?
ruby plugin
from shutil import rmtree
from os import makedirs, environ
from os.path import exists, join, abspath
from snapcraft import BasePlugin
from snapcraft.sources import Tar
class RubyPlugin(BasePlugin):
@classmethod
def schema(cls):
schema = super().schema()
schema['properties']['ruby-version'] = {
'type': 'string',
'default': "2.3.1"
}
schema['properties']['gems'] = {
'type': 'array',
'minitems': 1,
'uniqueItems': True,
'items': {
'type': 'string'
},
'default': []
}
return schema
@classmethod
def get_pull_properties(cls):
# Inform Snapcraft of the properties associated with pulling. If these
# change in the YAML Snapcraft will consider the build step dirty.
return ['ruby-version']
def __init__(self, name, options, project):
super().__init__(name, options, project)
self._ruby_version = self.options.ruby_version
self._rubylib = join(self.installdir, 'lib', 'ruby')
self._ruby_dir = join(self.partdir, 'ruby')
self._gem_path = join(self._rubylib, 'gems', self._ruby_version, 'gems')
self._gem_home = self._gem_path
self._ruby_download_url = \
('https://cache.ruby-lang.org/pub/ruby/ruby-%s.tar.gz' % \
self.options.ruby_version)
self._ruby_tar = Tar(self._ruby_download_url, self._ruby_dir)
self._gems = self.options.gems + ['bundler']
pkgs = ['gcc', 'g++', 'make', 'zlib1g-dev',
'libssl-dev', 'libreadline-dev']
for pkg in pkgs:
self.build_packages.append(pkg)
def pull(self):
super().pull()
makedirs(self._ruby_dir, exist_ok=True)
self._ruby_tar.download()
def build(self):
super().build()
self._ruby_install(builddir=self._ruby_dir)
self._gem_install()
self._bundle_install()
def _env(self):
"""Ruby env vars."""
env = environ.copy()
env['RUBYLIB'] = self._rubylib
env['GEM_PATH'] = self._gem_path
env['GEM_HOME'] = self._gem_home
return env
def _ruby_install(self, builddir):
self._ruby_tar.provision(
builddir, clean_target=False, keep_tarball=True)
self.run(['./configure', '--disable-install-rdoc', '--prefix=/'], cwd=builddir)
self.run(['make', '-j{}'.format(self.parallel_build_count)], cwd=builddir)
self.run(['make', 'install', 'DESTDIR={}'.format(self.installdir)], cwd=builddir)
def _gem_install(self):
gem_install = ['gem', 'install']
for gem in self._gems:
self.run(gem_install + [gem], env=self._env())
def _bundle_install(self):
bundle_install = ['bundle', 'install']
if exists(join(rootdir, 'Gemfile')):
self.run(bundle_install, env=self._env())
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment