forked from Plemya-x/ALR
		
	Комментирование кода, добавление возможности сборки нескольких пакетов package_* из одного alr.sh
This commit is contained in:
		| @@ -1,13 +1,20 @@ | ||||
| package gen | ||||
|  | ||||
| import ( | ||||
| 	"strings" | ||||
| 	"text/template" | ||||
|     "strings" | ||||
|     "text/template" | ||||
| ) | ||||
|  | ||||
| // Определяем переменную funcs типа template.FuncMap, которая будет использоваться для | ||||
| // предоставления пользовательских функций в шаблонах | ||||
| var funcs = template.FuncMap{ | ||||
| 	"tolower": strings.ToLower, | ||||
| 	"firstchar": func(s string) string { | ||||
| 		return s[:1] | ||||
| 	}, | ||||
|     // Функция "tolower" использует strings.ToLower | ||||
|     // для преобразования строки в нижний регистр | ||||
|     "tolower": strings.ToLower, | ||||
|  | ||||
|     // Функция "firstchar" — это лямбда-функция, которая берет строку | ||||
|     // и возвращает её первый символ | ||||
|     "firstchar": func(s string) string { | ||||
|         return s[:1] | ||||
|     }, | ||||
| } | ||||
|   | ||||
							
								
								
									
										122
									
								
								pkg/gen/pip.go
									
									
									
									
									
								
							
							
						
						
									
										122
									
								
								pkg/gen/pip.go
									
									
									
									
									
								
							| @@ -1,84 +1,98 @@ | ||||
| package gen | ||||
|  | ||||
| import ( | ||||
| 	_ "embed" | ||||
| 	"encoding/json" | ||||
| 	"errors" | ||||
| 	"fmt" | ||||
| 	"io" | ||||
| 	"net/http" | ||||
| 	"text/template" | ||||
|     _ "embed" // Пакет для встраивания содержимого файлов в бинарники Go, использовав откладку //go:embed | ||||
|     "encoding/json" // Пакет для работы с JSON: декодирование и кодирование | ||||
|     "errors"    // Пакет для создания и обработки ошибок | ||||
|     "fmt"       // Пакет для форматированного ввода и вывода | ||||
|     "io"        // Пакет для интерфейсов ввода и вывода | ||||
|     "net/http"  // Пакет для HTTP-клиентов и серверов | ||||
|     "text/template" // Пакет для обработки текстовых шаблонов | ||||
| ) | ||||
|  | ||||
| // Используем директиву //go:embed для встраивания содержимого файла шаблона в строку pipTmpl | ||||
| // Встраивание файла tmpls/pip.tmpl.sh | ||||
| //go:embed tmpls/pip.tmpl.sh | ||||
| var pipTmpl string | ||||
|  | ||||
| // PipOptions содержит параметры, которые будут переданы в шаблон | ||||
| type PipOptions struct { | ||||
| 	Name        string | ||||
| 	Version     string | ||||
| 	Description string | ||||
|     Name        string // Имя пакета | ||||
|     Version     string // Версия пакета | ||||
|     Description string // Описание пакета | ||||
| } | ||||
|  | ||||
| // pypiAPIResponse представляет структуру ответа от API PyPI | ||||
| type pypiAPIResponse struct { | ||||
| 	Info pypiInfo  `json:"info"` | ||||
| 	URLs []pypiURL `json:"urls"` | ||||
|     Info pypiInfo  `json:"info"` // Информация о пакете | ||||
|     URLs []pypiURL `json:"urls"` // Список URL-адресов для загрузки пакета | ||||
| } | ||||
|  | ||||
| // Метод SourceURL ищет и возвращает URL исходного distribution для пакета, если он существует | ||||
| func (res pypiAPIResponse) SourceURL() (pypiURL, error) { | ||||
| 	for _, url := range res.URLs { | ||||
| 		if url.PackageType == "sdist" { | ||||
| 			return url, nil | ||||
| 		} | ||||
| 	} | ||||
| 	return pypiURL{}, errors.New("package doesn't have a source distribution") | ||||
|     for _, url := range res.URLs { | ||||
|         if url.PackageType == "sdist" { | ||||
|             return url, nil | ||||
|         } | ||||
|     } | ||||
|     return pypiURL{}, errors.New("package doesn't have a source distribution") | ||||
| } | ||||
|  | ||||
| // pypiInfo содержит основную информацию о пакете, такую как имя, версия и пр. | ||||
| type pypiInfo struct { | ||||
| 	Name     string `json:"name"` | ||||
| 	Version  string `json:"version"` | ||||
| 	Summary  string `json:"summary"` | ||||
| 	Homepage string `json:"home_page"` | ||||
| 	License  string `json:"license"` | ||||
|     Name     string `json:"name"` | ||||
|     Version  string `json:"version"` | ||||
|     Summary  string `json:"summary"` | ||||
|     Homepage string `json:"home_page"` | ||||
|     License  string `json:"license"` | ||||
| } | ||||
|  | ||||
| // pypiURL представляет информацию об одном из доступных для загрузки URL | ||||
| type pypiURL struct { | ||||
| 	Digests     map[string]string `json:"digests"` | ||||
| 	Filename    string            `json:"filename"` | ||||
| 	PackageType string            `json:"packagetype"` | ||||
|     Digests     map[string]string `json:"digests"` // Контрольные суммы для файлов | ||||
|     Filename    string            `json:"filename"` // Имя файла | ||||
|     PackageType string            `json:"packagetype"` // Тип пакета (например sdist) | ||||
| } | ||||
|  | ||||
| // Функция Pip загружает информацию о пакете из PyPI и использует шаблон для вывода информации | ||||
| func Pip(w io.Writer, opts PipOptions) error { | ||||
| 	tmpl, err := template.New("pip"). | ||||
| 		Funcs(funcs). | ||||
| 		Parse(pipTmpl) | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
|     // Создаем новый шаблон с добавлением функций из FuncMap | ||||
|     tmpl, err := template.New("pip"). | ||||
|         Funcs(funcs). | ||||
|         Parse(pipTmpl) | ||||
|     if err != nil { | ||||
|         return err | ||||
|     } | ||||
|  | ||||
| 	url := fmt.Sprintf( | ||||
| 		"https://pypi.org/pypi/%s/%s/json", | ||||
| 		opts.Name, | ||||
| 		opts.Version, | ||||
| 	) | ||||
|     // Формируем URL для запроса к PyPI на основании имени и версии пакета | ||||
|     url := fmt.Sprintf( | ||||
|         "https://pypi.org/pypi/%s/%s/json", | ||||
|         opts.Name, | ||||
|         opts.Version, | ||||
|     ) | ||||
|  | ||||
| 	res, err := http.Get(url) | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 	defer res.Body.Close() | ||||
| 	if res.StatusCode != 200 { | ||||
| 		return fmt.Errorf("pypi: %s", res.Status) | ||||
| 	} | ||||
|     // Выполняем HTTP GET запрос к PyPI | ||||
|     res, err := http.Get(url) | ||||
|     if err != nil { | ||||
|         return err | ||||
|     } | ||||
|     defer res.Body.Close() // Закрываем тело ответа после завершения работы | ||||
|     if res.StatusCode != 200 { | ||||
|         return fmt.Errorf("pypi: %s", res.Status) | ||||
|     } | ||||
|  | ||||
| 	var resp pypiAPIResponse | ||||
| 	err = json.NewDecoder(res.Body).Decode(&resp) | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
|     // Раскодируем ответ JSON от PyPI в структуру pypiAPIResponse | ||||
|     var resp pypiAPIResponse | ||||
|     err = json.NewDecoder(res.Body).Decode(&resp) | ||||
|     if err != nil { | ||||
|         return err | ||||
|     } | ||||
|  | ||||
| 	if opts.Description != "" { | ||||
| 		resp.Info.Summary = opts.Description | ||||
| 	} | ||||
|     // Если в opts указано описание, используем его вместо описания из PyPI | ||||
|     if opts.Description != "" { | ||||
|         resp.Info.Summary = opts.Description | ||||
|     } | ||||
|  | ||||
| 	return tmpl.Execute(w, resp) | ||||
|     // Выполняем шаблон с использованием данных из resp и записываем результат в w | ||||
|     return tmpl.Execute(w, resp) | ||||
| } | ||||
|   | ||||
		Reference in New Issue
	
	Block a user