cocoapods-links 0.1.0 → 0.2.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 +4 -4
- data/Gemfile.lock +36 -30
- data/README.md +8 -5
- data/lib/cocoapods_links.rb +1 -1
- data/lib/cocoapods_plugin.rb +1 -0
- data/lib/pod/links.rb +15 -0
- data/lib/pod/lockfile.rb +244 -0
- data/lib/pod/pod.rb +7 -1
- metadata +3 -2
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA1:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 0defda2414869d041a19060d7b9c9193f1849003
|
|
4
|
+
data.tar.gz: 1f415a1613a482f2133e1ef24ac186c02f9a280a
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 62a21ae117b79564ceaabfdb6118eef8b46837541fa0103752ed32bd4fc6c1ffe99bd349965f66a5d87fcdd7536b3ac75167f1bba4d67aa5bb236b5685e9f607
|
|
7
|
+
data.tar.gz: 9c01e974e73845a2bace2d40825fc5a7021121c3d64530e50a31f497620b030b1e71615c1665f646234f9992f198d523c92a82def2d4a0d6c764e293ca7ba7f2
|
data/Gemfile.lock
CHANGED
|
@@ -1,67 +1,70 @@
|
|
|
1
1
|
PATH
|
|
2
2
|
remote: .
|
|
3
3
|
specs:
|
|
4
|
-
cocoapods-links (0.
|
|
4
|
+
cocoapods-links (0.2.0)
|
|
5
5
|
cocoapods (~> 0.35)
|
|
6
6
|
json (~> 1.8)
|
|
7
7
|
|
|
8
8
|
GEM
|
|
9
9
|
remote: https://rubygems.org/
|
|
10
10
|
specs:
|
|
11
|
-
activesupport (4.2.
|
|
11
|
+
activesupport (4.2.5)
|
|
12
12
|
i18n (~> 0.7)
|
|
13
13
|
json (~> 1.7, >= 1.7.7)
|
|
14
14
|
minitest (~> 5.1)
|
|
15
15
|
thread_safe (~> 0.3, >= 0.3.4)
|
|
16
16
|
tzinfo (~> 1.1)
|
|
17
17
|
bacon (1.2.0)
|
|
18
|
-
claide (0.
|
|
19
|
-
cocoapods (0.
|
|
20
|
-
activesupport (>=
|
|
21
|
-
claide (~> 0.
|
|
22
|
-
cocoapods-core (= 0.
|
|
23
|
-
cocoapods-downloader (~> 0.
|
|
24
|
-
cocoapods-plugins (~> 0.
|
|
25
|
-
cocoapods-
|
|
26
|
-
cocoapods-
|
|
18
|
+
claide (0.9.1)
|
|
19
|
+
cocoapods (0.39.0)
|
|
20
|
+
activesupport (>= 4.0.2)
|
|
21
|
+
claide (~> 0.9.1)
|
|
22
|
+
cocoapods-core (= 0.39.0)
|
|
23
|
+
cocoapods-downloader (~> 0.9.3)
|
|
24
|
+
cocoapods-plugins (~> 0.4.2)
|
|
25
|
+
cocoapods-search (~> 0.1.0)
|
|
26
|
+
cocoapods-stats (~> 0.6.2)
|
|
27
|
+
cocoapods-trunk (~> 0.6.4)
|
|
28
|
+
cocoapods-try (~> 0.5.1)
|
|
27
29
|
colored (~> 1.2)
|
|
28
30
|
escape (~> 0.0.4)
|
|
29
|
-
molinillo (~> 0.
|
|
30
|
-
nap (~> 0
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
activesupport (>= 3.2.15)
|
|
31
|
+
molinillo (~> 0.4.0)
|
|
32
|
+
nap (~> 1.0)
|
|
33
|
+
xcodeproj (~> 0.28.2)
|
|
34
|
+
cocoapods-core (0.39.0)
|
|
35
|
+
activesupport (>= 4.0.2)
|
|
35
36
|
fuzzy_match (~> 2.0.4)
|
|
36
|
-
nap (~>
|
|
37
|
-
cocoapods-downloader (0.
|
|
38
|
-
cocoapods-plugins (0.
|
|
37
|
+
nap (~> 1.0)
|
|
38
|
+
cocoapods-downloader (0.9.3)
|
|
39
|
+
cocoapods-plugins (0.4.2)
|
|
39
40
|
nap
|
|
40
|
-
cocoapods-
|
|
41
|
-
|
|
41
|
+
cocoapods-search (0.1.0)
|
|
42
|
+
cocoapods-stats (0.6.2)
|
|
43
|
+
cocoapods-trunk (0.6.4)
|
|
44
|
+
nap (>= 0.8, < 2.0)
|
|
42
45
|
netrc (= 0.7.8)
|
|
43
|
-
cocoapods-try (0.
|
|
46
|
+
cocoapods-try (0.5.1)
|
|
44
47
|
colored (1.2)
|
|
45
48
|
escape (0.0.4)
|
|
46
49
|
fuzzy_match (2.0.4)
|
|
47
50
|
i18n (0.7.0)
|
|
48
|
-
json (1.8.
|
|
51
|
+
json (1.8.3)
|
|
49
52
|
metaclass (0.0.4)
|
|
50
|
-
minitest (5.
|
|
53
|
+
minitest (5.8.3)
|
|
51
54
|
mocha (1.1.0)
|
|
52
55
|
metaclass (~> 0.0.1)
|
|
53
56
|
mocha-on-bacon (0.2.2)
|
|
54
57
|
mocha (>= 0.13.0)
|
|
55
|
-
molinillo (0.1
|
|
56
|
-
nap (0.
|
|
58
|
+
molinillo (0.4.1)
|
|
59
|
+
nap (1.0.0)
|
|
57
60
|
netrc (0.7.8)
|
|
58
|
-
open4 (1.3.4)
|
|
59
61
|
rake (10.4.2)
|
|
60
|
-
thread_safe (0.3.
|
|
62
|
+
thread_safe (0.3.5)
|
|
61
63
|
tzinfo (1.2.2)
|
|
62
64
|
thread_safe (~> 0.1)
|
|
63
|
-
xcodeproj (0.
|
|
65
|
+
xcodeproj (0.28.2)
|
|
64
66
|
activesupport (>= 3)
|
|
67
|
+
claide (~> 0.9.1)
|
|
65
68
|
colored (~> 1.2)
|
|
66
69
|
|
|
67
70
|
PLATFORMS
|
|
@@ -74,3 +77,6 @@ DEPENDENCIES
|
|
|
74
77
|
mocha
|
|
75
78
|
mocha-on-bacon
|
|
76
79
|
rake
|
|
80
|
+
|
|
81
|
+
BUNDLED WITH
|
|
82
|
+
1.11.2
|
data/README.md
CHANGED
|
@@ -23,21 +23,24 @@ you modify your `Podfile`:
|
|
|
23
23
|
```ruby
|
|
24
24
|
pod 'Bar', :path => "/path/to/bar/checkout"
|
|
25
25
|
```
|
|
26
|
-
|
|
26
|
+
This development flow requires you to make a temporary change to your `Podfile`
|
|
27
27
|
that is managed by source control. Wouldn't it be great if CocoaPods offered a means to manage
|
|
28
28
|
development pods without having to alter files under source control?
|
|
29
29
|
|
|
30
30
|
Enter cocoapods-links.
|
|
31
31
|
|
|
32
|
-
|
|
32
|
+
With cocoapods-links, developers can easily test their pods using the provided link functionality.
|
|
33
33
|
Linking is a two-step process:
|
|
34
34
|
|
|
35
|
-
Using `pod link` in a project folder will register a global link. Then, in
|
|
36
|
-
`pod link <name>` will create a link to the registered pod as a
|
|
35
|
+
Using `pod link` in a project folder will register a global link. Then, in another pod,
|
|
36
|
+
`pod link <name>` will create a link to the registered pod as a development pod.
|
|
37
37
|
|
|
38
|
-
This allows to easily test a pod because changes will be reflected immediately.
|
|
38
|
+
This allows developers to easily test a pod because changes will be reflected immediately.
|
|
39
39
|
When the link is no longer necessary, simply remove it with `pod unlink <name>`.
|
|
40
40
|
|
|
41
|
+
**NOTE:** Although the `Podfile` and `Podfile.lock` will not be updated using links, the Pods xcodeproj will be updated. If you check in the contents of your Pods directory then you must make sure
|
|
42
|
+
to unlink your development pods prior to committing any changes.
|
|
43
|
+
|
|
41
44
|
## Usage
|
|
42
45
|
|
|
43
46
|
#### Register
|
data/lib/cocoapods_links.rb
CHANGED
data/lib/cocoapods_plugin.rb
CHANGED
data/lib/pod/links.rb
CHANGED
|
@@ -146,6 +146,21 @@ module Pod
|
|
|
146
146
|
end
|
|
147
147
|
end
|
|
148
148
|
|
|
149
|
+
#
|
|
150
|
+
# Get list of pods that are linked for the current pod project
|
|
151
|
+
#
|
|
152
|
+
# @return an array of installed links
|
|
153
|
+
#
|
|
154
|
+
def self.installed_links
|
|
155
|
+
installed = []
|
|
156
|
+
self.linked_pods.each do |pod|
|
|
157
|
+
unless self.get_registered_link(pod).nil?
|
|
158
|
+
installed.append(pod)
|
|
159
|
+
end
|
|
160
|
+
end
|
|
161
|
+
return installed
|
|
162
|
+
end
|
|
163
|
+
|
|
149
164
|
#
|
|
150
165
|
# Prints a formatted message with the Pod Links prefix
|
|
151
166
|
#
|
data/lib/pod/lockfile.rb
ADDED
|
@@ -0,0 +1,244 @@
|
|
|
1
|
+
require 'pod/links'
|
|
2
|
+
|
|
3
|
+
#
|
|
4
|
+
# Logic:
|
|
5
|
+
# Override of the Lockfile generation to filter out linked pods in favor of their previously
|
|
6
|
+
# installed state (e.g. the state reflected from the Podfile). This is somewhat brittle as it
|
|
7
|
+
# depends on the format of the Lockfile hash contents. If the format changes, then this will also
|
|
8
|
+
# need to be changed. It would be far better to integrate the link filtering elsewhere but this
|
|
9
|
+
# works "for now"
|
|
10
|
+
#
|
|
11
|
+
|
|
12
|
+
module Pod
|
|
13
|
+
class Lockfile
|
|
14
|
+
|
|
15
|
+
PODFILE_LOCK = "Podfile.lock"
|
|
16
|
+
|
|
17
|
+
alias_method :real_write_to_disk, :write_to_disk
|
|
18
|
+
|
|
19
|
+
#
|
|
20
|
+
# Hook the Podfile.lock file generation to allow us to filter out the links added to the
|
|
21
|
+
# Podfile.lock. The logic here is to replace the new Podfile.lock link content with what existed
|
|
22
|
+
# before the link was added. Currently, this is called for both Podfile.lock and Manifest.lock
|
|
23
|
+
# file so we only want to alter the Podfile.lock
|
|
24
|
+
#
|
|
25
|
+
# @param path path to write the .lock file to
|
|
26
|
+
#
|
|
27
|
+
def write_to_disk(path)
|
|
28
|
+
|
|
29
|
+
# code here mimics the original method but with link filtering
|
|
30
|
+
filename = File.basename(path)
|
|
31
|
+
path.dirname.mkpath unless path.dirname.exist?
|
|
32
|
+
yaml = to_link_yaml
|
|
33
|
+
File.open(path, 'w') { |f| f.write(yaml) }
|
|
34
|
+
self.defined_in_file = path
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
#
|
|
38
|
+
# Will create pretty print YAML stringfrom the links hash that is to be dumped to a Podfile.lock
|
|
39
|
+
#
|
|
40
|
+
# This code is identical to `to_yaml` except we pass the `to_link_hash` instead of the `to_hash`
|
|
41
|
+
#
|
|
42
|
+
# @returns the YAML string content to dump to a Podfile.lock without link content
|
|
43
|
+
#
|
|
44
|
+
def to_link_yaml
|
|
45
|
+
keys_hint = [
|
|
46
|
+
'PODS',
|
|
47
|
+
'DEPENDENCIES',
|
|
48
|
+
'EXTERNAL SOURCES',
|
|
49
|
+
'CHECKOUT OPTIONS',
|
|
50
|
+
'SPEC CHECKSUMS',
|
|
51
|
+
'COCOAPODS',
|
|
52
|
+
]
|
|
53
|
+
YAMLHelper.convert_hash(to_link_hash, keys_hint, "\n\n")
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
#
|
|
57
|
+
# Will get the Podfile.lock contents hash after replacing the linked content with its previous
|
|
58
|
+
# Podfile.lock information keeping the Podfile and Podfile.lock in sync and clear of any link
|
|
59
|
+
# data
|
|
60
|
+
#
|
|
61
|
+
# @returns hash that is to be dumped to the Podfile.lock file without link content
|
|
62
|
+
#
|
|
63
|
+
def to_link_hash
|
|
64
|
+
|
|
65
|
+
# retrieve the lock contents with links
|
|
66
|
+
after_hash = to_hash
|
|
67
|
+
|
|
68
|
+
unless File.exists?(PODFILE_LOCK)
|
|
69
|
+
return after_hash
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
# retrieve the lock content before the links
|
|
73
|
+
before_hash = YAML.load(File.read(PODFILE_LOCK))
|
|
74
|
+
|
|
75
|
+
# retrieve installed links
|
|
76
|
+
links = Pod::Command::Links.installed_links
|
|
77
|
+
|
|
78
|
+
#
|
|
79
|
+
# Logic:
|
|
80
|
+
# Here we will replace anything that changed in the contents that will be dumped in the
|
|
81
|
+
# Podfile.lock due to links with the data that previously exists in the Podfile.lock. This
|
|
82
|
+
# allows the Podfile.lock with the dependency trees to remain unchanged when linking
|
|
83
|
+
# developement pods. The Podfile.lock contains several keys, but we only need to alter the
|
|
84
|
+
# following:
|
|
85
|
+
#
|
|
86
|
+
# - PODS
|
|
87
|
+
# - DEPENDENCIES
|
|
88
|
+
# - EXTERNAL SOURCES
|
|
89
|
+
# - CHECKOUT OPTIONS
|
|
90
|
+
# - SPEC CHECKSUMS
|
|
91
|
+
#
|
|
92
|
+
after_hash['PODS'] =
|
|
93
|
+
merge_pods links, before_hash['PODS'], after_hash['PODS']
|
|
94
|
+
|
|
95
|
+
after_hash['DEPENDENCIES'] =
|
|
96
|
+
merge_dependencies links, before_hash['DEPENDENCIES'], after_hash['DEPENDENCIES']
|
|
97
|
+
|
|
98
|
+
after_hash['EXTERNAL SOURCES'] =
|
|
99
|
+
merge_hashes links, before_hash['EXTERNAL SOURCES'], after_hash['EXTERNAL SOURCES']
|
|
100
|
+
|
|
101
|
+
after_hash['CHECKOUT OPTIONS'] =
|
|
102
|
+
merge_hashes links, before_hash['CHECKOUT OPTIONS'], after_hash['CHECKOUT OPTIONS']
|
|
103
|
+
|
|
104
|
+
after_hash['SPEC CHECKSUMS'] =
|
|
105
|
+
merge_hashes links, before_hash['SPEC CHECKSUMS'], after_hash['SPEC CHECKSUMS']
|
|
106
|
+
|
|
107
|
+
return after_hash
|
|
108
|
+
end
|
|
109
|
+
|
|
110
|
+
def merge_pods(links, before, after)
|
|
111
|
+
links.each do |link|
|
|
112
|
+
before_index = find_pod_index before, link
|
|
113
|
+
after_index = find_pod_index after, link
|
|
114
|
+
unless before_index.nil? || after_index.nil?
|
|
115
|
+
|
|
116
|
+
# get previous value
|
|
117
|
+
after_value = after[after_index]
|
|
118
|
+
|
|
119
|
+
# update new value
|
|
120
|
+
after[after_index] = before[before_index]
|
|
121
|
+
|
|
122
|
+
# iterate and update all dependencies of previous value
|
|
123
|
+
if after_value.is_a?(Hash)
|
|
124
|
+
|
|
125
|
+
# clean all deps that may have been added as new deps
|
|
126
|
+
after_value[after_value.keys[0]].each do |key|
|
|
127
|
+
# key: CocoaLumberjack/Core or CocoaLumberjack/Extensions (= 1.9.2)
|
|
128
|
+
key_desc = key.split(" (", 2)[0]
|
|
129
|
+
|
|
130
|
+
inner_after_index = find_pod_index after, key_desc
|
|
131
|
+
inner_before_index = find_pod_index before, key_desc
|
|
132
|
+
|
|
133
|
+
unless inner_before_index.nil? && inner_after_index.nil?
|
|
134
|
+
after[inner_after_index] = before[inner_before_index]
|
|
135
|
+
else
|
|
136
|
+
# if it was removed in the new deps
|
|
137
|
+
unless before_index.nil?
|
|
138
|
+
after.insert(before_index, before[before_index])
|
|
139
|
+
end
|
|
140
|
+
end
|
|
141
|
+
end
|
|
142
|
+
end
|
|
143
|
+
end
|
|
144
|
+
end
|
|
145
|
+
return after
|
|
146
|
+
end
|
|
147
|
+
|
|
148
|
+
#
|
|
149
|
+
# Will merge the DEPENDENCIES of the Podfile.lock before a link and after a link
|
|
150
|
+
#
|
|
151
|
+
# @param links the installed links
|
|
152
|
+
# @param before the DEPENDENCIES in the Podfile.lock before the link occurs
|
|
153
|
+
# @param after the DEPENDENCIES after the link (includes new link that we want to filter out)
|
|
154
|
+
#
|
|
155
|
+
# @returns the merged DEPENDENCIES replacing any links that were added with their previous value
|
|
156
|
+
#
|
|
157
|
+
def merge_dependencies(links, before, after)
|
|
158
|
+
links.each do |link|
|
|
159
|
+
before_index = find_dependency_index before, link
|
|
160
|
+
after_index = find_dependency_index after, link
|
|
161
|
+
unless before_index.nil? || after_index.nil?
|
|
162
|
+
after[after_index] = before[before_index]
|
|
163
|
+
end
|
|
164
|
+
end
|
|
165
|
+
return after
|
|
166
|
+
end
|
|
167
|
+
|
|
168
|
+
#
|
|
169
|
+
# Will merge the hashes of the Podfile.lock before a link and after a link
|
|
170
|
+
#
|
|
171
|
+
# @param links the installed links
|
|
172
|
+
# @param before the hash in the Podfile.lock before the link occurs
|
|
173
|
+
# @param after the hash after the link (includes new link that we want to filter out)
|
|
174
|
+
#
|
|
175
|
+
# @returns the merged hash replacing any links that were added with their previous value
|
|
176
|
+
#
|
|
177
|
+
def merge_hashes(links, before, after)
|
|
178
|
+
if before.nil?
|
|
179
|
+
return after
|
|
180
|
+
end
|
|
181
|
+
links.each do |link|
|
|
182
|
+
if before.has_key?(link)
|
|
183
|
+
after[link] = before[link]
|
|
184
|
+
else
|
|
185
|
+
if after.has_key?(link)
|
|
186
|
+
after.delete(link)
|
|
187
|
+
end
|
|
188
|
+
end
|
|
189
|
+
end
|
|
190
|
+
return after
|
|
191
|
+
end
|
|
192
|
+
|
|
193
|
+
private
|
|
194
|
+
|
|
195
|
+
#
|
|
196
|
+
# Find the index in the pod array based on the link name. The pod array
|
|
197
|
+
# also contains version/path information so we need to massage the pod value
|
|
198
|
+
# for comparison. Pods are in the following format:
|
|
199
|
+
#
|
|
200
|
+
# Name (requirements)
|
|
201
|
+
#
|
|
202
|
+
# Example:
|
|
203
|
+
# Alamofire (= 1.1.3)
|
|
204
|
+
#
|
|
205
|
+
# @param pods the array to search
|
|
206
|
+
# @param name the name of the pod to find
|
|
207
|
+
#
|
|
208
|
+
# NOTE: the pods in the array can be strings or hashes, so we will check for both
|
|
209
|
+
#
|
|
210
|
+
# @return the index of nil
|
|
211
|
+
#
|
|
212
|
+
def find_pod_index(pods, name)
|
|
213
|
+
pods.index { |pod|
|
|
214
|
+
desc = pod
|
|
215
|
+
if pod.is_a?(Hash)
|
|
216
|
+
desc = pod.keys[0]
|
|
217
|
+
end
|
|
218
|
+
desc.split(" (", 2)[0] == name
|
|
219
|
+
}
|
|
220
|
+
end
|
|
221
|
+
|
|
222
|
+
#
|
|
223
|
+
# Find the index in the dependency array based on the link name. The dependency array
|
|
224
|
+
# also contains version/path information so we need to massage the dependency value
|
|
225
|
+
# for comparison. Dependencies are in the following format:
|
|
226
|
+
#
|
|
227
|
+
# Name (requirements)
|
|
228
|
+
#
|
|
229
|
+
# Example:
|
|
230
|
+
# Alamofire (= 1.1.3)
|
|
231
|
+
# Quick (from `https://github.com/Quick/Quick`, tag `v0.2.2`)
|
|
232
|
+
#
|
|
233
|
+
# @param dependencies the array to search
|
|
234
|
+
# @param name the name of the dependency to find
|
|
235
|
+
#
|
|
236
|
+
# @returns the index of nil
|
|
237
|
+
#
|
|
238
|
+
def find_dependency_index(dependencies, name)
|
|
239
|
+
dependencies.index { |dependency|
|
|
240
|
+
dependency.split(" (", 2)[0] == name
|
|
241
|
+
}
|
|
242
|
+
end
|
|
243
|
+
end
|
|
244
|
+
end
|
data/lib/pod/pod.rb
CHANGED
|
@@ -15,7 +15,13 @@ module Pod
|
|
|
15
15
|
# via the link instead of the provided requirements (e.g. it will setup local pod development
|
|
16
16
|
# for the link). If the link does not exist, then the pod will be installed normally
|
|
17
17
|
#
|
|
18
|
-
|
|
18
|
+
|
|
19
|
+
# handle subspec link
|
|
20
|
+
linked_name = name
|
|
21
|
+
if name.include? "/"
|
|
22
|
+
linked_name = name.split("/")[0]
|
|
23
|
+
end
|
|
24
|
+
link = Pod::Command::Links.get_link(linked_name)
|
|
19
25
|
unless link.nil?
|
|
20
26
|
Pod::Command::Links.print "Using link '#{name}' > #{link['path']}"
|
|
21
27
|
real_pod(name, :path => link['path'], &block)
|
metadata
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: cocoapods-links
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.
|
|
4
|
+
version: 0.2.0
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Mike Owens
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: bin
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date:
|
|
11
|
+
date: 2016-01-21 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: cocoapods
|
|
@@ -90,6 +90,7 @@ files:
|
|
|
90
90
|
- lib/pod/command/list.rb
|
|
91
91
|
- lib/pod/command/unlink.rb
|
|
92
92
|
- lib/pod/links.rb
|
|
93
|
+
- lib/pod/lockfile.rb
|
|
93
94
|
- lib/pod/pod.rb
|
|
94
95
|
- spec/command/link_spec.rb
|
|
95
96
|
- spec/command/list_spec.rb
|