rake_tasklib 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.rb +5 -0
  30. data/lib/rake_factory/actions.rb +11 -0
  31. data/lib/rake_factory/defaults.rb +56 -0
  32. data/lib/rake_factory/exceptions.rb +4 -0
  33. data/lib/rake_factory/parameter.rb +61 -0
  34. data/lib/rake_factory/parameter_set.rb +48 -0
  35. data/lib/rake_factory/parameter_view.rb +21 -0
  36. data/lib/rake_factory/parameters.rb +14 -0
  37. data/lib/rake_factory/task.rb +85 -0
  38. data/lib/rake_factory/version.rb +3 -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
@@ -0,0 +1,51 @@
1
+ -----BEGIN PGP PUBLIC KEY BLOCK-----
2
+
3
+ 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
49
+ wJ+Igj9ZPECXt3c8Ne/Xi2sO
50
+ =wZdG
51
+ -----END PGP PUBLIC KEY BLOCK-----
@@ -0,0 +1,51 @@
1
+ -----BEGIN RSA PRIVATE KEY-----
2
+ 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
51
+ -----END RSA PRIVATE KEY-----
@@ -0,0 +1 @@
1
+ ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQDbx7zpqZd9cA0GP+MruC9PRHJKQo0VBnvlxIB7GISSxechSQ0ZrSgvvzLkSDm8ztbvg9CL1KBct3Mf7H4njgieQx6pjWDO8I735Ncj+bhPvkb7O283xaZgUzO5VEBA75rSSZr+0GOhZdYRLfExCf+6TrkC6cqXIBYlCbjZR6ccQTomQY9vyntzIqE7Ki1ICXYUVM8OLgre3uzp4MqOQdqci1rwG7mQ66c3tjoNp0dQORaKMGxRwAweGQhiF4sT4+k9hLfiSLevJmTRmRBAUuB/T6Fuk0k3GVasscwArHkDBQ9/awPzn6zKkOlk9coJsXbLPkkKe2aNuSyGxR+zrR30liqDIPo0lawUbz2RxuZU0ZhV79gzURoxiG1hFTo7nqYy9C+iCE5CxFzXst5IRwUk1o3oIJvCMdtozvnSrDkbiMlUbsdb3FIAaL84BDnyZ6C6V4mAOrWxC71Lz62XQ3VQwLvnr+qMnqseVidQe47TAmtwD1DlUwiId1AwmHXgMeel3+khylg2J+TYCaM2uu0lgwZ8IbHDxTLcy5Soa+BevM3T9+xvo8/tPVXAzLyevfQTo6ssw5JE8ZSPPwzUYipC7VPNXfME7FpE461ZaEcNHDghk28gxLEwM56hFCam5VI0+4/bc+okEl4m6M1b1CUxFh2tBnutPUaj6SOfGOHYbw== maintainers@infrablocks.io
@@ -0,0 +1,2 @@
1
+ ---
2
+ :rubygems_api_key: 2937a6dcdc84dd7685848a67da4c394c
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,5 @@
1
+ require 'rake_factory/version'
2
+ require 'rake_factory/task'
3
+
4
+ module RakeFactory
5
+ end
@@ -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