@@ -22,18 +22,41 @@ class Repo:
22
22
:param str source_dir: the location of the repo archive (e.g., C://.../sample-programs/archive)
23
23
"""
24
24
25
- def __init__ (self , source_dir : Optional [str ] = None ) -> None :
26
- self ._temp_dir = tempfile .TemporaryDirectory ()
27
- self ._source_dir : str = self ._generate_source_dir (source_dir )
28
- self ._git_repo : git .Repo = self ._generate_git_repo ()
29
- self ._docs_dir : str = self ._generate_docs_dir (source_dir )
25
+ def __init__ (self , sample_programs_repo_dir : Optional [str ] = None , sample_programs_website_repo_dir : Optional [str ] = None ) -> None :
26
+
27
+ # Sets up the sample programs repo variables
28
+ self ._sample_programs_temp_dir = tempfile .TemporaryDirectory ()
29
+ self ._sample_programs_repo_dir = self ._sample_programs_temp_dir .name
30
+ if sample_programs_repo_dir :
31
+ self ._sample_programs_repo_dir = sample_programs_repo_dir
32
+ self ._sample_programs_repo : git .Repo = git .Repo (self ._sample_programs_repo_dir , search_parent_directories = True )
33
+ else :
34
+ self ._sample_programs_repo : git .Repo = git .Repo .clone_from ("https://github.com/TheRenegadeCoder/sample-programs.git" , self ._sample_programs_repo_dir )
35
+
36
+ # Sets up the sample programs website repo variables
37
+ self ._sample_programs_website_temp_dir = tempfile .TemporaryDirectory ()
38
+ self ._sample_programs_website_repo_dir = self ._sample_programs_website_temp_dir .name
39
+ if sample_programs_website_repo_dir :
40
+ self ._sample_programs_website_repo_dir = sample_programs_website_repo_dir
41
+ self ._sample_programs_website_repo : git .Repo = git .Repo (self ._sample_programs_website_repo_dir , search_parent_directories = True )
42
+ else :
43
+ self ._sample_programs_website_repo : git .Repo = git .Repo .clone_from ("https://github.com/TheRenegadeCoder/sample-programs-website.git" , self ._sample_programs_website_repo_dir )
44
+
45
+ # Sets up paths to relevant directories
46
+ self ._docs_dir : str = os .path .join (self ._sample_programs_website_repo_dir , "docs" )
47
+ self ._archive_dir : str = os .path .join (self ._sample_programs_repo_dir , "archive" )
48
+
49
+ # Performs data collection from the repos
30
50
self ._tested_projects : Dict = self ._collect_tested_projects ()
31
51
self ._projects : List [Project ] = self ._collect_projects ()
32
52
self ._languages : Dict [str : LanguageCollection ] = self ._collect_languages ()
33
53
self ._total_snippets : int = sum (x .total_programs () for _ , x in self ._languages .items ())
34
54
self ._total_tests : int = sum (1 for _ , x in self ._languages .items () if x .has_testinfo ())
35
55
self ._load_git_data ()
36
- self ._git_repo .close () # Closes the repo before cleaning up the temp dir
56
+
57
+ # Closes repositories
58
+ self ._sample_programs_repo .close ()
59
+ self ._sample_programs_website_repo .close ()
37
60
38
61
def __getitem__ (self , language : str ) -> LanguageCollection :
39
62
"""
@@ -172,7 +195,7 @@ def sorted_language_letters(self) -> List[str]:
172
195
173
196
:return: a sorted list of letters
174
197
"""
175
- unsorted_letters = os .listdir (self ._source_dir )
198
+ unsorted_letters = os .listdir (self ._archive_dir )
176
199
return sorted (unsorted_letters , key = lambda s : s .casefold ())
177
200
178
201
def _collect_languages (self ) -> Dict [str , LanguageCollection ]:
@@ -182,7 +205,7 @@ def _collect_languages(self) -> Dict[str, LanguageCollection]:
182
205
:return: the list of language collections
183
206
"""
184
207
languages = {}
185
- for root , directories , files in os .walk (self ._source_dir ):
208
+ for root , directories , files in os .walk (self ._archive_dir ):
186
209
if not directories :
187
210
language = LanguageCollection (os .path .basename (root ), root , files , self ._projects )
188
211
languages [str (language )] = language
@@ -206,50 +229,12 @@ def _collect_projects(self) -> List[Project]:
206
229
projects .append (Project (project_dir .name , project_test ))
207
230
return projects
208
231
209
- def _generate_source_dir (self , source_dir : Optional [str ]) -> str :
210
- """
211
- A helper method which generates the Sample Programs repo
212
- from Git if it's not provided on the source directory.
213
-
214
- :return: a path to the source directory of the archive directory
215
- """
216
- if not source_dir :
217
- logger .info (f"Source directory is not provided. Using temp directory { self ._temp_dir .name } ." )
218
- return os .path .join (self ._temp_dir .name , "archive" )
219
- logger .info (f"Source directory provided: { source_dir } " )
220
- return source_dir
221
-
222
- def _generate_git_repo (self ) -> git .Repo :
223
- """
224
- Generates the Git repository from the Sample Programs repo.
225
-
226
- :return: a Git repository object
227
- """
228
- if self ._temp_dir .name in self ._source_dir :
229
- return git .Repo .clone_from ("https://github.com/TheRenegadeCoder/sample-programs.git" , self ._temp_dir .name , multi_options = ["--recursive" ])
230
- else :
231
- return git .Repo (self ._source_dir , search_parent_directories = True )
232
-
233
- def _generate_docs_dir (self , source_dir : Optional [str ]) -> str :
234
- """
235
- A helper methods which generates the path to the documentation.
236
- This method is needed because the provided source directory is meant
237
- to point at archive (for historical purposes). This is normally
238
- a non-issue if the directory is generated using Git, but can be more
239
- annoying if the user provides a source.
240
-
241
- :return: a path to the documentation directory
242
- """
243
- if not source_dir :
244
- return os .path .join (self ._temp_dir .name , "docs" , "sources" )
245
- return os .path .join (source_dir , os .pardir , "docs" , "sources" )
246
-
247
232
def _collect_tested_projects (self ) -> str :
248
233
"""
249
234
Generates the dictionary of tested projects from the
250
235
Glotter YAML file.
251
236
"""
252
- p = Path (self ._source_dir ). parents [ 0 ] / ".glotter.yml"
237
+ p = Path (self ._sample_programs_repo_dir ) / ".glotter.yml"
253
238
if p .exists ():
254
239
with open (p , "r" ) as f :
255
240
data = yaml .safe_load (f )["projects" ]
@@ -260,22 +245,22 @@ def _collect_tested_projects(self) -> str:
260
245
261
246
def _load_git_data (self ) -> None :
262
247
"""
263
- One the repo is loaded, this method will load the git data from the repo
248
+ Once the repo is loaded, this method will load the git data from the repo
264
249
and inject that data into the repo object. This was done for simplicity.
265
250
It seems like way more of a pain to try to pass the git data around.
266
251
"""
267
252
268
253
# Make sure .git-blame-ignore-revs exists for older versions of git and
269
254
# keep track of whether it existed before
270
- blame_path = Path (f"{ self ._temp_dir .name } /.git-blame-ignore-revs" )
255
+ blame_path = Path (f"{ self ._sample_programs_temp_dir .name } /.git-blame-ignore-revs" )
271
256
blame_path_exists = blame_path .exists ()
272
257
blame_path .touch ()
273
258
274
259
for language in self :
275
260
language : LanguageCollection
276
261
for program in language :
277
262
program : SampleProgram
278
- blame = self ._git_repo .blame ('HEAD' , f"{ program ._path } /{ program ._file_name } " )
263
+ blame = self ._sample_programs_repo .blame ('HEAD' , f"{ program ._path } /{ program ._file_name } " )
279
264
times = []
280
265
for commit , _ in blame :
281
266
commit : git .Commit
0 commit comments