pip-pop源码阅读
项目地址
https://github.com/heroku-python/pip-pop
按照commit记录来阅读。
lawyer up
commit记录: a84bc7439770063e457760a18119c10e5d802d3e
添加了LICENSE
文件,采用MIT License
dummy dir
commit记录: 636935f9394165c1d55c0e0d878cea60428a434e
创建了 pip_pop
文件夹,在其中创建空文件__init__.py
。 此时项目结构如下:
READ IT
commit记录: ebdda7f8897403e9b77a2fa7023b2f4f8df1ecaa
项目结构如下:
增加了README.rst
文件。用于说明该项目的用处,计划中实现的功能,未来可能实现的功能。
docopt
commit记录: f0e51cc56f55c4615e29b7a12264b20dbe12db66
项目结构如下:
增加了requirements.txt
文件。
note about blacklisting plans
commit记录: bf54913eaa70f9f505c414a7be328ff15040f37f
项目结构如下:
修改READEME.rst
文件。
Update READEME.rst
commit记录: 2b444bc846071148dedf6773555e8b33f895765c
项目结构如下:
修改README.rst
文件
exes
commit记录: fd65e4d148939f1c7405370e1f342f1fa1b3ea14
项目结构如下:
新增bin/pip-diff
,bin/pip-flatten
和setup.py
。
bin/pip-diff
和bin/pip-flatten
均是空文件。
setup.py
用于python库打包。代码如下:
从setuptools
导入setup
函数,其中参数的含义如下:
参数 | 含义 | 值 |
---|---|---|
name | 包名字 | pip-pop |
version | 包版本 | 0.0.0 |
url | 程序官网地址 | https://github.com/kennethreitz/pip-pop |
license | 授权信息 | MIT |
author | 程序作者 | Kenneth Reitz |
author_email | 作者邮箱 | me@kennethreitz.org |
description | 程序简单描述 | __doc__.strip(‘\n’) |
scripts | 指定可执行脚本,安装时脚本会被添加到系统PATH中 | [‘bin/pip-diff’, ‘bin/pip-flatten’] |
zip_safe | 不压缩包,以目录形式安装 | False |
platforms | 程序适合的平台 | ‘any’ |
install_requires | 安装时需要安装的依赖包 | [‘docopt’] |
classifiers | 分类信息 | 详细见下 |
diffing works!
commit记录: d58196205cea3a4650d68443dd90132bbd4b2b4e
项目结构如下:
更改了bin/pip-diff
文件。代码整体的格式如下:
第一行#!/usr/bin/env python
,用于为脚本语言指定解释器,这样可以直接./*.py
的方式执行,不要使用#!/usr/bin/python
,因为python可能不是安装在默认的环境。
第二行# -*- coding: utf-8 -*-
用于指定编码为 utf-8
,这样可以在py文件中写中文,方便写注释和消息。
最下面的if __name__ == '__main__':
的意思是,当该py文件被直接运行时,if __name__ == '__main__':
之下的main()
将被调用执行,当该py文件被以模块的形式导入时,if __name__ == '__main__':
不被运行。
main()
函数源代码如下:
通过args = docopt(__doc__, version='pip-diff')
来获取对应的命令行参数,参数要求见程序开头的那一段注释:
args
解析完命令行参数后,会返回一个Dict
类型。然后通过kwargs
解析出对应的变量。。--fresh
和--stale
的作用是Generates a diff between two given requirements files. Lists either stale or fresh packages.
。以命令行参数--fresh D:\temp\req1 D:\temp\req2
为例
然后程序进入diff(**kwargs)
, diff函数:
Requirements
对象定义如下,其中的diff
函数先暂时省略:
以Requirements(r1)
为例,传入的参数为D:\\temp\\req1
,在__init__
中进入self.load(reqfile)
,首先判断了文件的存在。然后对于文件中的每一行(for line in f:
),去除它末尾的换行符(line = line.strip()
),然后判断其是否以注释或控制字符开头([line.startswith(p) for p in IGNORABLE_LINES]
),若不是则将其加入到data
中。之后调用parse_requirements(data)
进行解析:
在pass之后,返回给r1
在r2
对象实例化后,进行results = r1.diff(r2)
,在class Requirements(object)
中定义了diff方法代码如下:
output for pip-diff works!
commit记录: d6ae563831228dd6d7e712d69763663032410391
项目结构如下:
根据参数的不同fresh
或者stale
,输出对应的结果。
req1内容如下:
req2内容如下:
则运行结果如下:
cleanup
commit记录: 2c2ffe318e5c539fc3bdef4feda97c56c162062a
项目结构及代码部分未做改变。
删除了原 pip-diff
中的一些注释
tuples
commit记录: 58f9ae5f9668a7613f7c0f9f1c43a105b2604891
将VERSION_OPERATORS
从list
改为tuple
。 其余无变化。
remove bunk files
commit记录: d1ff1029ca3d4bd765abe2d4e92b1c2700586702
项目结构变为:
删除了pip-pop/__init__.py
空文件
rely on pip
commit记录: d638b182d9302fa541efa48fbf99fa05f42a4565
项目结构未变
利用pip.req来解析req文件
getting simpler and simpler!
commit记录:69d9e22c10734d463bde67c04cc469f0b0bce072
项目结构未变
因为直接利用pip.req来解析req文件,删除无用变量
only check lines that have explicit requirements
commit记录: 0837d1133ee25c645d763f670f6683a20bf30240
只有当requirement.req
为真时,才添加到self.requirements
中。
附上最新版的pip中的 parse_requirements
的代码:
最后会返回一个迭代器
initial version of pip-grep
commit记录: 3862c2f9a2f72bb962e7ed15416109ee0ec3e5ae
项目结构变为:
setup.py
中:
pip-flatten
变为pip-grep
,代码如下:
updated readme
commit记录:2116d8a7698bf8fece0ad5c32db9ec9f69c97e69
更新readme文档,添加pip-grep的使用说明
fix for pip-grep
commit记录:2116d8a7698bf8fece0ad5c32db9ec9f69c97e69
silent mode for pip-grep
commit记录: 78e3c31b3584bfb263c061317ccc798cfaddf061
增加silent参数选项。作用位置
silence “not found”
commit记录: 94c553879358aff40da2c3d2f536acb184703166
添加silent
模式对not found
情况的支持
python 3 compatibility
commit纪录:70af45d95fd38e0a93abdbdb400283dcc495a00f
修改了pip-grep
和pip-diff
,将其中的print 'xx'
改为print('xx')
Add a dummy finder so parse_requirement does not fail on —arguments
commit记录:2aa545fb3b80d78670d923be4333e85f0abb7309
|
|
新增加一个finder=finder
参数,避免parse_requirements
失败。
v0.1.0
commit记录:2dc013300c4b0fb605fa9dd2a3fba5ecc81ac20c
修改setup.py
,修改版本号为version='0.1.0'
Add option to print the requirement, if found
commit记录: a3f9a4ba40c02d6bc26318e589ae2db11304203f
修改pip-grep
文件。
首先是Usage部分:
-p
,在grep找到的情况下,打印出requirement
support for lastest pip
commit记录: 27f35700c7d8affb1fc3b399bd77fe38fb82bba1
修改pip-diff
。
由于parse_requirements
中:
所以添加session
参数:
Update pip-grep
commit记录:90eba89335af5aa1285d179aa9ea6aa9725bd712
修改内容同上,增加session
参数。
Merge pull request #3 from thenovices/print-line Add option to print the requirement, if found.
commit记录:d572c00cc65a47f8d6e3d9446f8c21fb7aac685f
无
update from python buildpack
commit记录:097c4a94848897e693bf269150a49129d4019390
修改pip-diff
和pip-grep
的一些细节,增删参数。
exclude in pip-diff
commit记录:047dd63d5dd0a754d3e515bef7aa33d1246a548b
修改pip-diff
文件,增加excludes
参数选项,用于指定排除,不进行比较的packages包
|
|
README.rst Fix spelling error
commit记录:81587647408ff5adc13cc30a50ff84e36116505d
无他,修改README中的拼写错误
update
commit记录:4f5ebcd253ec299baf0f4cb10c99d06bc52cc91f
修改两个文件pip-diff
和pip-grep
pip-diff
中将project_name
改为name
。原因是pip版本升级,经过parse_requirements
后会是name
属性。但在8.1.2版本之前并不存在,因此需要在load时进行检测,增加代码如下:
v0.0.1
commit记录:4dc238c79ca19974eeb434ec4be4285d7747bb38
修改setup.py中的版本号
update setup.py
commit记录:07562561ce6aa9c733a18135cf510fadd794433a
修改setup.py中的一些参数Programming Language
、Development Status
等
Require pip>=1.5.0
commit记录:99d9f36ad765535946af1fa9fc181d33668ee146
修改setup.py中的install_requires
,要求pip版本大于1.5.0
Remove unused wsgiref from requirements.txt
commit记录:47ad229596ade5024d9c4c4190e73972176bc58b
删除requirements.txt
中的无用条目
Add a tox config and some very primitive pip-grep and pip-diff tests
commit记录:433e02ec7e294e171557514c55412cc3e06c1e53
项目结构:
修改READEME.rst
、setup.py
、requirments.txt
,主要是增加了tox
的依赖,相关环境的安装。
新增文件tests
文件夹及其文件、.gitignore
、tox.ini
。
Add Travis config
commit记录:a40d8850701f08c99d66cab2eedf283a0b326731
新增.travis.yml
。修改README.rst
文件
Update PyPI classifiers to reflect tested Python version
commit记录:e865cb31f4b43edd5f07aa8d40680d0b1eb08f28
阅读完毕。