rake_factory 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (47) hide show
  1. checksums.yaml +7 -0
  2. data/.circleci/config.yml +56 -0
  3. data/.circleci/gpg.private.enc +0 -0
  4. data/.envrc +5 -0
  5. data/.git-crypt/.gitattributes +4 -0
  6. data/.git-crypt/keys/default/0/41D2606F66C3FF28874362B61A16916844CE9D82.gpg +0 -0
  7. data/.git-crypt/keys/default/0/837D1812341A8C7F3E556D33623A196DE10A7326.gpg +0 -0
  8. data/.gitattributes +1 -0
  9. data/.gitignore +32 -0
  10. data/.rspec +2 -0
  11. data/.ruby-version +1 -0
  12. data/CODE_OF_CONDUCT.md +75 -0
  13. data/Gemfile +4 -0
  14. data/Gemfile.lock +60 -0
  15. data/LICENSE.txt +21 -0
  16. data/README.md +70 -0
  17. data/Rakefile +24 -0
  18. data/TODO.md +2 -0
  19. data/bin/console +14 -0
  20. data/bin/setup +8 -0
  21. data/config/secrets/.unlocked +1 -0
  22. data/config/secrets/ci/encryption.passphrase +1 -0
  23. data/config/secrets/ci/gpg.private +105 -0
  24. data/config/secrets/ci/gpg.public +51 -0
  25. data/config/secrets/ci/ssh.private +51 -0
  26. data/config/secrets/ci/ssh.public +1 -0
  27. data/config/secrets/rubygems/credentials +2 -0
  28. data/go +56 -0
  29. data/lib/rake_factory/actions.rb +11 -0
  30. data/lib/rake_factory/defaults.rb +56 -0
  31. data/lib/rake_factory/exceptions.rb +4 -0
  32. data/lib/rake_factory/parameter.rb +61 -0
  33. data/lib/rake_factory/parameter_set.rb +48 -0
  34. data/lib/rake_factory/parameter_view.rb +21 -0
  35. data/lib/rake_factory/parameters.rb +14 -0
  36. data/lib/rake_factory/task.rb +85 -0
  37. data/lib/rake_factory/version.rb +3 -0
  38. data/lib/rake_factory.rb +5 -0
  39. data/rake_factory.gemspec +37 -0
  40. data/scripts/ci/common/configure-git.sh +8 -0
  41. data/scripts/ci/common/configure-rubygems.sh +16 -0
  42. data/scripts/ci/common/install-git-crypt.sh +8 -0
  43. data/scripts/ci/common/install-gpg-key.sh +19 -0
  44. data/scripts/ci/steps/prerelease.sh +16 -0
  45. data/scripts/ci/steps/release.sh +18 -0
  46. data/scripts/ci/steps/test.sh +12 -0
  47. metadata +188 -0
data/go ADDED
@@ -0,0 +1,56 @@
1
+ #!/usr/bin/env bash
2
+
3
+ [ -n "$GO_DEBUG" ] && set -x
4
+ set -e
5
+
6
+ project_dir="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
7
+
8
+ verbose="no"
9
+ skip_checks="no"
10
+ offline="no"
11
+
12
+ missing_dependency="no"
13
+
14
+ [ -n "$GO_DEBUG" ] && verbose="yes"
15
+ [ -n "$GO_SKIP_CHECKS" ] && skip_checks="yes"
16
+ [ -n "$GO_OFFLINE" ] && offline="yes"
17
+
18
+
19
+ if [[ "$skip_checks" = "no" ]]; then
20
+ echo "Checking for system dependencies."
21
+ ruby_version="$(cat "$project_dir"/.ruby-version)"
22
+ if ! type ruby >/dev/null 2>&1 || ! ruby -v | grep -q "$ruby_version"; then
23
+ echo "This codebase requires Ruby $ruby_version."
24
+ missing_dependency="yes"
25
+ fi
26
+
27
+ if [[ "$missing_dependency" = "yes" ]]; then
28
+ echo "Please install missing dependencies to continue."
29
+ exit 1
30
+ fi
31
+
32
+ echo "All system dependencies present. Continuing."
33
+ fi
34
+
35
+ if [[ "$offline" = "no" ]]; then
36
+ echo "Installing bundler."
37
+ if [[ "$verbose" = "yes" ]]; then
38
+ gem install --no-document bundler
39
+ else
40
+ gem install --no-document bundler > /dev/null
41
+ fi
42
+
43
+ echo "Installing ruby dependencies."
44
+ if [[ "$verbose" = "yes" ]]; then
45
+ bundle install
46
+ else
47
+ bundle install > /dev/null
48
+ fi
49
+ fi
50
+
51
+ echo "Starting rake."
52
+ if [[ "$verbose" = "yes" ]]; then
53
+ time bundle exec rake --verbose "$@"
54
+ else
55
+ time bundle exec rake "$@"
56
+ fi
@@ -0,0 +1,11 @@
1
+ module RakeFactory
2
+ module Actions
3
+ def actions
4
+ @actions ||= []
5
+ end
6
+
7
+ def action(&action_block)
8
+ actions << action_block
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,56 @@
1
+ require 'active_support'
2
+ require 'active_support/core_ext/string/inflections'
3
+
4
+ require_relative 'parameters'
5
+
6
+ module RakeFactory
7
+ module Defaults
8
+ include Parameters
9
+
10
+ def inherited(inheritor)
11
+ super(inheritor)
12
+ inheritor.class_eval do
13
+ parameter(:name,
14
+ configurable: false,
15
+ transform: lambda { |n| n.to_sym })
16
+ parameter(:argument_names,
17
+ configurable: false,
18
+ default: [])
19
+ parameter(:prerequisites,
20
+ configurable: false,
21
+ default: [])
22
+ parameter(:order_only_prerequisites,
23
+ configurable: false,
24
+ default: [])
25
+ parameter(:description,
26
+ configurable: false)
27
+
28
+ unless inheritor.name.nil?
29
+ default_name inheritor.name.demodulize.underscore
30
+ end
31
+ end
32
+ end
33
+
34
+ def default_name(name)
35
+ parameter_set.update_default_for(:name, name)
36
+ end
37
+
38
+ def default_argument_names(argument_names)
39
+ parameter_set.update_default_for(:argument_names, argument_names)
40
+ end
41
+
42
+ def default_prerequisites(prerequisites)
43
+ parameter_set.update_default_for(:prerequisites, prerequisites)
44
+ end
45
+
46
+ def default_order_only_prerequisites(order_only_prerequisites)
47
+ parameter_set
48
+ .update_default_for(
49
+ :order_only_prerequisites, order_only_prerequisites)
50
+ end
51
+
52
+ def default_description(description)
53
+ parameter_set.update_default_for(:description, description)
54
+ end
55
+ end
56
+ end
@@ -0,0 +1,4 @@
1
+ module RakeFactory
2
+ class RequiredParameterUnset < ::StandardError
3
+ end
4
+ end
@@ -0,0 +1,61 @@
1
+ module RakeFactory
2
+ class Parameter
3
+ attr_reader(
4
+ :name,
5
+ :default,
6
+ :required,
7
+ :configurable,
8
+ :transform)
9
+ attr_writer(:default)
10
+
11
+ def initialize(name, options)
12
+ @name = name
13
+ @default = options[:default] || nil
14
+ @required = options[:required] || false
15
+ @configurable =
16
+ options[:configurable].nil? ? true : !!options[:configurable]
17
+ @transform = options[:transform] || lambda { |x| x }
18
+ end
19
+
20
+ def writer_method
21
+ "#{name}="
22
+ end
23
+
24
+ def reader_method
25
+ name
26
+ end
27
+
28
+ def instance_variable
29
+ "@#{name}"
30
+ end
31
+
32
+ def define_on(klass)
33
+ parameter = self
34
+ klass.class_eval do
35
+ attr_reader parameter.reader_method
36
+ define_method parameter.writer_method do |value|
37
+ instance_variable_set(
38
+ parameter.instance_variable,
39
+ parameter.transform.call(value))
40
+ end
41
+ end
42
+ end
43
+
44
+ def apply_default_to(instance)
45
+ instance.send(writer_method, @default) unless @default.nil?
46
+ end
47
+
48
+ def configurable?
49
+ @configurable
50
+ end
51
+
52
+ def dissatisfied_by?(instance)
53
+ value = instance.send(reader_method)
54
+ @required && value.nil?
55
+ end
56
+
57
+ def satisfied_by?(instance)
58
+ !dissatisfied_by?(instance)
59
+ end
60
+ end
61
+ end
@@ -0,0 +1,48 @@
1
+ require_relative 'parameter'
2
+ require_relative 'exceptions'
3
+
4
+ module RakeFactory
5
+ class ParameterSet
6
+ def initialize
7
+ @parameter_set = {}
8
+ end
9
+
10
+ def add(name, options)
11
+ parameter = Parameter.new(name, options)
12
+ @parameter_set[parameter.name] = parameter
13
+ parameter
14
+ end
15
+
16
+ def find(name)
17
+ @parameter_set[name.to_sym]
18
+ end
19
+
20
+ def each(&block)
21
+ @parameter_set.values.each(&block)
22
+ end
23
+
24
+ def update_default_for(name, value)
25
+ find(name).default = value
26
+ end
27
+
28
+ def apply_defaults_to(instance)
29
+ @parameter_set.values.each do |parameter|
30
+ parameter.apply_default_to(instance)
31
+ end
32
+ end
33
+
34
+ def enforce_requirements_on(instance)
35
+ dissatisfied = @parameter_set.values.reject do |parameter|
36
+ parameter.satisfied_by?(instance)
37
+ end
38
+ unless dissatisfied.empty?
39
+ names = dissatisfied.map(&:name)
40
+ names_string = names.join(',')
41
+ pluralisation_string = names.length > 1 ? 's' : ''
42
+
43
+ raise RequiredParameterUnset,
44
+ "Required parameter#{pluralisation_string} #{names_string} unset."
45
+ end
46
+ end
47
+ end
48
+ end
@@ -0,0 +1,21 @@
1
+ module RakeFactory
2
+ class ParameterView
3
+ attr_reader(:task)
4
+
5
+ def initialize(task)
6
+ self.instance_eval do
7
+ task.class.parameter_set.each do |parameter|
8
+ define_singleton_method parameter.reader_method do
9
+ task.send(parameter.reader_method)
10
+ end
11
+
12
+ if parameter.configurable?
13
+ define_singleton_method parameter.writer_method do |value|
14
+ task.send(parameter.writer_method, value)
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,14 @@
1
+ require_relative 'parameter_set'
2
+
3
+ module RakeFactory
4
+ module Parameters
5
+ def parameter_set
6
+ @parameter_set ||= ParameterSet.new
7
+ end
8
+
9
+ def parameter(name, options = {})
10
+ parameter = parameter_set.add(name, options)
11
+ parameter.define_on(self)
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,85 @@
1
+ require 'rake/tasklib'
2
+
3
+ require_relative 'parameters'
4
+ require_relative 'parameter_view'
5
+ require_relative 'actions'
6
+ require_relative 'defaults'
7
+
8
+ module RakeFactory
9
+ class Task < ::Rake::TaskLib
10
+ extend Parameters
11
+ extend Actions
12
+ extend Defaults
13
+
14
+ attr_accessor(:configuration_block)
15
+
16
+ def self.inherited(inheritor)
17
+ super(inheritor)
18
+ inheritor.singleton_class.class_eval do
19
+ define_method :define do |*args, &block|
20
+ inheritor.new(*args, &block).define_on(Rake.application)
21
+ end
22
+ end
23
+ end
24
+
25
+ def initialize(*args, &configuration_block)
26
+ setup_parameter_defaults
27
+ process_arguments(args)
28
+ process_configuration_block(configuration_block)
29
+ end
30
+
31
+ def setup_parameter_defaults
32
+ self.class.parameter_set.apply_defaults_to(self)
33
+ end
34
+
35
+ def process_arguments(args)
36
+ opts = args.first || {}
37
+ opts.each { |key, value| set_if_value_present(key, value) }
38
+ end
39
+
40
+ def process_configuration_block(configuration_block)
41
+ set_if_value_present(:configuration_block, configuration_block)
42
+ end
43
+
44
+ def invoke_configuration_block(args)
45
+ if configuration_block
46
+ view = ParameterView.new(self)
47
+ configuration_block.call(
48
+ *[view, args].slice(0, configuration_block.arity))
49
+ end
50
+ end
51
+
52
+ def check_parameter_requirements
53
+ self.class.parameter_set.enforce_requirements_on(self)
54
+ end
55
+
56
+ def invoke_actions(args)
57
+ self.class.actions.each do |action|
58
+ action.call(*[self, args].slice(0, action.arity))
59
+ end
60
+ end
61
+
62
+ def define_on(application)
63
+ task = application.define_task(
64
+ Rake::Task,
65
+ name,
66
+ argument_names => prerequisites,
67
+ order_only: order_only_prerequisites
68
+ ) do |_, args|
69
+ invoke_configuration_block(args)
70
+ check_parameter_requirements
71
+ invoke_actions(args)
72
+ end
73
+ task.add_description(description)
74
+ self
75
+ end
76
+
77
+ private
78
+
79
+ def set_if_value_present(key, value)
80
+ if self.respond_to?("#{key}=") && !value.nil?
81
+ self.send("#{key}=", value)
82
+ end
83
+ end
84
+ end
85
+ end
@@ -0,0 +1,3 @@
1
+ module RakeFactory
2
+ VERSION = '0.0.1'
3
+ end
@@ -0,0 +1,5 @@
1
+ require 'rake_factory/version'
2
+ require 'rake_factory/task'
3
+
4
+ module RakeFactory
5
+ end
@@ -0,0 +1,37 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'rake_factory/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = 'rake_factory'
8
+ spec.version = RakeFactory::VERSION
9
+ spec.authors = ['Toby Clemson']
10
+ spec.email = ['tobyclemson@gmail.com']
11
+
12
+ spec.summary =
13
+ 'Base classes and modules to aid in creating custom rake tasks.'
14
+ spec.description =
15
+ 'Provides base classes and modules to allow declarative definition of ' +
16
+ 'rake tasks.'
17
+ spec.homepage = 'https://github.com/infrablocks/rake_factory'
18
+ spec.license = 'MIT'
19
+
20
+ spec.files = `git ls-files -z`.split("\x0").reject do |f|
21
+ f.match(%r{^(test|spec|features)/})
22
+ end
23
+ spec.bindir = 'exe'
24
+ spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
25
+ spec.require_paths = ['lib']
26
+
27
+ spec.required_ruby_version = '>= 2.5.1'
28
+
29
+ spec.add_dependency 'rake', '~> 13.0'
30
+ spec.add_dependency 'activesupport', '~> 5.2'
31
+
32
+ spec.add_development_dependency 'bundler', '~> 2.0'
33
+ spec.add_development_dependency 'rspec', '~> 3.9'
34
+ spec.add_development_dependency 'gem-release', '~> 2.0'
35
+ spec.add_development_dependency 'fakefs', '~> 0.18'
36
+ spec.add_development_dependency 'simplecov', '~> 0.16'
37
+ end
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env bash
2
+
3
+ [ -n "$DEBUG" ] && set -x
4
+ set -e
5
+ set -o pipefail
6
+
7
+ git config --global user.email "circleci@infrablocks.io"
8
+ git config --global user.name "Circle CI"
@@ -0,0 +1,16 @@
1
+ #!/usr/bin/env bash
2
+
3
+ [ -n "$DEBUG" ] && set -x
4
+ set -e
5
+ set -o pipefail
6
+
7
+ SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
8
+ PROJECT_DIR="$( cd "$SCRIPT_DIR/../../.." && pwd )"
9
+
10
+ cd "$PROJECT_DIR"
11
+
12
+ git crypt unlock
13
+
14
+ mkdir -p ~/.gem
15
+ cp config/secrets/rubygems/credentials ~/.gem/credentials
16
+ chmod 0600 ~/.gem/credentials
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env bash
2
+
3
+ [ -n "$DEBUG" ] && set -x
4
+ set -e
5
+ set -o pipefail
6
+
7
+ apt-get update
8
+ apt-get install -y --no-install-recommends git ssh git-crypt
@@ -0,0 +1,19 @@
1
+ #!/usr/bin/env bash
2
+
3
+ [ -n "$DEBUG" ] && set -x
4
+ set -e
5
+ set -o pipefail
6
+
7
+ SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
8
+ PROJECT_DIR="$( cd "$SCRIPT_DIR/../../.." && pwd )"
9
+
10
+ cd "$PROJECT_DIR"
11
+
12
+ set +e
13
+ openssl version
14
+ openssl aes-256-cbc \
15
+ -d \
16
+ -md sha1 \
17
+ -in ./.circleci/gpg.private.enc \
18
+ -k "${ENCRYPTION_PASSPHRASE}" | gpg --import -
19
+ set -e
@@ -0,0 +1,16 @@
1
+ #!/usr/bin/env bash
2
+
3
+ [ -n "$DEBUG" ] && set -x
4
+ set -e
5
+ set -o pipefail
6
+
7
+ SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
8
+ PROJECT_DIR="$( cd "$SCRIPT_DIR/../../.." && pwd )"
9
+
10
+ cd "$PROJECT_DIR"
11
+
12
+ ./go version:bump[pre]
13
+ ./go release
14
+
15
+ git status
16
+ git push
@@ -0,0 +1,18 @@
1
+ #!/usr/bin/env bash
2
+
3
+ [ -n "$DEBUG" ] && set -x
4
+ set -e
5
+ set -o pipefail
6
+
7
+ SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
8
+ PROJECT_DIR="$( cd "$SCRIPT_DIR/../../.." && pwd )"
9
+
10
+ cd "$PROJECT_DIR"
11
+
12
+ git pull
13
+
14
+ ./go version:bump[minor]
15
+ ./go release
16
+
17
+ git status
18
+ git push
@@ -0,0 +1,12 @@
1
+ #!/usr/bin/env bash
2
+
3
+ [ -n "$DEBUG" ] && set -x
4
+ set -e
5
+ set -o pipefail
6
+
7
+ SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
8
+ PROJECT_DIR="$( cd "$SCRIPT_DIR/../../.." && pwd )"
9
+
10
+ cd "$PROJECT_DIR"
11
+
12
+ ./go spec