caset 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 550521bf86c2bc1c07ffa40bd723ff0acb2a3ec41603a48967194eb27bb8bd99
4
+ data.tar.gz: c8f625fc9a6887f44124c6a389ec2f1656197ac4a5533d2d4d047e77f62401de
5
+ SHA512:
6
+ metadata.gz: 1e086a834e7f0b3d6e10abb73a150cbd1cbf84ad4265a981ba5ecff6b123576e08074ef2b58d7dbb1c8bb1e6d00c896171e0d9f3f8743d063f53e2baea20119f
7
+ data.tar.gz: 35f881a333bf72b03772344457dc1aaf1392f9f7a8c2dd3c1d870bba6a5dfe0eb669ea2bdeaa3eddf435860fff5d2b343bfb6edcebb895d9415a4013dd29b871
data/README.md ADDED
@@ -0,0 +1,180 @@
1
+ # caset
2
+
3
+ 这是一个用例组织框架,是学习block的基本练手
4
+
5
+ 简化spec,在一些没有spec的场合组织代码用(现在应该没有这样的地方了)
6
+
7
+ ## CasetDown
8
+
9
+ 自 v1.0.0 起,caset 融合了 `imdoc/casetdown` 项目的全部功能,提供 `cm`、`cml` 两个命令,
10
+ 对 Markdown 文档做形式化执行与生成(文档既是文稿,也是可执行程序)。
11
+
12
+ - `cm`:解析文档结构、导入导出表格、执行文档内代码块、把运行结果回写渲染成新文档
13
+ - `cml`:监听目录下的 `.md` 文档,内容一变就自动执行一次 `cm`,并把最新渲染版同步为
14
+ `<文件名>.latest.md`
15
+
16
+ ```shell
17
+ cm --check doc/sample.md # 检查文档结构
18
+ cm doc/sample.md # 默认渲染:表格 + 代码执行 + 时间戳渲染文件
19
+ cm --rtab doc/sample.md # 导入外部 CSV 表格到文档
20
+ cm --wtab doc/sample.md # 导出文档内表格到 CSV
21
+ cm --preview doc/sample.md # 生成 *.preview.md 预览
22
+ cml # 监听当前目录,自动渲染并维护 .latest.md
23
+ ```
24
+
25
+ Markdown 扩展语法(全局配置、内置表格、代码输入输出通道、数据绑定)见
26
+ [doc/MANUAL.md](doc/MANUAL.md),样例见 [doc/sample.md](doc/sample.md),
27
+ **可运行的功能演示见 [example/](example/) 目录**(六个递进例子 + 运行说明)。
28
+
29
+ ### 依赖与结构
30
+
31
+ 原 casetdown 的松散集成依赖(`imdoc/XMLUtils`、`imdoc/Tabot` 的 Excel 读写、`gem:rdiscount`)
32
+ 已完全重写并入 [manticore](../manticore)(gem:manticore-smash):
33
+
34
+ | 原 imdoc 组件 | 现归属 |
35
+ |------|------|
36
+ | `XMLUtils/XmlUtils`(XmlParser) | manticore `xmlutils` / `xml_doc` |
37
+ | `Tabot` Excel 读写 | manticore `xlsxkit` |
38
+ | `gem:rdiscount`(Markdown 解析) | manticore `mdutils/rediscount`(ReDiscount) |
39
+ | `Tabot/simtab`(二维表操作) | caset `lib/casetdown/support/simtab.rb` |
40
+ | `TextUtils/text_abstract`(段落匹配) | caset `lib/casetdown/support/text_abstract.rb` |
41
+ | `EnData`(内嵌数据绑定) | caset `lib/casetdown/support/endata.rb` |
42
+ | `TinText/tum/cache`(模板替换) | caset `lib/casetdown/support/tintext.rb` |
43
+ | `EnData/api-app`(API-Request) | caset `lib/casetdown/support/api_app.rb`(需另装 gem webot,未装则自动跳过) |
44
+
45
+ 执行文档中的 ruby 代码块时,子进程通过 `require "casetdown"` 获得与 cm 主进程一致的
46
+ 数据绑定环境(`EnData.table`、SimTab 表操作、TinText 模板、XlsxKit),
47
+ 仓库直跑与 gem 安装两种方式均可。
48
+
49
+ ```shell
50
+ gem install manticore-smash # 唯一运行时依赖(或 gem build 本地安装)
51
+ gem build caset.gemspec && gem install --local caset-1.0.0.gem
52
+ rake test # 全量测试(66 用例:caset + casetdown + support + cli)
53
+ ```
54
+
55
+ ### 相对旧版 casetdown 的修正
56
+
57
+ - 解析链切换为 manticore(ReDiscount + XmlParser),修复 tokenizer 吞空格缺陷:
58
+ 实体引用旁的空格/换行是有效内容(`lines &lt;&lt; &quot;x&quot;` 此前会被解析成 `lines <<"x"`)
59
+ - `loadcsv` 编码策略改为 UTF-8 优先 + BOM 剥离 + GBK 回退:修复旧版把 UTF-8 表头
60
+ 强转 GBK 造成的乱码(表头 `"a"` 被污染成 `"锘縜"`,导致 `#col>` 按名投影退化为占位符)
61
+ - `cml` 变更检测由 atime 改为 mtime(Windows 卷常见关闭 atime 更新导致漏检);
62
+ 修复带目录/通配符参数即误判"No file exist"退出、以及首次渲染时 `File.delete`
63
+ 删除不存在的 `.latest.md` 报错两个缺陷
64
+ - 渲染数据尾部改用局部量:同进程反复渲染(cml)不再叠加 `__END__` 数据段与
65
+ erlang fact 子句(同名 fact 子句首个匹配优先,旧数据会遮蔽新数据)
66
+ - `cm`/`cml` 薄启动器 + `CLI`/`Live` 实现移入 lib,仓库直跑与 gem 安装共用一套代码
67
+
68
+ ## How To Use
69
+
70
+ ```ruby
71
+ require 'caset'
72
+ include Caset
73
+
74
+ scenario 'Your scenario name',[:bm_step] do
75
+ before [:all] do
76
+ msg "起床"
77
+ end
78
+
79
+ before [:each] do
80
+ mark "准备"
81
+ end
82
+
83
+ ustep 1,"符号" do|param|
84
+ star "梳头"
85
+ plus "刷牙"
86
+ minus "洗脸"
87
+ end
88
+
89
+ ustep 2,"符号简写" do|param|
90
+ 星 "穿鞋"
91
+ 加 "喝粥"
92
+ 减 "出行"
93
+ end
94
+
95
+ ustep 3,"序号" do|param|
96
+ 1.is "卖蛋"
97
+ 2.is "买茶"
98
+ end
99
+
100
+ ustep 4,"文字" do|param|
101
+ '一'.是 "为了维生"
102
+ '二'.是 "为了兴趣"
103
+ "当然".是 "也不一定的", '咳咳,','...'
104
+ end
105
+
106
+ ustep '5',"Cucumber" do|param|
107
+ Give "some conditions"
108
+ When "something happen"
109
+ Then "will get the results"
110
+ And "some exceptions maybe"
111
+ end
112
+
113
+ ustep '6',"中文Cucumber" do|param|
114
+ 如果 "存在某种条件"
115
+ 而且 "处于这种场合"
116
+ 当 "发生某些行为"
117
+ 那么 "会有这些结果"
118
+ end
119
+
120
+ ustory "书写方法1" do
121
+ run_step(1,"使用符号简写")
122
+ run_step(2,"使用符号简写")
123
+ run_step(3,"使用序号")
124
+ run_step(4,"使用文字")
125
+ end
126
+
127
+ ustory "书写方法2" do
128
+ run_steps [ {id:'5',desc: "使用Cucumber"}, {id:'6', desc:"使用中文Cucumber"} ]
129
+ end
130
+
131
+ ustory "待定" do
132
+ pending
133
+ end
134
+
135
+ after [:each] do
136
+ 记录 "躺下"
137
+ end
138
+
139
+ after [:all] do
140
+ 标记 "放松"
141
+ end
142
+ end
143
+
144
+ puts "","The Running Report is",Caset.report,"","The Specific Document is",Caset.document
145
+ ```
146
+
147
+ ## AutoGenerate
148
+
149
+ 运行下列脚本生成用例集
150
+
151
+ ```ruby
152
+ include Caset
153
+ auto_story(casename)
154
+ ```
155
+
156
+ 如果你想使用BDD/Spec框架,也可以通过一些方法生成对应的简单模板
157
+
158
+ ```ruby
159
+ BDD::gen((ARGV[0] || "xxx"),(ARGV[1] || "standard" || "background" || "outlines" || "steptables"))
160
+
161
+ Spec.gen ARGV,template
162
+ ```
163
+
164
+ ## Pytest.gen
165
+
166
+ 对于一个或一组python代码,给出其YAML摘要文件,生成对应pytest的单元测试框架tests
167
+
168
+ ```ruby
169
+ Caset::Pytest.gen option={path: 'xxx.yml', level: %{pending false}.map{|a|a.to_sym}, head: 'xxx'}
170
+ ```
171
+
172
+ ```shell
173
+ vim ./pytest.ini
174
+ [pytest]
175
+ markers =
176
+ unfinished: aaa
177
+ finished: zzz
178
+
179
+ pytest .
180
+ ```
data/bin/cm ADDED
@@ -0,0 +1,15 @@
1
+ #!/usr/bin/env ruby
2
+ #coding:utf-8
3
+ # ============================================================================
4
+ # cm 可执行 Markdown 渲染命令 —— 薄启动器
5
+ #
6
+ # 仓库内直跑:ruby bin/cm <options> <filename>[.md]
7
+ # (require_relative 解析到本仓库 lib/,需已安装 gem manticore-smash)
8
+ # gem 安装后:cm <options> <filename>[.md]
9
+ # (RubyGems shim 调本文件,lib/ 随 gem 打包)
10
+ #
11
+ # 实现位于 lib/casetdown/cli.rb(CasetDown::CLI.run)。
12
+ # ============================================================================
13
+ require_relative '../lib/casetdown'
14
+
15
+ exit(CasetDown::CLI.run(ARGV))
data/bin/cml ADDED
@@ -0,0 +1,15 @@
1
+ #!/usr/bin/env ruby
2
+ #coding:utf-8
3
+ # ============================================================================
4
+ # cml Markdown 监听渲染命令 —— 薄启动器
5
+ #
6
+ # 仓库内直跑:ruby bin/cml [<dir>] [<glob>]
7
+ # gem 安装后:cml [<dir>] [<glob>]
8
+ #
9
+ # 持续监视目录下 .md 文档,内容变更时自动执行 cm 默认渲染流程,
10
+ # 并把最新渲染版本同步为 "<文件名>.latest.md"。
11
+ # 实现位于 lib/casetdown/live.rb(CasetDown::Live.run)。
12
+ # ============================================================================
13
+ require_relative '../lib/casetdown'
14
+
15
+ exit(CasetDown::Live.run(ARGV))
data/doc/MANUAL.md ADDED
@@ -0,0 +1,100 @@
1
+
2
+ # 这是一个可执行Markdown扩展文档的例子
3
+
4
+ 文档的描述随便写,不影响markdown原本的语意。
5
+ 以下是给Markdown一些增强的功能:
6
+
7
+ ## 1. 全局配置
8
+
9
+ 如果要做一些全局配置参数,使用如下shell,并以“.yml”、“.yaml”结尾(其实也可以没有后缀,但内容格式一定要是YAML全局散列)。
10
+
11
+ ```shell
12
+ #conf>配置文件名.yml
13
+ ```
14
+
15
+ 它的内容应该形如:
16
+
17
+ ```shell
18
+ --- # 文档名称
19
+ 配置名1: 属性值1
20
+ 配置名2: 属性值2
21
+ 配置名3: 属性值3
22
+ ………………
23
+ ```
24
+
25
+ 全局配置的好处就是渲染表格时,它不会渲染出来,可以隐藏一些信息。 如果需要检查参数设置,可以以打印代码的方式查阅,默认占用表名"global",参考`EnData.table('global')`。
26
+
27
+ 没有全局配置也没有任何问题,找不到配置文件全局变量会置空。
28
+
29
+ ## 2. 内置表格
30
+
31
+ 如下编辑会生成一个表格:
32
+
33
+ ((表名))
34
+
35
+ |字段名1 |字段名2 |字段名3 |…………|
36
+ |--------|-------|---------|----|
37
+ |字段值1 |字段值2 |${绑定名}|…………|
38
+
39
+ 如果没有表名,那么会生成一个Anonymous的表。
40
+
41
+ 使用`${绑定名}`可以生成一个引用名和引用内容的绑定,用以替换复杂的文本内容,生成表格时会自动绑定替换。
42
+
43
+ ## 3. 外部表格
44
+
45
+ 使用如下shell导入一个外部表格文件:
46
+
47
+ ```shell
48
+ #output>表名.csv
49
+ #row>1
50
+ #col>path,server,protocol,access-key
51
+ ```
52
+
53
+ 内置表名会是"表名.csv"。
54
+ 由于文件格式支持问题仅支持CSV文件引入,其他格式要自行编写代码读取和解析。
55
+
56
+ 可以追加`#row>`和`#col>`用来筛选、投影特定的行和列,构成新的子表。
57
+ 行筛选通过行号,可以是数字,也可以是范围,比如`1,2,4,11~17`。
58
+ 列投影投影的是表头字段名,比如`field1, field2 ... field65535`。
59
+
60
+ ## 4. 代码输入输出通道
61
+
62
+ 使用如下shell来输入一段代码:
63
+
64
+ ```shell
65
+ #input>代码段名
66
+ #src>解释引擎
67
+
68
+ 书写你自己的代码
69
+ ………………
70
+ ```
71
+
72
+ 使用如下shell来展示代码执行的结果:
73
+
74
+ ```shell
75
+ #output>代码段名
76
+ 写什么无所谓,渲染后这一段会被替换掉
77
+ ```
78
+
79
+ input管道下的代码,执行后会被输出到output管道下。
80
+
81
+ 代码根据“代码段名”关联,可以目录/树状命名,但不推荐以相同前缀子串整体做命名(比如一个是“/path/to/folder”另一个是“/path/to/folder/subfolder”,暂未修复<b>[TODO]</b>)。
82
+
83
+ 代码解释引擎就是常见的语言或命令行工具。
84
+ 默认支持lm、tm、ruby、python、erlang和bash,其他语言可以基于shell扩展,但windows平台要注意cmd、ps本身和bash有差异,执行并不稳定。
85
+ 多版本/环境管理解释器的执行主要取决于渲染文档时的shell环境,比如执行python使用conda构建环境,那么调用`cm`命令时shell需要能进入并选择env(改造启动脚本或sublime构建工具)。
86
+
87
+ ## 5. 数据绑定
88
+
89
+ 表格的数据是默认和代码数据段绑定的,这个特性基于ruby的`endata`开发,也可以应用到lm、tm等工具上。
90
+
91
+ 配置文件会以全局变量的形式记录在`$_tmp_global_`中。
92
+ 表格一行是一条记录,以全局变量的形式记录在`$_tmp_endata_`。
93
+
94
+ 在ruby中,数据直接放置在`__END__`中,使用`EnData/ApiRequest`的`EnData::table`来导入表,全局变量则放在`global`这样一个特殊的表中,注意EnData的数据定义是有顺序的(见`EnData/api-app.rb`)。
95
+
96
+ 在erlang中,数据以函数的形式附着在escript末尾,我们将其做成prolog等效的事实函数(形如`fact(A,B,C,...)->{D,E,F}.`)。
97
+
98
+ 其他语言的传递方式收集中……
99
+
100
+
data/doc/sample.csv ADDED
@@ -0,0 +1,12 @@
1
+ a,b,c,d,e,f,g,h,i
2
+ a,b,c,d,e,f,g,h,i
3
+ A,B,C,D,E,F,G,H,I
4
+ 1,2,3,4,5,6,7,8,9
5
+ 9,8,7,6,5,4,3,2,1
6
+ I,H,G,F,E,D,C,B,A
7
+ i,h,g,f,e,d,c,b,a
8
+
9
+ x,x,x,x,x,x,x,x,x
10
+ X,X,X,X,X,X,X,X,X
11
+ CASETDOWN,,,,,,,,
12
+ ,,,,,,,,casetdown
data/doc/sample.md ADDED
@@ -0,0 +1,60 @@
1
+
2
+ # Title1
3
+
4
+ ![png](1.png)
5
+
6
+ ## Title2
7
+
8
+ [run.rb](run.rb)
9
+
10
+ ### Title3
11
+
12
+ ((table_name))
13
+
14
+ | a | b | c |
15
+ | --- | --- | --- |
16
+ | A | B | C |
17
+ | A2 | B2 | C2 |
18
+
19
+ ```shell
20
+ #output>sample.csv
21
+ #row>1~2,5, 9~10
22
+ #col>a, d, g
23
+ ```
24
+
25
+ #### Title4
26
+
27
+ - 1
28
+ > 1.1
29
+ - 2
30
+ 2.2
31
+ - `3`
32
+ - [4](4.md)
33
+
34
+ ##### Title5
35
+
36
+ > 1
37
+ >> 2
38
+ >>> 3
39
+
40
+ 列表和引文都只能到一层
41
+
42
+ ###### Title6
43
+
44
+ ```shell
45
+ #in>1.txt
46
+ echo 1,2,3
47
+ ```
48
+
49
+ ```shell
50
+ #out>1.txt
51
+ ```
52
+
53
+ `run.bat`
54
+
55
+ $A=B$
56
+
57
+ $$
58
+ A = B
59
+ B = C
60
+ $$
@@ -0,0 +1,121 @@
1
+ #coding:utf-8
2
+
3
+ # Usage:
4
+ # BDD::gen((ARGV[0] || "xxx"),(ARGV[1] || "standard" || "background" || "outlines" || "steptables"))
5
+
6
+ module BDD
7
+ module_function
8
+ def step
9
+ %Q{
10
+ Given(//) do||
11
+
12
+ end
13
+
14
+ When(//) do||
15
+
16
+ end
17
+
18
+ Then(//) do||
19
+
20
+ end
21
+
22
+ And(//) do||
23
+
24
+ end
25
+
26
+ Then(//) do||
27
+
28
+ end
29
+ }
30
+ end
31
+
32
+ def standard
33
+ %Q{
34
+ Feature:
35
+ As a
36
+ I
37
+ so that
38
+
39
+ #
40
+ @
41
+ Scenario:
42
+ Given
43
+ When
44
+ Then
45
+ And
46
+ But
47
+ """
48
+
49
+ """
50
+ }
51
+ end
52
+
53
+ def background
54
+ %Q{
55
+ Feature:
56
+ As a
57
+ I
58
+ so that
59
+
60
+ Background:
61
+ Given
62
+
63
+ Scenario:
64
+ When
65
+ Then
66
+
67
+ Scenario:
68
+ When
69
+ Then
70
+ }
71
+ end
72
+
73
+ def outlines
74
+ %Q{
75
+ Feature:
76
+ As a
77
+ I
78
+ so that
79
+
80
+ Scenario Outline:
81
+ Given
82
+ When
83
+ Then
84
+ And
85
+
86
+ Examples:
87
+ | | |
88
+ | | |
89
+ | | |
90
+ }
91
+ end
92
+
93
+ def steptables
94
+ %Q{
95
+ Feature:
96
+ As a
97
+ I
98
+ so that
99
+
100
+ Scenario:
101
+ Given
102
+ When
103
+ Then
104
+ And
105
+ But
106
+ | |
107
+ | |
108
+ | |
109
+ }
110
+ end
111
+
112
+ def gen name,type
113
+ Dir.mkdir("features") unless File.exist?("features")
114
+ Dir.mkdir("features/support") unless File.exist?("features/support")
115
+ Dir.mkdir("features/step_definitions") unless File.exist?("features/step_definitions")
116
+
117
+ File.write("features/support/env.rb","#coding:utf-8\n\n") unless File.exist?("features/support/env.rb")
118
+ File.write("features/#{name}.feature",self.send(type.to_sym)) unless File.exist?("features/#{name}.feature")
119
+ File.write("features/step_definitions/#{name}.rb",step) unless File.exist?("features/step_definitions/#{name}.rb")
120
+ end
121
+ end
@@ -0,0 +1,41 @@
1
+ #coding:utf-8
2
+
3
+ # Usage:
4
+ # include Caset
5
+ # casename = ARGV[0] || "temp"
6
+ # auto_story casename
7
+
8
+ module Caset
9
+ THE_USTORY_TEMPLATE = %Q{#coding:utf-8
10
+ $:
11
+ require 'caset'
12
+ include Caset
13
+
14
+ scenario 'Your scenario name' do # options = [ :bm_step | :bm_story ]
15
+ before do # options = [:each | :all ]
16
+ end
17
+
18
+ ustep :x,"your step" do|param|
19
+ # msg/记录
20
+ # mark/star/plus/minus/标记/星/加/减
21
+ # number/"string".is/是
22
+ # Give/When/Then/And/如果/当/那么/而且
23
+ # pending/待定
24
+ end
25
+
26
+ ustory "your ustory" do
27
+ # run_step()
28
+ # run_steps [ ]
29
+ end
30
+
31
+ after do # options = [:each | :all ]
32
+ end
33
+ end
34
+
35
+ puts "","运行报告:",Caset.report
36
+ File.write "<<pathname>>_doc.txt",Caset.document.join("\\n")}
37
+
38
+ def auto_story pathname = ""
39
+ File.write "#{pathname}_case.rb",THE_USTORY_TEMPLATE.gsub("<<pathname>>",pathname.split("/")[-1])
40
+ end
41
+ end