0%

Borax-3.4.0发布日志

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
2
3
4
5
6
7
8
9
阿拉伯数字“0”有“零”和“〇”两种汉字书写形式。一个数字用作计量时,其中“0”的汉字书写形式为“零”,用作编号时,“0”的汉字书写形式为“〇”。

 示例:“3052(个)”的汉字数字形式为“三千零五十二”(不写为“三千〇五十二”)

“95.06”的汉字数字形式为“九十五点零六”(不写为“九十五点〇六”)

“公元2012(年)”的汉字数字形式为“二〇一二”(不写为“二零一二”)

---- 出版物上数字用法(GB T 15835-2011)

综上所述,数字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版本将 bjsoncjson 两个模块整合合并,形成全新的 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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
from datetime import date, datetime
from borax.calendars import LunarDate
from borax.serialize import cjson


@cjson.encoder.register(LunarDate)
def encode_ld(ld):
return ld.strftime('%Y年%L%M月%D日')


data = {'current_time': datetime.now()}
print(cjson.dumps(data))

data2 = {
'solar_day': date.today(),
'lunar_day': LunarDate.today()
}
print(cjson.dumps(data2, ensure_ascii=False))

输出结果

1
2
{"current_time": "2020-10-10 10:42:25"}
{"solar_day": "2020-10-10", "lunar_day": "二〇二〇年八月廿四日"}

6 Borax.SerialNo 基于 Pool 的生成器

borax.counters.serial_pool 模块使用新的方式实现序列号生成器。包括以下函数和类:

  • serial_no_generator 序列号生成器
  • SerialElement 序列号实体类
  • SerialNoPool 生成池
1
2
3
4
5
6
7
8
9
from borax.counters.serial_pool import SerialNoPool


# 返回 'LC00000000' ~ 'LC99999999' 的迭代器
pool = SerialNoPool(label_fmt='LC{no}', dights=8)
data = pool.generate_labels(num=3)
print(data) # ['LC00000000', 'LC0000001', 'LC00000002']

pool.add_elements(data)
坚持原创技术分享,您的支持将鼓励我继续创作!