rake_tasklib 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.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