2020年11月15日,也就是 v3.0.0 版本发布一周年之际,我们很高兴地宣布,Borax v3.4.0 正式发布。
1 项目开发SOP
1.1 全新的项目组织形式
Borax定位于一个由众多实用性功能组成的工具集合库。自v3.4开始,引入“话题/主题,Topic” 的概念,并使用“Borax.Foo” 的字符串标识每一个主题。
每个主题的代码形式可以是模块或包。目前已经被定义的主题如下表:
| 主题 | 描述 | 
|---|---|
| Borax.Calendars | 农历日期库。由 Borax.LunarDate 、Borax.Festivals 和 Borax.Birthday 三部分组成 | 
| Borax.Choices | 基于类定义的选项数据结构 | 
| Borax.Datasets | 记录型数据的操作库 | 
| Borax.DataStructures | 常用的数据结构 | 
| Borax.Numbers | 数字处理库,包括中文数字、财务数字。 | 
| Borax.Pattern | 基于Python实现的设计模式 | 
| Borax.UI | 基于tkinter的封装 | 
| Borax.Utils | 基础数据类型(字典、列表、对象)操作库。 | 
基于主题的项目组织形式,我们还做了下列的工作:
- 按照主题重新组织Borax文档的编排
- 按照主题的方式重新调整部分模块的归属
1.2 发布周期和API废弃策略
Borax 将继续遵循 “语义化版本2.0” 的版本管理策略,即由“<主版本号>.<次版本号>.<修正版本号>”组成。并结合相关情况制定相应的发布策略:
- 其中 次版本号 不大于9
- 一年发布两个“次版本系列”,时间是5月和11月。以“2020年11月-v3.4” 为起始点。
- 使用 “主版本废弃策略”,延长废弃进程。即 3.x 被标记为废弃的接口将在 v4.0 移除。
Borax 预计的发布日程表如下:
| 版本 | 发布日期 | 
|---|---|
| v3.4.0 | 2020年11月15日 | 
| v3.5.0 | 2021年5月15日(预计) | 
| v3.6.0 | 2021年11月15日(预计) | 
| … | … | 
1.3 新的CI工具:Github Action
Borax 3.4开始使用 Github Action 代替原有的 Travis CI ,主要原因在于:
- 跟 Github 结合的很好,使用 方便。
- 生态发展很好,支持 step 共享。
新增基于 Codecov 的代码覆盖率显示。
1.4 Python版本支持:新增python3.9支持
Borax 新增了对python3.9的构建支持。目前 Borax 支持以下的 python 版本:
| 1 | python3.5 ~ 3.9 | 
2 Borax.Numbers: 中文数字的四种形式
2.1 四种表示形式
根据大小写和使用场景,中文数字可分为不同的形式:
小写所使用的汉字如下:
| 1 | 一二三四五六七八九 十百千万亿 | 
大写使用的汉字如下:
| 1 | 壹贰叁肆伍陆柒捌玖 拾佰仟万亿 | 
使用场景指的是数字“0”的表示形式。根据《出版物上数字用法(GB T 15835-2011)》的规定,汉字 “零” 和 “〇” 是有严格的使用场景。
| 1 | 阿拉伯数字“0”有“零”和“〇”两种汉字书写形式。一个数字用作计量时,其中“0”的汉字书写形式为“零”,用作编号时,“0”的汉字书写形式为“〇”。 | 
综上所述,数字204共有4种表示形式。
| 大写(Upper) | 小写(Lower) | |
|---|---|---|
| 计量(Measure) | 贰佰零肆 | 二百零四 | 
| 编号(Order) | 贰佰〇肆 | 二百〇四 | 
财务金额使用的 大写,计量 的表示形式。法律条文中“第XXX条” 使用的是 小写,编号 的表示形式。
2.2 ChineseNumber类方法
Borax v3.4 引入了中文数字的计量和编号两种不同用法,对于数字 “0” 使用不同的中文汉字描述。
| 函数 | 用法 | 
|---|---|
| ChineseNumbers.to_chinese_number(num:Union[int, str], upper:bool=False, order:bool=False) -> str | 使用upper控制大小写,使用order控制计量/编号 | 
| ChineseNumbers.measure_number(num:Union[int, str]) -> str | 小写,计量 | 
| ChineseNumbers.order_number(num:Union[int, str]) -> str | 小写,编号 | 
3 Borax.Choices: 整合Django.Choices
主要变化如下
- 整合ConstChoices和django choices
4 Borax.Calendars
4.1 农历日期格式化
strftime函数变化:
| 描述符 | 变更 | 
|---|---|
| %t | 当节气不存在时显示为 -而不是空字符串 | 
| %X | [新增]月份的另一种形式,将“冬”、“腊”显示为“十一”、“十二” | 
描述符的文档,使用 年月日闰及其变种 的形式描述。
4.2 获取闰月的年份
函数签名
| 1 | def LCalendars.get_leap_years(month:int=0) -> tuple | 
函数返回 含有给定闰月的年份列表。当 month=0时,返回所有闰月的年份。当month大于12时,返回空元组。
4.3 节气日期
在Borax v3.3可使用 LCalendars.create_solar_date 获取公历年特定节气的日期。
| 1 | def LCalendars.create_solar_date(year: int, term_index: Optional[int] = None, term_name: Optional[str] = None) -> datetime.date | 
由于该方法的 year 参数和所在 LCalendars 类的意义有所冲突。Borax v3.4 该方法已废弃,新增 SCalendars.term2date ,签名如下:
| 1 | def SCalendars.term2date(year: int, term_name: Optional[str] = None) -> datetime.date | 
主要变化:
- 移除了 term_index参数
- 参数 term_name支持'ChunFeng'和'春分'两种形式
4.4 import路径
在Borax v3.4版本中,对开放的类提供了shortcut import path,完整的信息如下:
| 实际引用 | Shortcut引用 | 
|---|---|
| borax.calendars.lundardate.LunarDate | borax.calendars.LunarDate | 
| borax.calendars.lunardate.LCalendars | borax.calendars.LCalendars | 
| borax.calendars.utils.SCalendars | borax.calendars.SCalendars | 
5 Borax.JSON: JSON序列化
5.1 模块组织
Borax V3.4版本将 bjson 和 cjson 两个模块整合合并,形成全新的 borax.cjson 模块。原有的 bjson 将被标记为 Deprecated ,并在V4.0中移除。
| V3.3.x | V3.4.x | 描述 | 
|---|---|---|
| borax.seriaize.bjson | 实现基于类的 JSON Encoder | |
| borax.serialize.cjson | borax.cjson | 实现基于函数的 JSON Encoder | 
最终保留 cjson 意味着完全采用基于函数的实现方式。
新的 borax.serialize.cjson 的变化如下:
- 默认使用目标类 __json__的编码函数
- 新增 datetime/date等常用类JSON编码
- 使用 cjson.encoder.register添加新的编码函数
5.2 使用示例
| 1 | from datetime import date, datetime | 
输出结果
| 1 | {"current_time": "2020-10-10 10:42:25"} | 
6 Borax.SerialNo 基于 Pool 的生成器
borax.counters.serial_pool 模块使用新的方式实现序列号生成器。包括以下函数和类:
- serial_no_generator 序列号生成器
- SerialElement 序列号实体类
- SerialNoPool 生成池
| 1 | from borax.counters.serial_pool import SerialNoPool | 
