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,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