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.
- checksums.yaml +7 -0
- data/.yardopts +18 -0
- data/bin/plop +5 -0
- data/lib/kamaze-project.rb +39 -0
- data/lib/kamaze/project.rb +155 -0
- data/lib/kamaze/project/boot/core_ext.rb +16 -0
- data/lib/kamaze/project/boot/listen.rb +38 -0
- data/lib/kamaze/project/concern.rb +13 -0
- data/lib/kamaze/project/concern/cli.rb +53 -0
- data/lib/kamaze/project/concern/cli/with_exit_on_failure.rb +36 -0
- data/lib/kamaze/project/concern/env.rb +63 -0
- data/lib/kamaze/project/concern/helper.rb +20 -0
- data/lib/kamaze/project/concern/mode.rb +19 -0
- data/lib/kamaze/project/concern/observable.rb +132 -0
- data/lib/kamaze/project/concern/sh.rb +91 -0
- data/lib/kamaze/project/concern/tasks.rb +55 -0
- data/lib/kamaze/project/concern/tools.rb +27 -0
- data/lib/kamaze/project/config.rb +58 -0
- data/lib/kamaze/project/core_ext/object.rb +27 -0
- data/lib/kamaze/project/core_ext/pp.rb +28 -0
- data/lib/kamaze/project/debug.rb +136 -0
- data/lib/kamaze/project/dsl.rb +16 -0
- data/lib/kamaze/project/dsl/definition.rb +43 -0
- data/lib/kamaze/project/dsl/setup.rb +11 -0
- data/lib/kamaze/project/helper.rb +63 -0
- data/lib/kamaze/project/helper/inflector.rb +44 -0
- data/lib/kamaze/project/helper/project.rb +34 -0
- data/lib/kamaze/project/helper/project/config.rb +25 -0
- data/lib/kamaze/project/observable.rb +20 -0
- data/lib/kamaze/project/observer.rb +37 -0
- data/lib/kamaze/project/resources/Vagrantfile +128 -0
- data/lib/kamaze/project/resources/config/tools.yml +15 -0
- data/lib/kamaze/project/struct.rb +34 -0
- data/lib/kamaze/project/tasks/cs.rb +23 -0
- data/lib/kamaze/project/tasks/cs/control.rb +17 -0
- data/lib/kamaze/project/tasks/cs/correct.rb +17 -0
- data/lib/kamaze/project/tasks/cs/pre_commit.rb +66 -0
- data/lib/kamaze/project/tasks/doc.rb +21 -0
- data/lib/kamaze/project/tasks/doc/watch.rb +41 -0
- data/lib/kamaze/project/tasks/gem.rb +14 -0
- data/lib/kamaze/project/tasks/gem/build.rb +34 -0
- data/lib/kamaze/project/tasks/gem/compile.rb +30 -0
- data/lib/kamaze/project/tasks/gem/gemspec.rb +20 -0
- data/lib/kamaze/project/tasks/gem/install.rb +32 -0
- data/lib/kamaze/project/tasks/gem/push.rb +27 -0
- data/lib/kamaze/project/tasks/misc/gitignore.rb +29 -0
- data/lib/kamaze/project/tasks/shell.rb +17 -0
- data/lib/kamaze/project/tasks/sources.rb +6 -0
- data/lib/kamaze/project/tasks/sources/license.rb +35 -0
- data/lib/kamaze/project/tasks/test.rb +16 -0
- data/lib/kamaze/project/tasks/vagrant.rb +71 -0
- data/lib/kamaze/project/tasks/version/edit.rb +16 -0
- data/lib/kamaze/project/tools.rb +18 -0
- data/lib/kamaze/project/tools/base_tool.rb +55 -0
- data/lib/kamaze/project/tools/console.rb +48 -0
- data/lib/kamaze/project/tools/console/output.rb +120 -0
- data/lib/kamaze/project/tools/console/output/buffer.rb +48 -0
- data/lib/kamaze/project/tools/gemspec.rb +33 -0
- data/lib/kamaze/project/tools/gemspec/builder.rb +99 -0
- data/lib/kamaze/project/tools/gemspec/concern.rb +13 -0
- data/lib/kamaze/project/tools/gemspec/concern/reading.rb +49 -0
- data/lib/kamaze/project/tools/gemspec/packager.rb +67 -0
- data/lib/kamaze/project/tools/gemspec/packer.rb +89 -0
- data/lib/kamaze/project/tools/gemspec/packer/command.rb +143 -0
- data/lib/kamaze/project/tools/gemspec/reader.rb +70 -0
- data/lib/kamaze/project/tools/gemspec/reader/decorator.rb +78 -0
- data/lib/kamaze/project/tools/gemspec/writer.rb +127 -0
- data/lib/kamaze/project/tools/gemspec/writer/dep_gen.rb +61 -0
- data/lib/kamaze/project/tools/gemspec/writer/dependency.rb +104 -0
- data/lib/kamaze/project/tools/git.rb +95 -0
- data/lib/kamaze/project/tools/git/hooks.rb +66 -0
- data/lib/kamaze/project/tools/git/hooks/base_hook.rb +33 -0
- data/lib/kamaze/project/tools/git/hooks/pre_commit.rb +81 -0
- data/lib/kamaze/project/tools/git/status.rb +101 -0
- data/lib/kamaze/project/tools/git/status/decorator.rb +39 -0
- data/lib/kamaze/project/tools/git/status/file.rb +180 -0
- data/lib/kamaze/project/tools/git/status/files_array.rb +39 -0
- data/lib/kamaze/project/tools/git/status/index.rb +77 -0
- data/lib/kamaze/project/tools/git/status/worktree.rb +19 -0
- data/lib/kamaze/project/tools/git/util.rb +35 -0
- data/lib/kamaze/project/tools/licenser.rb +197 -0
- data/lib/kamaze/project/tools/packager.rb +86 -0
- data/lib/kamaze/project/tools/packager/filesystem.rb +178 -0
- data/lib/kamaze/project/tools/packager/filesystem/operator.rb +83 -0
- data/lib/kamaze/project/tools/packager/filesystem/operator/utils.rb +77 -0
- data/lib/kamaze/project/tools/process_locker.rb +106 -0
- data/lib/kamaze/project/tools/rspec.rb +115 -0
- data/lib/kamaze/project/tools/rubocop.rb +128 -0
- data/lib/kamaze/project/tools/rubocop/arguments.rb +19 -0
- data/lib/kamaze/project/tools/rubocop/config.rb +43 -0
- data/lib/kamaze/project/tools/shell.rb +85 -0
- data/lib/kamaze/project/tools/vagrant.rb +182 -0
- data/lib/kamaze/project/tools/vagrant/composer.rb +88 -0
- data/lib/kamaze/project/tools/vagrant/composer/file.rb +79 -0
- data/lib/kamaze/project/tools/vagrant/remote.rb +79 -0
- data/lib/kamaze/project/tools/vagrant/shell.rb +102 -0
- data/lib/kamaze/project/tools/vagrant/writer.rb +81 -0
- data/lib/kamaze/project/tools/yardoc.rb +75 -0
- data/lib/kamaze/project/tools/yardoc/file.rb +55 -0
- data/lib/kamaze/project/tools/yardoc/watchable.rb +70 -0
- data/lib/kamaze/project/tools/yardoc/watcher.rb +106 -0
- data/lib/kamaze/project/tools_provider.rb +161 -0
- data/lib/kamaze/project/tools_provider/resolver.rb +42 -0
- data/lib/kamaze/project/version.rb +104 -0
- data/lib/kamaze/project/version.yml +17 -0
- metadata +321 -0
|
@@ -0,0 +1,70 @@
|
|
|
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 '../gemspec'
|
|
10
|
+
require_relative 'reader/decorator'
|
|
11
|
+
|
|
12
|
+
require 'pathname'
|
|
13
|
+
require 'rubygems'
|
|
14
|
+
|
|
15
|
+
# Read ``gemspec`` file
|
|
16
|
+
#
|
|
17
|
+
# Retrieve ``Gem::Specification`` through ``read`` method.
|
|
18
|
+
#
|
|
19
|
+
# @see Kamaze::Project
|
|
20
|
+
class Kamaze::Project::Tools::Gemspec::Reader
|
|
21
|
+
# @return [String]
|
|
22
|
+
attr_accessor :gem_name
|
|
23
|
+
|
|
24
|
+
attr_writer :project
|
|
25
|
+
|
|
26
|
+
def mutable_attributes
|
|
27
|
+
[:project, :gem_name]
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
# @return [Pathname]
|
|
31
|
+
def pwd
|
|
32
|
+
::Pathname.new(Dir.pwd)
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
# Read gemspec (as given ``type``)
|
|
36
|
+
#
|
|
37
|
+
# Return ``Gem::Specification`` or given ``type``
|
|
38
|
+
#
|
|
39
|
+
# @raise [ArgumentError] when type is not supported
|
|
40
|
+
# @param [nil|Class|Symbol] type
|
|
41
|
+
# @return [Gem::Specification|Object]
|
|
42
|
+
def read(type = nil)
|
|
43
|
+
Dir.chdir(pwd) do
|
|
44
|
+
spec = Gem::Specification.load(self.spec_file.to_s)
|
|
45
|
+
|
|
46
|
+
type ? Decorator.new(spec).to(type) : spec
|
|
47
|
+
end
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
# Get (gem)spec file path
|
|
51
|
+
#
|
|
52
|
+
# @return [Pathname]
|
|
53
|
+
def spec_file
|
|
54
|
+
pwd.join("#{project.name}.gemspec")
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
# Get project
|
|
58
|
+
#
|
|
59
|
+
# @see Kamaze.project
|
|
60
|
+
# @return [Object|Kamaze::Project]
|
|
61
|
+
def project
|
|
62
|
+
@project || Kamaze.project
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
protected
|
|
66
|
+
|
|
67
|
+
def setup
|
|
68
|
+
@gem_name ||= project.name
|
|
69
|
+
end
|
|
70
|
+
end
|
|
@@ -0,0 +1,78 @@
|
|
|
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/tools/gemspec/reader'
|
|
10
|
+
require 'ostruct'
|
|
11
|
+
|
|
12
|
+
class Kamaze::Project::Tools::Gemspec::Reader
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
# Decorator for ``Gem::Specification``
|
|
16
|
+
#
|
|
17
|
+
# @note Decorator is not recursive
|
|
18
|
+
class Kamaze::Project::Tools::Gemspec::Reader::Decorator
|
|
19
|
+
# @param [Gem::Specification] spec
|
|
20
|
+
def initialize(spec)
|
|
21
|
+
@spec = spec
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
# Decorate specification to a given type
|
|
25
|
+
#
|
|
26
|
+
# @param [Class|symbol] type
|
|
27
|
+
# @return [Object]
|
|
28
|
+
#
|
|
29
|
+
# @raise [ArgumentError]
|
|
30
|
+
# @see methods
|
|
31
|
+
def to(type)
|
|
32
|
+
method = methods_mapping.fetch(type)
|
|
33
|
+
rescue KeyError
|
|
34
|
+
raise ArgumentError, "invalid type: #{type}"
|
|
35
|
+
else
|
|
36
|
+
self.__send__(method)
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
protected
|
|
40
|
+
|
|
41
|
+
# @return [Gem::Specification]
|
|
42
|
+
attr_reader :spec
|
|
43
|
+
|
|
44
|
+
# Provides methods mapping
|
|
45
|
+
#
|
|
46
|
+
# @return [Hash]
|
|
47
|
+
def methods_mapping
|
|
48
|
+
{
|
|
49
|
+
Hash => :decorate_to_hash,
|
|
50
|
+
hash: :decorate_to_hash,
|
|
51
|
+
OpenStruct => :decorate_to_ostruct,
|
|
52
|
+
ostruct: :decorate_to_ostruct,
|
|
53
|
+
open_struct: :decorate_to_ostruct,
|
|
54
|
+
}
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
# Decorate to obtain a ``Hash``
|
|
58
|
+
#
|
|
59
|
+
# @return [Hash]
|
|
60
|
+
def decorate_to_hash
|
|
61
|
+
result = {}
|
|
62
|
+
|
|
63
|
+
spec.instance_variables.each do |k|
|
|
64
|
+
k = k.to_s.gsub(/^@/, '').to_sym
|
|
65
|
+
|
|
66
|
+
result[k] = spec.__send__(k) if spec.respond_to?(k)
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
result
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
# Decorate to obtain an ``OpenStruct``
|
|
73
|
+
#
|
|
74
|
+
# @return [OpenStruct]
|
|
75
|
+
def decorate_to_ostruct
|
|
76
|
+
OpenStruct.new(decorate_to_h)
|
|
77
|
+
end
|
|
78
|
+
end
|
|
@@ -0,0 +1,127 @@
|
|
|
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 '../gemspec'
|
|
10
|
+
require 'pathname'
|
|
11
|
+
require 'tenjin'
|
|
12
|
+
|
|
13
|
+
# Class intended to generate ``gemspec`` file from a template
|
|
14
|
+
#
|
|
15
|
+
# Default template filename is ``gemspec.tpl``.
|
|
16
|
+
# Consider to use ``Dir.chdir`` in order read and generate contents
|
|
17
|
+
# from the right directory (especially during tests).
|
|
18
|
+
#
|
|
19
|
+
# @see templated
|
|
20
|
+
# @see Kamaze::Project
|
|
21
|
+
class Kamaze::Project::Tools::Gemspec::Writer
|
|
22
|
+
# Set path (almost filename) to templated gemspec
|
|
23
|
+
#
|
|
24
|
+
# @type [String|Pathname]
|
|
25
|
+
attr_writer :templated
|
|
26
|
+
|
|
27
|
+
# @see Kamaze.project
|
|
28
|
+
# @type [Object|Kamaze::Project]
|
|
29
|
+
# @return [Kamaze::Project]
|
|
30
|
+
attr_accessor :project
|
|
31
|
+
|
|
32
|
+
def mutable_attributes
|
|
33
|
+
[:templated, :project]
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
# Get path (almost filename) to templated gemspec
|
|
37
|
+
#
|
|
38
|
+
# @return [Pathname]
|
|
39
|
+
def templated
|
|
40
|
+
Pathname.new(@templated)
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
# Get path (almost filename) to generated gemspec
|
|
44
|
+
#
|
|
45
|
+
# @return [Pathname]
|
|
46
|
+
def generated
|
|
47
|
+
Pathname.new("#{project.name}.gemspec")
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
# Get string representation
|
|
51
|
+
#
|
|
52
|
+
# @see generated
|
|
53
|
+
# @return [String]
|
|
54
|
+
def to_s
|
|
55
|
+
generated.to_s
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
# Get variable used in template for ``Gem::Specification`` instantiation
|
|
59
|
+
#
|
|
60
|
+
# @return [String]
|
|
61
|
+
def spec_id
|
|
62
|
+
templated
|
|
63
|
+
.read
|
|
64
|
+
.scan(/Gem::Specification\.new\s+do\s+\|([a-z]+)\|/)
|
|
65
|
+
.flatten.fetch(0)
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
# Get dependency
|
|
69
|
+
#
|
|
70
|
+
# @return [Dependency]
|
|
71
|
+
def dependency
|
|
72
|
+
require_relative 'writer/dep_gen'
|
|
73
|
+
|
|
74
|
+
DepGen.new(spec_id).dependency
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
# Get template's context (variables)
|
|
78
|
+
#
|
|
79
|
+
# @return [Hahsh]
|
|
80
|
+
def context
|
|
81
|
+
{
|
|
82
|
+
name: project.name,
|
|
83
|
+
version: project.version,
|
|
84
|
+
dependencies: dependency,
|
|
85
|
+
}.yield_self do |variables|
|
|
86
|
+
project.version.to_h.merge(variables)
|
|
87
|
+
end
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
# Get generated/templated content
|
|
91
|
+
#
|
|
92
|
+
# @return [String]
|
|
93
|
+
def content
|
|
94
|
+
template.render(templated.to_s, context)
|
|
95
|
+
end
|
|
96
|
+
|
|
97
|
+
# Write gemspec file
|
|
98
|
+
#
|
|
99
|
+
# @return [self]
|
|
100
|
+
def write
|
|
101
|
+
generated.write(content)
|
|
102
|
+
|
|
103
|
+
self
|
|
104
|
+
end
|
|
105
|
+
|
|
106
|
+
protected
|
|
107
|
+
|
|
108
|
+
def setup
|
|
109
|
+
@templated ||= 'gemspec.tpl'
|
|
110
|
+
@project ||= Kamaze.project
|
|
111
|
+
end
|
|
112
|
+
|
|
113
|
+
# Get ``GemspecDepsGen`` instance
|
|
114
|
+
#
|
|
115
|
+
# @see https://github.com/shvets/gemspec_deps_gen
|
|
116
|
+
# @return [GemspecDepsGen]
|
|
117
|
+
def deps_gen
|
|
118
|
+
GemspecDepsGen.new
|
|
119
|
+
end
|
|
120
|
+
|
|
121
|
+
# Get template engine
|
|
122
|
+
#
|
|
123
|
+
# @return [Tenjin::Engine]
|
|
124
|
+
def template
|
|
125
|
+
Tenjin::Engine.new(cache: false)
|
|
126
|
+
end
|
|
127
|
+
end
|
|
@@ -0,0 +1,61 @@
|
|
|
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 '../writer'
|
|
10
|
+
require_relative 'dependency'
|
|
11
|
+
require 'bundler'
|
|
12
|
+
|
|
13
|
+
# Dependencies generator (using a kindo of decorator)
|
|
14
|
+
#
|
|
15
|
+
# Inspiration taken from ``GemspecDepsGen``
|
|
16
|
+
#
|
|
17
|
+
# @see https://github.com/shvets/gemspec_deps_gen
|
|
18
|
+
class Kamaze::Project::Tools::Gemspec::Writer::DepGen
|
|
19
|
+
# @param [String] spec_name
|
|
20
|
+
def initialize(spec_name = 's')
|
|
21
|
+
@spec_name = spec_name.to_s
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
# Get dependencies indexed by group
|
|
25
|
+
#
|
|
26
|
+
# @return [Hash]
|
|
27
|
+
def dependencies
|
|
28
|
+
{}.yield_self do |dependencies|
|
|
29
|
+
{ default: :runtime, development: :development }.each do |k, type|
|
|
30
|
+
dependencies[type] = gems_by_group(k).to_a.freeze
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
dependencies
|
|
34
|
+
end.freeze
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
# Get an object describing dependency
|
|
38
|
+
#
|
|
39
|
+
# @return [Kamaze::Project::Tools::Gemspec::Writer::Dependency]
|
|
40
|
+
def dependency
|
|
41
|
+
decorator.new(dependencies, @spec_name)
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
protected
|
|
45
|
+
|
|
46
|
+
# Get gems for given group
|
|
47
|
+
#
|
|
48
|
+
# @param [Symbol|String] group
|
|
49
|
+
# @return [Array]
|
|
50
|
+
def gems_by_group(group)
|
|
51
|
+
Bundler.environment
|
|
52
|
+
.dependencies
|
|
53
|
+
.select { |d| d.groups.include?(group.to_sym) }
|
|
54
|
+
.to_a
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
# @return [Kamaze::Project::Tools::Gemspec::Writer::Dependency]
|
|
58
|
+
def decorator
|
|
59
|
+
Kamaze::Project::Tools::Gemspec::Writer::Dependency
|
|
60
|
+
end
|
|
61
|
+
end
|
|
@@ -0,0 +1,104 @@
|
|
|
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 '../writer'
|
|
10
|
+
|
|
11
|
+
# Describe dependency as an ``Hash`` indexed by type
|
|
12
|
+
#
|
|
13
|
+
# Sample of use:
|
|
14
|
+
#
|
|
15
|
+
# ```ruby
|
|
16
|
+
# selector = lambda do |type|
|
|
17
|
+
# Bundler.environment.dependencies
|
|
18
|
+
# .select { |d| d.groups.include?(type) }.to_a
|
|
19
|
+
# end
|
|
20
|
+
#
|
|
21
|
+
# dependency = Dependency.new({
|
|
22
|
+
# runtime: selector.call(:default),
|
|
23
|
+
# development: selector.call(:development),
|
|
24
|
+
# })
|
|
25
|
+
#
|
|
26
|
+
# puts dependency.keep(:runtime).to_s
|
|
27
|
+
# ```
|
|
28
|
+
class Kamaze::Project::Tools::Gemspec::Writer::Dependency
|
|
29
|
+
# @param [Hash<Symbol, Gem::Dependency>] dependencies
|
|
30
|
+
# @param [String] spec_name
|
|
31
|
+
def initialize(dependencies, spec_name = 's')
|
|
32
|
+
@dependencies = dependencies.to_h.freeze
|
|
33
|
+
@spec_name = spec_name.to_s
|
|
34
|
+
@keep = [:runtime, :development]
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
# @return [self]
|
|
38
|
+
def keep(*keep)
|
|
39
|
+
@keep = keep
|
|
40
|
+
|
|
41
|
+
self
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
# Get dependencies hash representation.
|
|
45
|
+
#
|
|
46
|
+
# @return [Hash<Symbol, Gem::Dependency>]
|
|
47
|
+
def to_h
|
|
48
|
+
out = {}
|
|
49
|
+
@dependencies.each do |type, gems|
|
|
50
|
+
next unless @keep.include?(type)
|
|
51
|
+
|
|
52
|
+
out[type] = Array.new(gems.clone)
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
out
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
# Get dependencies string representation.
|
|
59
|
+
#
|
|
60
|
+
# @return [String]
|
|
61
|
+
def to_s
|
|
62
|
+
lines = []
|
|
63
|
+
|
|
64
|
+
self.to_h.each do |type, gems|
|
|
65
|
+
gems.each do |gem|
|
|
66
|
+
lines << make_spec_line(gem, type)
|
|
67
|
+
end
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
lines.join("\n").rstrip
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
# Get dependencies array representation.
|
|
74
|
+
#
|
|
75
|
+
# @return [Array<Gem::Dependency>]
|
|
76
|
+
def to_a
|
|
77
|
+
out = []
|
|
78
|
+
|
|
79
|
+
@dependencies.each do |type, gems|
|
|
80
|
+
next unless @keep.include?(type)
|
|
81
|
+
|
|
82
|
+
out.concat(gems)
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
out
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
protected
|
|
89
|
+
|
|
90
|
+
attr_reader :spec_name
|
|
91
|
+
|
|
92
|
+
# @param [Bundler::Dependency] gem
|
|
93
|
+
# @param [String|Symbol] type
|
|
94
|
+
# @return [String]
|
|
95
|
+
def make_spec_line(gem, type)
|
|
96
|
+
'%<spacer>s%<spec_name>s.%<method>s("%<gem>s", %<requirements>s)' % {
|
|
97
|
+
spacer: "\s" * 2,
|
|
98
|
+
spec_name: spec_name,
|
|
99
|
+
method: "add_#{type}_dependency",
|
|
100
|
+
gem: gem.name,
|
|
101
|
+
requirements: gem.requirements_list
|
|
102
|
+
}
|
|
103
|
+
end
|
|
104
|
+
end
|
|
@@ -0,0 +1,95 @@
|
|
|
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
|
+
require 'pathname'
|
|
12
|
+
|
|
13
|
+
# rubocop:disable Style/Documentation
|
|
14
|
+
|
|
15
|
+
module Kamaze::Project::Tools
|
|
16
|
+
class Git < BaseTool
|
|
17
|
+
# @abstract
|
|
18
|
+
class Util
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
class Status
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
class Hooks < Util
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
[:util,
|
|
29
|
+
:hooks,
|
|
30
|
+
:status].each { |req| require_relative "git/#{req}" }
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
# rubocop:enable Style/Documentation
|
|
34
|
+
|
|
35
|
+
# Provide a wrapper based on ``rugged`` (``libgit2``}
|
|
36
|
+
class Kamaze::Project::Tools::Git
|
|
37
|
+
# @return [String]
|
|
38
|
+
attr_writer :base_dir
|
|
39
|
+
|
|
40
|
+
# @see https://github.com/libgit2/rugged
|
|
41
|
+
#
|
|
42
|
+
# @return [Rugged::Repository]
|
|
43
|
+
attr_reader :repository
|
|
44
|
+
|
|
45
|
+
# Instance attributes altered during initialization
|
|
46
|
+
#
|
|
47
|
+
# @return [Array<Symbol>]
|
|
48
|
+
def mutable_attributes
|
|
49
|
+
[:base_dir]
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
# Get base directory
|
|
53
|
+
#
|
|
54
|
+
# @return [::Pathname]
|
|
55
|
+
def base_dir
|
|
56
|
+
::Pathname.new(@base_dir)
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
# Get hooks
|
|
60
|
+
#
|
|
61
|
+
# @return [Hooks]
|
|
62
|
+
def hooks
|
|
63
|
+
Hooks.new(self)
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
# Get status
|
|
67
|
+
#
|
|
68
|
+
# @return [Hash]
|
|
69
|
+
def status
|
|
70
|
+
status = {}
|
|
71
|
+
repository.status { |file, data| status[file] = data }
|
|
72
|
+
|
|
73
|
+
Status.new(status)
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
# Denote is a repository
|
|
77
|
+
#
|
|
78
|
+
# @return [Boolean]
|
|
79
|
+
def repository?
|
|
80
|
+
!!repository
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
protected
|
|
84
|
+
|
|
85
|
+
def setup
|
|
86
|
+
@base_dir ||= Dir.pwd
|
|
87
|
+
begin
|
|
88
|
+
require 'rugged'
|
|
89
|
+
@repository = Rugged::Repository.new(base_dir.to_s)
|
|
90
|
+
rescue LoadError, Rugged::RepositoryError
|
|
91
|
+
# @todo Load error SHOULD be stored (as a boolean?)
|
|
92
|
+
@repository = nil
|
|
93
|
+
end
|
|
94
|
+
end
|
|
95
|
+
end
|