kamaze-project 1.0.0

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 (106) hide show
  1. checksums.yaml +7 -0
  2. data/.yardopts +18 -0
  3. data/bin/plop +5 -0
  4. data/lib/kamaze-project.rb +39 -0
  5. data/lib/kamaze/project.rb +155 -0
  6. data/lib/kamaze/project/boot/core_ext.rb +16 -0
  7. data/lib/kamaze/project/boot/listen.rb +38 -0
  8. data/lib/kamaze/project/concern.rb +13 -0
  9. data/lib/kamaze/project/concern/cli.rb +53 -0
  10. data/lib/kamaze/project/concern/cli/with_exit_on_failure.rb +36 -0
  11. data/lib/kamaze/project/concern/env.rb +63 -0
  12. data/lib/kamaze/project/concern/helper.rb +20 -0
  13. data/lib/kamaze/project/concern/mode.rb +19 -0
  14. data/lib/kamaze/project/concern/observable.rb +132 -0
  15. data/lib/kamaze/project/concern/sh.rb +91 -0
  16. data/lib/kamaze/project/concern/tasks.rb +55 -0
  17. data/lib/kamaze/project/concern/tools.rb +27 -0
  18. data/lib/kamaze/project/config.rb +58 -0
  19. data/lib/kamaze/project/core_ext/object.rb +27 -0
  20. data/lib/kamaze/project/core_ext/pp.rb +28 -0
  21. data/lib/kamaze/project/debug.rb +136 -0
  22. data/lib/kamaze/project/dsl.rb +16 -0
  23. data/lib/kamaze/project/dsl/definition.rb +43 -0
  24. data/lib/kamaze/project/dsl/setup.rb +11 -0
  25. data/lib/kamaze/project/helper.rb +63 -0
  26. data/lib/kamaze/project/helper/inflector.rb +44 -0
  27. data/lib/kamaze/project/helper/project.rb +34 -0
  28. data/lib/kamaze/project/helper/project/config.rb +25 -0
  29. data/lib/kamaze/project/observable.rb +20 -0
  30. data/lib/kamaze/project/observer.rb +37 -0
  31. data/lib/kamaze/project/resources/Vagrantfile +128 -0
  32. data/lib/kamaze/project/resources/config/tools.yml +15 -0
  33. data/lib/kamaze/project/struct.rb +34 -0
  34. data/lib/kamaze/project/tasks/cs.rb +23 -0
  35. data/lib/kamaze/project/tasks/cs/control.rb +17 -0
  36. data/lib/kamaze/project/tasks/cs/correct.rb +17 -0
  37. data/lib/kamaze/project/tasks/cs/pre_commit.rb +66 -0
  38. data/lib/kamaze/project/tasks/doc.rb +21 -0
  39. data/lib/kamaze/project/tasks/doc/watch.rb +41 -0
  40. data/lib/kamaze/project/tasks/gem.rb +14 -0
  41. data/lib/kamaze/project/tasks/gem/build.rb +34 -0
  42. data/lib/kamaze/project/tasks/gem/compile.rb +30 -0
  43. data/lib/kamaze/project/tasks/gem/gemspec.rb +20 -0
  44. data/lib/kamaze/project/tasks/gem/install.rb +32 -0
  45. data/lib/kamaze/project/tasks/gem/push.rb +27 -0
  46. data/lib/kamaze/project/tasks/misc/gitignore.rb +29 -0
  47. data/lib/kamaze/project/tasks/shell.rb +17 -0
  48. data/lib/kamaze/project/tasks/sources.rb +6 -0
  49. data/lib/kamaze/project/tasks/sources/license.rb +35 -0
  50. data/lib/kamaze/project/tasks/test.rb +16 -0
  51. data/lib/kamaze/project/tasks/vagrant.rb +71 -0
  52. data/lib/kamaze/project/tasks/version/edit.rb +16 -0
  53. data/lib/kamaze/project/tools.rb +18 -0
  54. data/lib/kamaze/project/tools/base_tool.rb +55 -0
  55. data/lib/kamaze/project/tools/console.rb +48 -0
  56. data/lib/kamaze/project/tools/console/output.rb +120 -0
  57. data/lib/kamaze/project/tools/console/output/buffer.rb +48 -0
  58. data/lib/kamaze/project/tools/gemspec.rb +33 -0
  59. data/lib/kamaze/project/tools/gemspec/builder.rb +99 -0
  60. data/lib/kamaze/project/tools/gemspec/concern.rb +13 -0
  61. data/lib/kamaze/project/tools/gemspec/concern/reading.rb +49 -0
  62. data/lib/kamaze/project/tools/gemspec/packager.rb +67 -0
  63. data/lib/kamaze/project/tools/gemspec/packer.rb +89 -0
  64. data/lib/kamaze/project/tools/gemspec/packer/command.rb +143 -0
  65. data/lib/kamaze/project/tools/gemspec/reader.rb +70 -0
  66. data/lib/kamaze/project/tools/gemspec/reader/decorator.rb +78 -0
  67. data/lib/kamaze/project/tools/gemspec/writer.rb +127 -0
  68. data/lib/kamaze/project/tools/gemspec/writer/dep_gen.rb +61 -0
  69. data/lib/kamaze/project/tools/gemspec/writer/dependency.rb +104 -0
  70. data/lib/kamaze/project/tools/git.rb +95 -0
  71. data/lib/kamaze/project/tools/git/hooks.rb +66 -0
  72. data/lib/kamaze/project/tools/git/hooks/base_hook.rb +33 -0
  73. data/lib/kamaze/project/tools/git/hooks/pre_commit.rb +81 -0
  74. data/lib/kamaze/project/tools/git/status.rb +101 -0
  75. data/lib/kamaze/project/tools/git/status/decorator.rb +39 -0
  76. data/lib/kamaze/project/tools/git/status/file.rb +180 -0
  77. data/lib/kamaze/project/tools/git/status/files_array.rb +39 -0
  78. data/lib/kamaze/project/tools/git/status/index.rb +77 -0
  79. data/lib/kamaze/project/tools/git/status/worktree.rb +19 -0
  80. data/lib/kamaze/project/tools/git/util.rb +35 -0
  81. data/lib/kamaze/project/tools/licenser.rb +197 -0
  82. data/lib/kamaze/project/tools/packager.rb +86 -0
  83. data/lib/kamaze/project/tools/packager/filesystem.rb +178 -0
  84. data/lib/kamaze/project/tools/packager/filesystem/operator.rb +83 -0
  85. data/lib/kamaze/project/tools/packager/filesystem/operator/utils.rb +77 -0
  86. data/lib/kamaze/project/tools/process_locker.rb +106 -0
  87. data/lib/kamaze/project/tools/rspec.rb +115 -0
  88. data/lib/kamaze/project/tools/rubocop.rb +128 -0
  89. data/lib/kamaze/project/tools/rubocop/arguments.rb +19 -0
  90. data/lib/kamaze/project/tools/rubocop/config.rb +43 -0
  91. data/lib/kamaze/project/tools/shell.rb +85 -0
  92. data/lib/kamaze/project/tools/vagrant.rb +182 -0
  93. data/lib/kamaze/project/tools/vagrant/composer.rb +88 -0
  94. data/lib/kamaze/project/tools/vagrant/composer/file.rb +79 -0
  95. data/lib/kamaze/project/tools/vagrant/remote.rb +79 -0
  96. data/lib/kamaze/project/tools/vagrant/shell.rb +102 -0
  97. data/lib/kamaze/project/tools/vagrant/writer.rb +81 -0
  98. data/lib/kamaze/project/tools/yardoc.rb +75 -0
  99. data/lib/kamaze/project/tools/yardoc/file.rb +55 -0
  100. data/lib/kamaze/project/tools/yardoc/watchable.rb +70 -0
  101. data/lib/kamaze/project/tools/yardoc/watcher.rb +106 -0
  102. data/lib/kamaze/project/tools_provider.rb +161 -0
  103. data/lib/kamaze/project/tools_provider/resolver.rb +42 -0
  104. data/lib/kamaze/project/version.rb +104 -0
  105. data/lib/kamaze/project/version.yml +17 -0
  106. metadata +321 -0
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: d3d3de9a01cef1fcc14728ff56abe9d82b60d7e6039e5610c1e043fcf653b2e9
4
+ data.tar.gz: 28434374dfe48306f3c76ba3ddbe2ebb6e4cee676296eabc5d4622953ff20acc
5
+ SHA512:
6
+ metadata.gz: 3f02d01bd1800a1eb8bd6b2da00739039963e132237c1ab18fd5d37286f5a420527c334b038674f94984bbab41b4d6984524343e9b364dcbdfbbaac03f91f531
7
+ data.tar.gz: ffc864e04d8bd36bf4b145f9c643dec12bee52f2361faacbc137210c9659e9dbbd40934611f4a42f7a65e04061eb03d45a0e0399968a576a388d96a5c8ba17f4
@@ -0,0 +1,18 @@
1
+ # vim: ft=sh
2
+
3
+ lib/**/*.rb \
4
+ --no-progress \
5
+ --markup-provider 'redcarpet' \
6
+ --markup 'markdown' \
7
+ --charset 'utf-8' \
8
+ --protected --private --embed-mixins \
9
+ --tag type:'type' --hide-tag 'type' \
10
+ --readme README.md \
11
+ --exclude 'lib/kamaze/project/tasks/.*' \
12
+ --exclude 'lib/kamaze/project/boot/.*' \
13
+ --exclude '_flymake\\.rb$' \
14
+ --exclude '/\\.#'
15
+
16
+ # Local Variables:
17
+ # mode: sh
18
+ # End:
@@ -0,0 +1,5 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'pp'
4
+
5
+ pp(ENV)
@@ -0,0 +1,39 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Copyright (C) 2017-2018 Dimitri Arrigoni <dimitri@arrigoni.me>
4
+ # License GPLv3+: GNU GPL version 3 or later
5
+ # <http://www.gnu.org/licenses/gpl.html>.
6
+ # This is free software: you are free to change and redistribute it.
7
+ # There is NO WARRANTY, to the extent permitted by law.
8
+
9
+ $LOAD_PATH.unshift(__dir__)
10
+
11
+ lock = Dir.chdir("#{__dir__}/..") do
12
+ [['gems.rb', 'gems.locked'], ['Gemfile', 'Gemfile.lock']]
13
+ .map { |m| Dir.glob(m).size >= 2 }
14
+ .include?(true)
15
+ end
16
+ mode = (ENV['PROJECT_MODE'] || lock ? 'development' : 'production').to_sym
17
+
18
+ if lock
19
+ require 'rubygems'
20
+ require 'bundler/setup'
21
+ end
22
+
23
+ if lock and :development == mode
24
+ require 'yaml'
25
+
26
+ unless YAML.safe_load(ENV['BOOTSNAP_DISABLE'].to_s)
27
+ require 'bootsnap'
28
+
29
+ Bootsnap.setup(
30
+ cache_dir: "#{__dir__}/../cache",
31
+ development_mode: true,
32
+ load_path_cache: true,
33
+ autoload_paths_cache: false,
34
+ disable_trace: true,
35
+ compile_cache_iseq: true,
36
+ compile_cache_yaml: true
37
+ )
38
+ end
39
+ end
@@ -0,0 +1,155 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Copyright (C) 2017-2018 Dimitri Arrigoni <dimitri@arrigoni.me>
4
+ # License GPLv3+: GNU GPL version 3 or later
5
+ # <http://www.gnu.org/licenses/gpl.html>.
6
+ # This is free software: you are free to change and redistribute it.
7
+ # There is NO WARRANTY, to the extent permitted by law.
8
+
9
+ require 'pathname'
10
+
11
+ # Base module (almost a namespace)
12
+ module Kamaze
13
+ # rubocop:disable Style/Documentation
14
+
15
+ class Project
16
+ module Concern
17
+ [nil, :env, :mode, :helper,
18
+ :tasks, :tools].each do |req|
19
+ require_relative "project/concern/#{req}".gsub(%r{/$}, '')
20
+ end
21
+ end
22
+
23
+ require_relative 'project/version'
24
+
25
+ VERSION = Version.new.freeze
26
+
27
+ # @see Kamaze::Project::Version
28
+ # @return [Object]
29
+ def version
30
+ subject.const_get('VERSION')
31
+ end
32
+ end
33
+
34
+ # rubocop:enable Style/Documentation
35
+ end
36
+
37
+ # Base namespace
38
+ module Kamaze
39
+ class << self
40
+ include Project::Concern::Helper
41
+
42
+ # Get an instance of project
43
+ #
44
+ # @return [Kamaze::Project]
45
+ def project(&block)
46
+ helper.get(:project).setup(&block)
47
+ end
48
+ end
49
+ end
50
+
51
+ # Represent a project
52
+ #
53
+ # Sample of use:
54
+ #
55
+ # ```ruby
56
+ # Kamaze.project do |c|
57
+ # c.subject = Kamaze::Project
58
+ # c.name = :'kamaze-project'
59
+ # c.tasks = [ :doc, :gem ]
60
+ # end
61
+ # ```
62
+ class Kamaze::Project
63
+ include Concern::Mode
64
+ include Concern::Helper
65
+ include Concern::Tasks
66
+ include Concern::Tools
67
+
68
+ # Project name
69
+ #
70
+ # @return [Symbol]
71
+ attr_reader :name
72
+
73
+ # Project subject, main class
74
+ #
75
+ # @return [Class]
76
+ attr_reader :subject
77
+
78
+ class << self
79
+ include Concern::Env
80
+
81
+ # Load "env file" + ruby files from ``boot`` directory
82
+ #
83
+ # @return [self]
84
+ def boot
85
+ env_load
86
+
87
+ Dir.glob("#{__dir__}/project/boot/*.rb").each do |bootable|
88
+ require_relative bootable
89
+ end
90
+
91
+ self
92
+ end
93
+ end
94
+
95
+ def initialize(&block)
96
+ self.class.boot
97
+
98
+ if block
99
+ config = helper.get('project/config')
100
+ yield(config)
101
+ config.configure(self)
102
+ end
103
+
104
+ self.name ||= ENV.fetch('PROJECT_NAME')
105
+ self.subject ||= subject!
106
+
107
+ self.tools.freeze
108
+ end
109
+
110
+ # @return [Pathname]
111
+ def path(*args)
112
+ pwd.join(*args)
113
+ end
114
+
115
+ # Load project
116
+ #
117
+ # @return [self]
118
+ def load!
119
+ tasks_load!
120
+ end
121
+
122
+ # @return [Pathname]
123
+ def pwd
124
+ ::Pathname.new(Dir.pwd)
125
+ end
126
+
127
+ protected
128
+
129
+ alias gem_name name
130
+
131
+ # Set name
132
+ def name=(name)
133
+ @name = name.to_s.empty? ? nil : name.to_s.to_sym
134
+ end
135
+
136
+ # Set subject
137
+ #
138
+ # @param [Class] subject
139
+ def subject=(subject)
140
+ unless subject.is_a?(Class)
141
+ # @todo raise error
142
+ end
143
+
144
+ @subject = subject
145
+ end
146
+
147
+ # Main class (subject of project)
148
+ #
149
+ # @return [Class]
150
+ def subject!
151
+ resolvable = name.to_s.tr('-', '/')
152
+
153
+ helper.get(:inflector).resolve(resolvable)
154
+ end
155
+ end
@@ -0,0 +1,16 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Copyright (C) 2017-2018 Dimitri Arrigoni <dimitri@arrigoni.me>
4
+ # License GPLv3+: GNU GPL version 3 or later
5
+ # <http://www.gnu.org/licenses/gpl.html>.
6
+ # This is free software: you are free to change and redistribute it.
7
+ # There is NO WARRANTY, to the extent permitted by law.
8
+
9
+ {
10
+ pp: proc { ENV['PROJECT_MODE'] == 'development' },
11
+ object: proc { true },
12
+ }.each do |requirement, conditionner|
13
+ next unless conditionner.call
14
+
15
+ require_relative "../core_ext/#{requirement}"
16
+ end
@@ -0,0 +1,38 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Copyright (C) 2017-2018 Dimitri Arrigoni <dimitri@arrigoni.me>
4
+ # License GPLv3+: GNU GPL version 3 or later
5
+ # <http://www.gnu.org/licenses/gpl.html>.
6
+ # This is free software: you are free to change and redistribute it.
7
+ # There is NO WARRANTY, to the extent permitted by law.
8
+
9
+ patchable = lambda do
10
+ if Gem::Specification.find_all_by_name('listen').any?
11
+ require 'listen'
12
+ return YAML.safe_load(ENV['SILENCE_DUPLICATE_DIRECTORY_ERRORS'].to_s)
13
+ end
14
+
15
+ false
16
+ end
17
+
18
+ # rubocop:disable all
19
+
20
+ # @see https://github.com/guard/listen/wiki/Duplicate-directory-errors
21
+ #
22
+ # Listen >=2.8
23
+ # patch to silence duplicate directory errors. USE AT YOUR OWN RISK
24
+ if patchable.call
25
+ if Gem::Version.new(Listen::VERSION) >= Gem::Version.new('2.8.0')
26
+ module Listen
27
+ class Record
28
+ class SymlinkDetector
29
+ def _fail(_, _)
30
+ fail Error, "Don't watch locally-symlinked directory twice"
31
+ end
32
+ end
33
+ end
34
+ end
35
+ end
36
+ end
37
+
38
+ # rubocop:enable all
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Copyright (C) 2017-2018 Dimitri Arrigoni <dimitri@arrigoni.me>
4
+ # License GPLv3+: GNU GPL version 3 or later
5
+ # <http://www.gnu.org/licenses/gpl.html>.
6
+ # This is free software: you are free to change and redistribute it.
7
+ # There is NO WARRANTY, to the extent permitted by law.
8
+
9
+ require 'kamaze/project'
10
+
11
+ # Namespace for ``Concern``
12
+ module Kamaze::Project::Concern
13
+ end
@@ -0,0 +1,53 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Copyright (C) 2017-2018 Dimitri Arrigoni <dimitri@arrigoni.me>
4
+ # License GPLv3+: GNU GPL version 3 or later
5
+ # <http://www.gnu.org/licenses/gpl.html>.
6
+ # This is free software: you are free to change and redistribute it.
7
+ # There is NO WARRANTY, to the extent permitted by law.
8
+
9
+ require_relative '../concern'
10
+
11
+ # Concern for CLI
12
+ #
13
+ # This module provides base methods focused on ``retcode``.
14
+ module Kamaze::Project::Concern::Cli
15
+
16
+ # @!attribute [r] retcode
17
+ # @return [Fixnum] retcode
18
+
19
+ class << self
20
+ def included(base)
21
+ base.class_eval <<-"ACCESSORS", __FILE__, __LINE__ + 1
22
+ protected
23
+
24
+ attr_writer :retcode
25
+ ACCESSORS
26
+ end
27
+ end
28
+
29
+ # Status code usable to eventually initiates the termination.
30
+ #
31
+ # @return [Fixnum]
32
+ def retcode
33
+ @retcode || Errno::NOERROR::Errno
34
+ end
35
+
36
+ # Denote execution is a success.
37
+ #
38
+ # @return [Boolean]
39
+ def success?
40
+ Errno::NOERROR::Errno == retcode
41
+ end
42
+
43
+ # Denote execution is a failure.
44
+ #
45
+ # @return [Boolean]
46
+ def failure?
47
+ !success?
48
+ end
49
+
50
+ alias failed? failure?
51
+
52
+ alias successful? success?
53
+ end
@@ -0,0 +1,36 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Copyright (C) 2017-2018 Dimitri Arrigoni <dimitri@arrigoni.me>
4
+ # License GPLv3+: GNU GPL version 3 or later
5
+ # <http://www.gnu.org/licenses/gpl.html>.
6
+ # This is free software: you are free to change and redistribute it.
7
+ # There is NO WARRANTY, to the extent permitted by law.
8
+
9
+ require_relative '../cli'
10
+
11
+ # Concern exit on failure
12
+ #
13
+ # Use ``retcode`` to exit in ``with_exit_on_failure`` blocks.
14
+ #
15
+ # @todo Add (rspec) test and examples
16
+ module Kamaze::Project::Concern::Cli::WithExitOnFailure
17
+ include Kamaze::Project::Concern::Cli
18
+
19
+ protected
20
+
21
+ # Initiates termination by raising ``SystemExit`` exception
22
+ # depending on ``success`` of given block.
23
+ #
24
+ # @yield [Object]
25
+ # @yieldparam [self]
26
+ #
27
+ # @raise [SystemExit]
28
+ # @return [Object]
29
+ def with_exit_on_failure
30
+ result = yield(self)
31
+
32
+ exit(retcode) if failure?
33
+
34
+ result
35
+ end
36
+ end
@@ -0,0 +1,63 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Copyright (C) 2017-2018 Dimitri Arrigoni <dimitri@arrigoni.me>
4
+ # License GPLv3+: GNU GPL version 3 or later
5
+ # <http://www.gnu.org/licenses/gpl.html>.
6
+ # This is free software: you are free to change and redistribute it.
7
+ # There is NO WARRANTY, to the extent permitted by law.
8
+
9
+ require_relative '../concern'
10
+ require 'dotenv'
11
+ require 'pathname'
12
+
13
+ # Load dotenv file
14
+ #
15
+ # Storing configuration in the environment is one of the tenets of a
16
+ # twelve-factor app. Anything that is likely to change between
17
+ # deployment environments, such as resource handles for databases or
18
+ # credentials for external services should be extracted
19
+ # from the code into environment variables.
20
+ #
21
+ # @see https://github.com/bkeepers/dotenv
22
+ # @see http://12factor.net/config
23
+ module Kamaze::Project::Concern::Env
24
+ # @!attribute [r] env_loaded
25
+ # @return [Hash] loaded environment
26
+
27
+ class << self
28
+ def included(base)
29
+ base.class_eval <<-"ACCESSORS", __FILE__, __LINE__ + 1
30
+ protected
31
+
32
+ attr_writer :env_loaded
33
+ ACCESSORS
34
+ end
35
+ end
36
+
37
+ # Loaded environment
38
+ #
39
+ # @return [Hash]
40
+ def env_loaded
41
+ @env_loaded ||= {}
42
+
43
+ @env_loaded
44
+ end
45
+
46
+ protected
47
+
48
+ # Load ``.env`` file (and store result)
49
+ #
50
+ # @todo load different (or additionnal) files depending on env/mode
51
+ #
52
+ # @return [self]
53
+ def env_load(options = {})
54
+ options[:pwd] = ::Pathname.new(options[:pwd] || Dir.pwd).realpath
55
+ options[:file] ||= '.env'
56
+
57
+ [options.fetch(:pwd).join(options.fetch(:file))].each do |file|
58
+ env_loaded.merge!(::Dotenv.load(file))
59
+ end
60
+
61
+ self
62
+ end
63
+ end