GB2260.py icon indicating copy to clipboard operation
GB2260.py copied to clipboard

Conforms to Spec v0.2

Open timothyqiu opened this issue 6 years ago • 0 comments

尝试实现 v0.2 版本的 Spec,同时更新到了最新的数据。因为原有结构和测试与 Spec 要求差别太大,基本上就是重写了。

在 Spec 基础上:

  • Division 保留了原来的 is_province is_prefecture is_county 属性
  • 认为 province code 还可以写成 320000
    • 即定义 X code 为有效的 X 行政区代码,允许省略若干后缀的 00

GB2260 的数据通过 generate.py 生成到 gb2260.data.<源>.revision_<日期> 里。因为看到 Spec 后续有允许用户切换选择源的计划,所以目前是在生成时就把所有源的数据混合,按照「标准 > STATS > MCA」的优先级生成到假的「curated」源使用。这些模块在构造具体的 GB2260 对象时动态加载。

与 GB/T 2260 数字码相关的逻辑都在 gb2260.code 里,主要用正则表达式匹配、处理、变换。

Spec 为 GB2260 对象定义的大多数逻辑都在 Revision 对象中实现,GB2260 主要作为其它对象的代理使用。

关于 Division 对象是否允许用户自行通过「代码、名字、版本」三个字符串构造,我选择了不允许,同时还不允许修改这三个字段(行为类似 namedtuple)。因为有 Division.province 这种东西的缘故,它似乎就不再是 POD 而是有内部不变量的对象了。而且如果允许自行构建,Division.province 之类的方法似乎也会很难办,搞临时或者全局性质的 GB2260 对象似乎也不大好。所以还是和 Spec 一样,仅推荐通过 GB2260.get 获取 Division

另外因为 cn/GB2260#50 的问题,使用 MCA 源的数据可能会有一些问题(默认 GB2260() 得到的最新版也是 MCA 源的),但 GB2260('201412') 得到的是和老版本一样的数据。

可能改动大了一些。之前也尝试过一步步从原来的版本修改过来,但失败了,牵一发而动全身。仅供参考……

p.s. 在测试里加了 pytest-mock 的依赖;pypy 没有接触过,所以也没有在它上面跑测试 :(

timothyqiu avatar Jun 27 '18 09:06 timothyqiu