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,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
+ require_relative '../status'
10
+
11
+ # Initialized using an Array representation of status
12
+ #
13
+ # A memento is kept.
14
+ # Given files are filtered by type.
15
+ #
16
+ # @abstract
17
+ class Kamaze::Project::Tools::Git::Status::FilesArray < Array
18
+ class << self
19
+ # Get type
20
+ #
21
+ # @return [Symbol]
22
+ attr_reader :type
23
+ end
24
+
25
+ # Initialize using given status array representation
26
+ #
27
+ # @param [Array] status
28
+ def initialize(status)
29
+ super status.clone
30
+ .keep_if { |file| file.public_send("#{self.class.type}?") }
31
+
32
+ @memento = status.clone.map(&:freeze).freeze
33
+ end
34
+
35
+ protected
36
+
37
+ # @return [Array]
38
+ attr_reader :memento
39
+ end
@@ -0,0 +1,77 @@
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 'files_array'
10
+ require_relative 'worktree'
11
+
12
+ # rubocop:disable Style/Documentation
13
+
14
+ class Kamaze::Project::Tools::Git::Status
15
+ class Index < FilesArray
16
+ @type = :index
17
+ end
18
+ end
19
+
20
+ # rubocop:enable Style/Documentation
21
+
22
+ # Represent index status
23
+ class Kamaze::Project::Tools::Git::Status::Index
24
+ # Denote index is safe
25
+ #
26
+ # Unsafe index shares modifications with the worktree,
27
+ # thus, files SHOULD NOT be naively analyzed,
28
+ # for example, by running a static code analysis.
29
+ # Running a static code analysis on unsafe index files
30
+ # COULD lead to inconsistent results.
31
+ #
32
+ # @return [Boolean]
33
+ def safe?
34
+ unsafe_files.empty?
35
+ end
36
+
37
+ # @return [Boolean]
38
+ def unsafe?
39
+ !safe?
40
+ end
41
+
42
+ # Get present files in intersection between index and worktree
43
+ #
44
+ # @return [Array<File>]
45
+ def unsafe_files
46
+ c = [self, worktree].map do |a|
47
+ a.map { |f| f.absolute_path.to_s }
48
+ end.freeze
49
+
50
+ self.to_a.keep_if do |f|
51
+ (c[0] & c[1]).include?(f.absolute_path.to_s)
52
+ end
53
+ end
54
+
55
+ # Get files present in index and considered as safe
56
+ #
57
+ # Safe files SHOULD NOT present divergent modifications
58
+ # between index and worktree. As seen in ``unsafe_files`` only
59
+ # the modified state is considered.
60
+ def safe_files
61
+ unsafe = self.unsafe_files.map { |f| f.absolute_path.to_s }
62
+
63
+ self.to_a
64
+ .reject { |f| unsafe.include?(f.absolute_path.to_s) }
65
+ end
66
+
67
+ protected
68
+
69
+ # Get a fresh (not frozen) copy of worktree as seen on initialization
70
+ #
71
+ # @return [Kamaze::Project::Tools::Git::Status::Worktree]
72
+ def worktree
73
+ memo = Array.new(memento)
74
+
75
+ Kamaze::Project::Tools::Git::Status::Worktree.new(memo)
76
+ end
77
+ end
@@ -0,0 +1,19 @@
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 'files_array'
10
+
11
+ class Kamaze::Project::Tools::Git::Status
12
+ class Worktree < FilesArray
13
+ end
14
+ end
15
+
16
+ # Represent worktree status
17
+ class Kamaze::Project::Tools::Git::Status::Worktree
18
+ @type = :worktree
19
+ end
@@ -0,0 +1,35 @@
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 '../git'
10
+
11
+ # Provide base class for utils based on git
12
+ #
13
+ # Provide access to the repository
14
+ # @see http://www.rubydoc.info/github/libgit2/rugged/Rugged/Repository
15
+ #
16
+ # @abstract
17
+ class Kamaze::Project::Tools::Git::Util
18
+ attr_reader :repository
19
+
20
+ # @param [Rugged::Repository] repository
21
+ def initialize(repository)
22
+ @repository = repository
23
+
24
+ setup
25
+ end
26
+
27
+ protected
28
+
29
+ # Setup
30
+ #
31
+ # Almost used for inheritance
32
+ def setup
33
+ nil
34
+ end
35
+ end
@@ -0,0 +1,197 @@
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 '../tools'
10
+
11
+ # Apply provided license on project files
12
+ #
13
+ # Samples of use:
14
+ #
15
+ # ```ruby
16
+ # Licenser.process do |pr|
17
+ # pr.license = project.version.license_header
18
+ # pr.patterns = ['bin/*', 'lib/**/**.rb']
19
+ # end
20
+ # ```
21
+ #
22
+ # ```ruby
23
+ # Licenser.process do |pr|
24
+ # pr.files += Dir.glob('bin/*')
25
+ # end
26
+ # ```
27
+ #
28
+ # Sample of use (with DSL):
29
+ #
30
+ # ```ruby
31
+ # require 'kamaze/project/dsl'
32
+ # require 'kamaze/project/tools/licenser'
33
+ #
34
+ # project do |c|
35
+ # c.working_dir = "#{__dir__}/.."
36
+ # c.subject = Kamaze::Project
37
+ # c.name = 'kamaze-project'
38
+ # c.tasks = []
39
+ # end
40
+ #
41
+ # version = project.subject.const_get('VERSION')
42
+ # licenser = Kamaze::Project::Tools::Licenser.process do |process|
43
+ # process.working_dir = project.working_dir
44
+ # process.license = project.version.license_header
45
+ # process.patterns = ['bin/*', 'lib/**/**.rb']
46
+ # process.output = STDOUT
47
+ # end
48
+ # ```
49
+ class Kamaze::Project::Tools::Licenser < Kamaze::Project::Tools::BaseTool
50
+ # License chapter/header
51
+ #
52
+ # @return [String]
53
+ attr_writer :license
54
+
55
+ # Files to be licensed
56
+ #
57
+ # @type [Array<String|Pathname>]
58
+ # @return [Array<Pathname>]
59
+ attr_writer :files
60
+
61
+ # Patterns used to match files
62
+ #
63
+ # @return [Array<String>]
64
+ attr_reader :patterns
65
+
66
+ # Where (default is current opened file) to write output
67
+ #
68
+ # @return [Pathname|IO|nil]
69
+ attr_accessor :output
70
+
71
+ # @type [String|Pathname]
72
+ # @return [Pathname]
73
+ attr_writer :working_dir
74
+
75
+ class << self
76
+ def process(&block)
77
+ self.new.process(&block)
78
+ end
79
+ end
80
+
81
+ def initialize
82
+ yield self if block_given?
83
+
84
+ @working_dir ||= Dir.pwd
85
+ @patterns ||= []
86
+ @files ||= []
87
+ @license ||= '' # project.version.license_header
88
+ end
89
+
90
+ # Get working-dir
91
+ #
92
+ # @return [Pathname]
93
+ def working_dir
94
+ Pathname.new(@working_dir || Dir.pwd).freeze
95
+ end
96
+
97
+ # Set patterns
98
+ #
99
+ # @param [Array<String>] patterns
100
+ def patterns=(patterns)
101
+ @files ||= []
102
+ @patterns ||= []
103
+
104
+ patterns.each do |pattern|
105
+ @files += Dir.glob(working_dir.join(pattern))
106
+ end
107
+
108
+ @patterns += patterns
109
+ end
110
+
111
+ # Get files
112
+ #
113
+ # @return [Array<Pathname>]
114
+ def files
115
+ @files.map { |file| Pathname.new(file) }
116
+ .delete_if { |file| !file.file? }
117
+ .delete_if { |file| file.basename.to_s[0] == '.' }
118
+ .sort.uniq
119
+ .map(&:realpath)
120
+ end
121
+
122
+ # Get license, formatted (using comments)
123
+ #
124
+ # @return [String]
125
+ def license
126
+ @license.to_s.gsub(/\n{3}/mi, "\n\n").lines.map do |line|
127
+ line.chomp!
128
+ "# #{line}" if line and line[0] != '#'
129
+ end.join("\n")
130
+ end
131
+
132
+ # Get license regexp
133
+ #
134
+ # @return [Regexp]
135
+ def license_regexp
136
+ /#{Regexp.quote(license)}/mi
137
+ end
138
+
139
+ # Apply license on processable files
140
+ #
141
+ # @return [self]
142
+ def process
143
+ yield self if block_given?
144
+
145
+ files.each { |file| apply_license(file) }
146
+
147
+ self
148
+ end
149
+
150
+ protected
151
+
152
+ # Get an index, skipping comments
153
+ #
154
+ # @param [Array<String>] lines
155
+ # @return [Fixnum]
156
+ def index_lines(lines)
157
+ index = 0
158
+ loop do
159
+ break unless lines[index] and lines[index][0] == '#'
160
+
161
+ index += 1
162
+ end
163
+
164
+ index
165
+ end
166
+
167
+ # Apply license on a file
168
+ #
169
+ # @param [Pathname] file
170
+ # @return [Pathname] file
171
+ def apply_license(file)
172
+ content = file.read
173
+ licensable = !content.scan(license_regexp)[0] and !license.strip.empty?
174
+ output = self.output || file
175
+
176
+ if licensable
177
+ content = license_lines(content.lines).join('')
178
+
179
+ output.write(content)
180
+ end
181
+
182
+ file
183
+ end
184
+
185
+ # Apply license on lines
186
+ #
187
+ # @param [Array<String>] lines
188
+ # @return [Array<String>] with license applied
189
+ def license_lines(lines)
190
+ index = index_lines(lines)
191
+ lines = lines.clone
192
+
193
+ return lines if index <= 0
194
+
195
+ lines[0..index] + license.lines + ["\n"] + lines[index..-1]
196
+ end
197
+ end
@@ -0,0 +1,86 @@
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 '../tools'
10
+ require_relative 'base_tool'
11
+
12
+ # rubocop:disable Style/Documentation
13
+
14
+ module Kamaze::Project::Tools
15
+ class Packager < BaseTool
16
+ class Filesystem
17
+ class Operator
18
+ module Utils
19
+ end
20
+ end
21
+ end
22
+
23
+ require_relative 'packager/filesystem'
24
+ require_relative 'packager/filesystem/operator'
25
+ require_relative 'packager/filesystem/operator/utils'
26
+ end
27
+ end
28
+
29
+ # rubocop:enable Style/Documentation
30
+
31
+ # Provides a packager
32
+ #
33
+ # Packager is intended to provide basic packaging operations
34
+ # @abstract
35
+ class Kamaze::Project::Tools::Packager
36
+ # Get filesystem
37
+ #
38
+ # @return [Kamaze::Project::Tools::Packager::Filesystem]
39
+ attr_reader :fs
40
+
41
+ def initialize
42
+ @initialized = false
43
+ # fs mutable attributes are accessibles during initialization
44
+ # @see method_missing
45
+ @fs = Filesystem.new
46
+
47
+ yield self if block_given?
48
+
49
+ super
50
+
51
+ @initialized = true
52
+ end
53
+
54
+ # Denote class is initialized
55
+ #
56
+ # @return [Boolean]
57
+ def initialized?
58
+ @initialized
59
+ end
60
+
61
+ def method_missing(method, *args, &block)
62
+ if respond_to_missing?(method)
63
+ unless initialized?
64
+ mutable = fs.mutable_attribute?(method)
65
+
66
+ return fs.__send__(method, *args, &block) if mutable
67
+ end
68
+
69
+ return fs.public_send(method, *args, &block)
70
+ end
71
+
72
+ super
73
+ end
74
+
75
+ def respond_to_missing?(method, include_private = false)
76
+ if method.to_s[-1] == '='
77
+ unless initialized?
78
+ return true if fs.mutable_attribute?(method)
79
+ end
80
+ end
81
+
82
+ return true if fs.respond_to?(method, include_private)
83
+
84
+ super(method, include_private)
85
+ end
86
+ end