skippy 0.2.0.a → 0.3.0.a

Sign up to get free protection for your applications and to get access to all the features.
Files changed (75) hide show
  1. checksums.yaml +5 -5
  2. data/.gitignore +1 -0
  3. data/.gitmodules +3 -0
  4. data/.idea/.rakeTasks +6 -6
  5. data/.idea/codeStyleSettings.xml +8 -8
  6. data/.idea/encodings.xml +5 -5
  7. data/.idea/inspectionProfiles/Project_Default.xml +7 -7
  8. data/.idea/misc.xml +3 -3
  9. data/.idea/modules.xml +7 -7
  10. data/.idea/skippy.iml +89 -82
  11. data/.idea/vcs.xml +5 -5
  12. data/.rubocop.yml +93 -0
  13. data/.rubocop_todo.yml +24 -0
  14. data/.vscode/launch.json +51 -61
  15. data/.vscode/settings.json +41 -2
  16. data/.vscode/tasks.json +16 -16
  17. data/Gemfile +11 -2
  18. data/README.md +194 -15
  19. data/Rakefile +1 -1
  20. data/app/boot.rb +1 -1
  21. data/app/commands/install.rb +41 -0
  22. data/app/commands/lib.rb +42 -2
  23. data/app/commands/new.rb +22 -8
  24. data/app/commands/template.rb +2 -2
  25. data/bin/rubocop +17 -0
  26. data/bin/ruby-parse +17 -0
  27. data/bin/ruby-rewrite +17 -0
  28. data/debug/skippy.bat +2 -0
  29. data/fixtures/my_lib/{src → modules}/command.rb +0 -0
  30. data/fixtures/my_lib/{src → modules}/geometry.rb +0 -0
  31. data/fixtures/my_lib/modules/gl.rb +4 -0
  32. data/fixtures/my_lib/modules/gl/container.rb +8 -0
  33. data/fixtures/my_lib/modules/gl/control.rb +6 -0
  34. data/fixtures/my_lib/modules/gl/nested/nested.rb +8 -0
  35. data/fixtures/my_lib/{src → modules}/tool.rb +0 -0
  36. data/fixtures/my_lib/skippy.json +1 -1
  37. data/fixtures/my_project/skippy.json +2 -1
  38. data/fixtures/my_project/src/hello_world.rb +2 -2
  39. data/fixtures/my_project/src/hello_world/extension.json +9 -9
  40. data/fixtures/project_with_lib/.skippy/libs/my-lib/modules/command.rb +4 -0
  41. data/fixtures/project_with_lib/.skippy/libs/my-lib/modules/gl.rb +4 -0
  42. data/fixtures/project_with_lib/.skippy/libs/my-lib/modules/gl/container.rb +8 -0
  43. data/fixtures/project_with_lib/.skippy/libs/my-lib/modules/gl/control.rb +6 -0
  44. data/fixtures/project_with_lib/.skippy/libs/my-lib/skippy.json +5 -0
  45. data/fixtures/project_with_lib/.skippy/libs/my-other-lib/modules/something.rb +4 -0
  46. data/fixtures/project_with_lib/.skippy/libs/my-other-lib/skippy.json +5 -0
  47. data/fixtures/project_with_lib/skippy.json +25 -0
  48. data/fixtures/project_with_lib/skippy/commands/example.rb +14 -0
  49. data/fixtures/project_with_lib/src/hello_world.rb +47 -0
  50. data/fixtures/project_with_lib/src/hello_world/extension.json +10 -0
  51. data/fixtures/project_with_lib/src/hello_world/main.rb +21 -0
  52. data/fixtures/project_with_lib/src/hello_world/vendor/my-lib/command.rb +4 -0
  53. data/fixtures/project_with_lib/src/hello_world/vendor/my-other-lib/something.rb +4 -0
  54. data/lib/skippy.rb +2 -0
  55. data/lib/skippy/app.rb +2 -2
  56. data/lib/skippy/cli.rb +41 -20
  57. data/lib/skippy/command.rb +2 -4
  58. data/lib/skippy/config.rb +27 -22
  59. data/lib/skippy/config_accessors.rb +12 -12
  60. data/lib/skippy/group.rb +1 -3
  61. data/lib/skippy/helpers/file.rb +3 -3
  62. data/lib/skippy/installer.rb +49 -0
  63. data/lib/skippy/installer/git.rb +115 -0
  64. data/lib/skippy/installer/local.rb +19 -0
  65. data/lib/skippy/lib_module.rb +16 -16
  66. data/lib/skippy/lib_source.rb +139 -0
  67. data/lib/skippy/library.rb +50 -10
  68. data/lib/skippy/library_manager.rb +116 -18
  69. data/lib/skippy/module_manager.rb +104 -26
  70. data/lib/skippy/namespace.rb +17 -1
  71. data/lib/skippy/project.rb +34 -4
  72. data/lib/skippy/version.rb +3 -1
  73. data/skippy.gemspec +10 -5
  74. metadata +85 -29
  75. data/cSpell.json +0 -18
@@ -1,5 +1,7 @@
1
+ require 'fileutils'
1
2
  require 'json'
2
3
  require 'pathname'
4
+ require 'set'
3
5
 
4
6
  require 'skippy/helpers/file'
5
7
  require 'skippy/lib_module'
@@ -16,17 +18,12 @@ class Skippy::ModuleManager
16
18
  def initialize(project)
17
19
  raise TypeError, 'expected a Project' unless project.is_a?(Skippy::Project)
18
20
  @project = project
21
+ @modules = SortedSet.new(discover_modules)
19
22
  end
20
23
 
21
24
  # @yield [Skippy::LibModule]
22
25
  def each
23
- directories(path).each { |library_path|
24
- library_path.each_child { |module_file|
25
- next unless module_file.file?
26
- next unless module_file.extname == '.rb'
27
- yield Skippy::LibModule.new(module_file)
28
- }
29
- }
26
+ @modules.each { |lib_module| yield lib_module }
30
27
  self
31
28
  end
32
29
 
@@ -37,33 +34,52 @@ class Skippy::ModuleManager
37
34
  # @param [String] module_name
38
35
  # @return [Skippy::LibModule, nil]
39
36
  def find_module(module_name)
40
- find { |lib_module| lib_module.name == module_name }
37
+ find { |lib_module| lib_module.name.casecmp(module_name).zero? }
41
38
  end
42
39
 
43
40
  # @param [Skippy::LibModule, String] lib_module
44
41
  def installed?(lib_module)
45
- module_name = lib_module.is_a?(Skippy::LibModule) ? lib_module.name : lib_module
46
- project = Skippy::Project.current
47
- project && project.config.get(:modules, []).any? { |mod| mod == module_name }
42
+ module_name = lib_module.name
43
+ modules = project && project.config.get(:modules, [])
44
+ modules.any? { |mod| mod.casecmp(module_name).zero? }
48
45
  end
49
46
 
50
47
  # @param [String] module_name
51
48
  # @return [Skippy::LibModule]
52
49
  def use(module_name)
53
50
  raise Skippy::Project::ProjectNotSavedError unless project.exist?
54
-
55
- lib_module = project.libraries.find_module(module_name)
56
- raise Skippy::LibModule::ModuleNotFoundError,
57
- "module '#{module_name}' not found" if lib_module.nil?
51
+ lib_module = project.libraries.find_module_or_fail(module_name)
58
52
 
59
53
  source = lib_module.path
60
- target = path.join(lib_module.library.name, lib_module.path.basename)
54
+ target = vendor_path.join(lib_module.library.name, lib_module.path.basename)
55
+
56
+ copy_module(lib_module, source, target)
57
+ @modules << lib_module
58
+
59
+ lib_module
60
+ end
61
+
62
+ # @param [Skippy::Library]
63
+ # @return [Array<Skippy::LibModule>]
64
+ def update(library)
65
+ raise Skippy::Project::ProjectNotSavedError unless project.exist?
66
+ installed = select { |mod| mod.library.name.casecmp(library.name).zero? }
67
+ installed.each { |mod| use(mod.name) }
68
+ installed
69
+ end
61
70
 
62
- copy_module(source, target)
71
+ # @param [String] module_name
72
+ # @return [Skippy::LibModule]
73
+ def remove(module_name)
74
+ raise Skippy::Project::ProjectNotSavedError unless project.exist?
75
+ lib_module = project.libraries.find_module_or_fail(module_name)
63
76
 
64
- project.config.push(:modules, lib_module.to_s)
77
+ target = vendor_path.join(lib_module.library.name, lib_module.path.basename)
78
+ support = vendor_path.join(lib_module.library.name, lib_module.basename)
79
+ target.delete if target.exist?
80
+ support.rmtree if support.directory?
65
81
 
66
- project.save
82
+ @modules.delete_if { |mod| mod.name.casecmp(lib_module.name).zero? }
67
83
 
68
84
  lib_module
69
85
  end
@@ -72,22 +88,70 @@ class Skippy::ModuleManager
72
88
  def length
73
89
  to_a.length
74
90
  end
75
- alias :size :length
91
+ alias size length
76
92
 
77
93
  # @return [Pathname]
78
- def path
79
- project.path.join('src', project.namespace.to_underscore, 'vendor')
94
+ def vendor_path
95
+ project.extension_source.join(project.basename, 'vendor')
80
96
  end
81
97
 
82
98
  private
83
99
 
100
+ # @return [Array<Skippy::LibModule>]
101
+ def discover_modules
102
+ modules = []
103
+ project.libraries.each { |library|
104
+ library_vendor_path = vendor_path.join(library.name)
105
+ next unless library_vendor_path.directory?
106
+ library_vendor_path.each_child { |module_file|
107
+ next unless module_file.file?
108
+ next unless module_file.extname.casecmp('.rb').zero?
109
+ modules << Skippy::LibModule.new(library, module_file)
110
+ }
111
+ }
112
+ modules
113
+ end
114
+
115
+ # @param [Skippy::LibModule] lib_module
116
+ # @param [Pathname, String] source
117
+ # @param [Pathname, String] target
118
+ def copy_module(lib_module, source, target)
119
+ # Copy the main library file.
120
+ copy_file(lib_module, source, target)
121
+ # Copy optional support folder.
122
+ basename = source.basename('.*')
123
+ source_support_folder = source.parent.join(basename)
124
+ return unless source_support_folder.directory?
125
+ target_support_folder = target.parent.join(basename)
126
+ copy_directory(lib_module, source_support_folder, target_support_folder)
127
+ end
128
+
129
+ # @param [Skippy::LibModule] lib_module
84
130
  # @param [Pathname, String] source
85
131
  # @param [Pathname, String] target
86
- def copy_module(source, target)
132
+ def copy_directory(lib_module, source_path, target_path)
133
+ Dir.glob("#{source_path}/**/*") { |filename|
134
+ source = Pathname.new(filename)
135
+ next unless source.file?
136
+ relative_path = source.relative_path_from(source_path)
137
+ target = target_path.join(relative_path)
138
+ copy_file(lib_module, source, target)
139
+ }
140
+ end
141
+
142
+ # @param [Skippy::LibModule] lib_module
143
+ # @param [Pathname, String] source
144
+ # @param [Pathname, String] target
145
+ def copy_file(lib_module, source, target)
87
146
  FileUtils.mkdir_p(target.parent)
88
- content = File.read(source)
89
- transform_module(content)
90
- File.write(target, content)
147
+ if source.extname.casecmp('.rb').zero?
148
+ content = File.read(source)
149
+ transform_require(lib_module, content)
150
+ transform_module(content)
151
+ File.write(target, content)
152
+ else
153
+ File.copy(source, target)
154
+ end
91
155
  end
92
156
 
93
157
  # Transform the module content with `SkippyLib` placeholder replaced with
@@ -100,4 +164,18 @@ class Skippy::ModuleManager
100
164
  content
101
165
  end
102
166
 
167
+ LIB_REQUIRE_PATTERN = %r{(\brequire ["'])(modules)(/[^"']*["'])}
168
+
169
+ # Transform the require statements to the target destination.
170
+ #
171
+ # @param [Skippy::LibModule] lib_module
172
+ # @param [String] content
173
+ # @return [String]
174
+ def transform_require(lib_module, content)
175
+ relative_path = vendor_path.relative_path_from(project.extension_source)
176
+ target_path = relative_path.join(lib_module.library.name)
177
+ content.gsub!(LIB_REQUIRE_PATTERN, "\\1#{target_path}\\3")
178
+ content
179
+ end
180
+
103
181
  end
@@ -13,6 +13,22 @@ class Skippy::Namespace
13
13
  to_a.last
14
14
  end
15
15
 
16
+ # Creates a compact string from the namespace. First part composed of the
17
+ # capitals from the first part followed by the last item of the namespace.
18
+ #
19
+ # The prefix will always have at least two characters.
20
+ #
21
+ # If the namespace isn't nested it will just return the namespace string.
22
+ #
23
+ # @return [String]
24
+ def short_name
25
+ items = to_a
26
+ return to_s unless items.size > 1
27
+ initials = items.first.scan(/[[:upper:]]/)
28
+ prefix = initials.size > 1 ? initials.join : items.first[0, 2]
29
+ "#{prefix}_#{items.last}"
30
+ end
31
+
16
32
  def open
17
33
  @open ||= to_a.map { |part| "module #{part}" }.join("\n")
18
34
  end
@@ -38,7 +54,7 @@ class Skippy::Namespace
38
54
  end
39
55
 
40
56
  def to_underscore
41
- basename_words(basename).map { |word| word.downcase }.join('_')
57
+ basename_words(basename).map(&:downcase).join('_')
42
58
  end
43
59
 
44
60
  private
@@ -34,8 +34,8 @@ class Skippy::Project
34
34
 
35
35
  # @return [Skippy::Project]
36
36
  def self.current_or_fail
37
- project = self.current
38
- raise ProjectNotFoundError unless project.exist?
37
+ project = current
38
+ raise ProjectNotFoundError, project.filename unless project.exist?
39
39
  project
40
40
  end
41
41
 
@@ -52,12 +52,24 @@ class Skippy::Project
52
52
  @modules = Skippy::ModuleManager.new(self)
53
53
  end
54
54
 
55
+ # The basename for the extension's root and support folder.
56
+ #
57
+ # @return [String]
58
+ def basename
59
+ @config.get(:basename, namespace.short_name)
60
+ end
61
+
62
+ # @param [String] basename
63
+ def basename=(basename)
64
+ @config.set(:basename, basename)
65
+ end
66
+
55
67
  # @yield [filename]
56
68
  # @yieldparam [String] filename the path to custom Skippy command
57
- def command_files(&block)
69
+ def command_files
58
70
  files_pattern = File.join(path, 'skippy', '**', '*.rb')
59
71
  Dir.glob(files_pattern) { |filename|
60
- block.call(filename)
72
+ yield filename
61
73
  }
62
74
  end
63
75
 
@@ -80,9 +92,21 @@ class Skippy::Project
80
92
 
81
93
  # Commits the project to disk.
82
94
  def save
95
+ @config.set(:libraries, libraries.map(&:to_h))
96
+ @config.set(:modules, modules.map(&:name))
83
97
  @config.save_as(filename)
84
98
  end
85
99
 
100
+ # @return [Pathname]
101
+ def extension_source
102
+ path.join('src')
103
+ end
104
+
105
+ # @return [Array<String>]
106
+ def sources
107
+ @config.get(:sources, defaults[:sources])
108
+ end
109
+
86
110
  # @return [String]
87
111
  def to_json
88
112
  JSON.pretty_generate(@config)
@@ -90,14 +114,20 @@ class Skippy::Project
90
114
 
91
115
  private
92
116
 
117
+ # @return [Hash]
93
118
  def defaults
94
119
  {
95
120
  name: 'Untitled',
96
121
  description: '',
97
122
  namespace: Skippy::Namespace.new('Untitled'),
123
+ basename: Skippy::Namespace.new('Untitled').short_name,
98
124
  author: 'Unknown',
99
125
  copyright: "Copyright (c) #{Time.now.year}",
100
126
  license: 'None',
127
+ sources: %w(
128
+ github.com
129
+ bitbucket.org
130
+ ),
101
131
  }
102
132
  end
103
133
 
@@ -1,3 +1,5 @@
1
1
  module Skippy
2
- VERSION = '0.2.0.a'.freeze
2
+
3
+ VERSION = '0.3.0.a'.freeze
4
+
3
5
  end
data/skippy.gemspec CHANGED
@@ -1,4 +1,5 @@
1
- # coding: utf-8
1
+ # rubocop:disable all
2
+
2
3
  lib = File.expand_path('../lib', __FILE__)
3
4
  $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
5
  require 'skippy/version'
@@ -23,11 +24,15 @@ Gem::Specification.new do |spec|
23
24
  spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
24
25
  spec.require_paths = ['lib']
25
26
 
27
+ spec.add_dependency 'git', '~> 1.3'
28
+ spec.add_dependency 'naturally', '~> 2.1'
29
+ spec.add_dependency 'thor', '~> 0.19'
30
+
26
31
  spec.add_development_dependency 'bundler', '~> 1.13'
27
32
  spec.add_development_dependency 'rake', '~> 10.0'
28
33
  spec.add_development_dependency 'minitest', '~> 5.0'
29
- spec.add_development_dependency 'cucumber'
30
- spec.add_development_dependency 'aruba'
31
-
32
- spec.add_dependency 'thor'
34
+ # TODO(thomthom): Need to lock to 2.3 because 2.4 fails with the custom
35
+ # aruba build.
36
+ spec.add_development_dependency 'cucumber', '~> 2.3.0'
37
+ spec.add_development_dependency 'aruba', '~> 0.14.1'
33
38
  end
metadata CHANGED
@@ -1,15 +1,57 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: skippy
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0.a
4
+ version: 0.3.0.a
5
5
  platform: ruby
6
6
  authors:
7
7
  - Thomas Thomassen
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2017-01-27 00:00:00.000000000 Z
11
+ date: 2017-12-19 00:00:00.000000000 Z
12
12
  dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: git
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '1.3'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '1.3'
27
+ - !ruby/object:Gem::Dependency
28
+ name: naturally
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '2.1'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '2.1'
41
+ - !ruby/object:Gem::Dependency
42
+ name: thor
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '0.19'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '0.19'
13
55
  - !ruby/object:Gem::Dependency
14
56
  name: bundler
15
57
  requirement: !ruby/object:Gem::Requirement
@@ -56,44 +98,30 @@ dependencies:
56
98
  name: cucumber
57
99
  requirement: !ruby/object:Gem::Requirement
58
100
  requirements:
59
- - - ">="
101
+ - - "~>"
60
102
  - !ruby/object:Gem::Version
61
- version: '0'
103
+ version: 2.3.0
62
104
  type: :development
63
105
  prerelease: false
64
106
  version_requirements: !ruby/object:Gem::Requirement
65
107
  requirements:
66
- - - ">="
108
+ - - "~>"
67
109
  - !ruby/object:Gem::Version
68
- version: '0'
110
+ version: 2.3.0
69
111
  - !ruby/object:Gem::Dependency
70
112
  name: aruba
71
113
  requirement: !ruby/object:Gem::Requirement
72
114
  requirements:
73
- - - ">="
115
+ - - "~>"
74
116
  - !ruby/object:Gem::Version
75
- version: '0'
117
+ version: 0.14.1
76
118
  type: :development
77
119
  prerelease: false
78
120
  version_requirements: !ruby/object:Gem::Requirement
79
121
  requirements:
80
- - - ">="
81
- - !ruby/object:Gem::Version
82
- version: '0'
83
- - !ruby/object:Gem::Dependency
84
- name: thor
85
- requirement: !ruby/object:Gem::Requirement
86
- requirements:
87
- - - ">="
88
- - !ruby/object:Gem::Version
89
- version: '0'
90
- type: :runtime
91
- prerelease: false
92
- version_requirements: !ruby/object:Gem::Requirement
93
- requirements:
94
- - - ">="
122
+ - - "~>"
95
123
  - !ruby/object:Gem::Version
96
- version: '0'
124
+ version: 0.14.1
97
125
  description: Automate common tasks for SketchUp extension development, including managing
98
126
  library dependencies.
99
127
  email:
@@ -105,6 +133,7 @@ extra_rdoc_files: []
105
133
  files:
106
134
  - ".editorconfig"
107
135
  - ".gitignore"
136
+ - ".gitmodules"
108
137
  - ".idea/.rakeTasks"
109
138
  - ".idea/codeStyleSettings.xml"
110
139
  - ".idea/encodings.xml"
@@ -115,6 +144,8 @@ files:
115
144
  - ".idea/runConfigurations/test__skippy.xml"
116
145
  - ".idea/skippy.iml"
117
146
  - ".idea/vcs.xml"
147
+ - ".rubocop.yml"
148
+ - ".rubocop_todo.yml"
118
149
  - ".vscode/launch.json"
119
150
  - ".vscode/settings.json"
120
151
  - ".vscode/tasks.json"
@@ -125,6 +156,7 @@ files:
125
156
  - Skippy.sublime-project
126
157
  - app/boot.rb
127
158
  - app/commands/debug.rb
159
+ - app/commands/install.rb
128
160
  - app/commands/lib.rb
129
161
  - app/commands/new.rb
130
162
  - app/commands/template.rb
@@ -141,21 +173,41 @@ files:
141
173
  - bin/htmldiff
142
174
  - bin/ldiff
143
175
  - bin/rake
176
+ - bin/rubocop
177
+ - bin/ruby-parse
178
+ - bin/ruby-rewrite
144
179
  - bin/setup
145
180
  - bin/skippy
146
181
  - bin/thor
147
- - cSpell.json
148
182
  - debug/skippy.bat
149
183
  - exe/skippy
184
+ - fixtures/my_lib/modules/command.rb
185
+ - fixtures/my_lib/modules/geometry.rb
186
+ - fixtures/my_lib/modules/gl.rb
187
+ - fixtures/my_lib/modules/gl/container.rb
188
+ - fixtures/my_lib/modules/gl/control.rb
189
+ - fixtures/my_lib/modules/gl/nested/nested.rb
190
+ - fixtures/my_lib/modules/tool.rb
150
191
  - fixtures/my_lib/skippy.json
151
- - fixtures/my_lib/src/command.rb
152
- - fixtures/my_lib/src/geometry.rb
153
- - fixtures/my_lib/src/tool.rb
154
192
  - fixtures/my_project/skippy.json
155
193
  - fixtures/my_project/skippy/commands/example.rb
156
194
  - fixtures/my_project/src/hello_world.rb
157
195
  - fixtures/my_project/src/hello_world/extension.json
158
196
  - fixtures/my_project/src/hello_world/main.rb
197
+ - fixtures/project_with_lib/.skippy/libs/my-lib/modules/command.rb
198
+ - fixtures/project_with_lib/.skippy/libs/my-lib/modules/gl.rb
199
+ - fixtures/project_with_lib/.skippy/libs/my-lib/modules/gl/container.rb
200
+ - fixtures/project_with_lib/.skippy/libs/my-lib/modules/gl/control.rb
201
+ - fixtures/project_with_lib/.skippy/libs/my-lib/skippy.json
202
+ - fixtures/project_with_lib/.skippy/libs/my-other-lib/modules/something.rb
203
+ - fixtures/project_with_lib/.skippy/libs/my-other-lib/skippy.json
204
+ - fixtures/project_with_lib/skippy.json
205
+ - fixtures/project_with_lib/skippy/commands/example.rb
206
+ - fixtures/project_with_lib/src/hello_world.rb
207
+ - fixtures/project_with_lib/src/hello_world/extension.json
208
+ - fixtures/project_with_lib/src/hello_world/main.rb
209
+ - fixtures/project_with_lib/src/hello_world/vendor/my-lib/command.rb
210
+ - fixtures/project_with_lib/src/hello_world/vendor/my-other-lib/something.rb
159
211
  - lib/skippy.rb
160
212
  - lib/skippy/app.rb
161
213
  - lib/skippy/cli.rb
@@ -165,7 +217,11 @@ files:
165
217
  - lib/skippy/error.rb
166
218
  - lib/skippy/group.rb
167
219
  - lib/skippy/helpers/file.rb
220
+ - lib/skippy/installer.rb
221
+ - lib/skippy/installer/git.rb
222
+ - lib/skippy/installer/local.rb
168
223
  - lib/skippy/lib_module.rb
224
+ - lib/skippy/lib_source.rb
169
225
  - lib/skippy/library.rb
170
226
  - lib/skippy/library_manager.rb
171
227
  - lib/skippy/module_manager.rb
@@ -193,7 +249,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
193
249
  version: 1.3.1
194
250
  requirements: []
195
251
  rubyforge_project:
196
- rubygems_version: 2.5.2
252
+ rubygems_version: 2.7.3
197
253
  signing_key:
198
254
  specification_version: 4
199
255
  summary: CLI development tool for SketchUp extensions.