rake_factory 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
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