├── .gitignore ├── A0000_quickstart ├── A00_install.md ├── A01_configuser.md ├── A01_system_config.md ├── A02_configbusinessline.md ├── A02_user_config.md ├── A03_interface.md ├── A03_userconfig.md ├── A04_admin.md ├── A04_task.md ├── A05_cicd.md ├── A05_config.md ├── A06_operate.md └── README.md ├── A0001_admin ├── A01_login.md ├── A02_user_group_manage.md ├── A03_permission.md ├── A04_admin.md ├── A05_config.md ├── A06_operate.md └── README.md ├── A0002_user ├── A01_config.md ├── A02_http.md ├── A03_dubbo.md ├── A04_globalvar.md ├── A05_text.md └── README.md ├── A0003_mock ├── A01_mock_introduce.md ├── A02_createmock.md ├── A03_requestmock.md ├── A04_recodermock.md └── README.md ├── A0004_keyword ├── A01_use.md ├── A02_buildin.md ├── A03_selfdefine.md └── README.md ├── A0005_pythonmode ├── A01_use.md ├── A02_buildin.md ├── A03_selfdefine.md ├── A04_ddt.md └── README.md ├── A0006_ci ├── A01_invoke.md ├── A02_cishell.md └── README.md ├── A0007_assert ├── A01_contains.md ├── A02_recurjson.md ├── A03_conditionbool.md ├── A04_assertstruct.md └── README.md ├── A0008_errors ├── A03_other.md └── README.md ├── A0009_data ├── A01_mysqldb.md ├── A02_redis.md ├── A03_mongo.md └── README.md ├── A0010_context ├── A01_vars.md ├── A02_functions.md ├── A03_usedemo.md └── README.md ├── README.md ├── SUMMARY.md ├── _book ├── .gitignore ├── A0000_quickstart │ ├── A00_install.html │ ├── A00_install.md │ ├── A01_configuser.md │ ├── A01_system_config.html │ ├── A01_system_config.md │ ├── A02_configbusinessline.md │ ├── A02_user_config.html │ ├── A02_user_config.md │ ├── A03_interface.html │ ├── A03_interface.md │ ├── A03_userconfig.md │ ├── A04_admin.md │ ├── A04_task.html │ ├── A04_task.md │ ├── A05_cicd.html │ ├── A05_cicd.md │ ├── A05_config.md │ ├── A06_operate.md │ ├── README.md │ └── index.html ├── A0001_admin │ ├── A01_login.html │ ├── A01_login.md │ ├── A02_user_group_manage.html │ ├── A02_user_group_manage.md │ ├── A03_permission.html │ ├── A03_permission.md │ ├── A04_admin.html │ ├── A04_admin.md │ ├── A05_config.html │ ├── A05_config.md │ ├── A06_operate.html │ ├── A06_operate.md │ ├── README.md │ └── index.html ├── A0002_user │ ├── A01_config.html │ ├── A01_config.md │ ├── A02_http.html │ ├── A02_http.md │ ├── A03_dubbo.html │ ├── A03_dubbo.md │ ├── A04_globalvar.html │ ├── A04_globalvar.md │ ├── A05_text.html │ ├── A05_text.md │ ├── README.md │ └── index.html ├── A0003_mock │ ├── A01_mock_introduce.html │ ├── A01_mock_introduce.md │ ├── A02_createmock.html │ ├── A02_createmock.md │ ├── A03_requestmock.html │ ├── A03_requestmock.md │ ├── A04_recodermock.html │ ├── A04_recodermock.md │ ├── README.md │ └── index.html ├── A0004_keyword │ ├── A01_use.html │ ├── A01_use.md │ ├── A02_buildin.html │ ├── A02_buildin.md │ ├── A03_selfdefine.html │ ├── A03_selfdefine.md │ ├── README.md │ └── index.html ├── A0005_pythonmode │ ├── A01_use.html │ ├── A01_use.md │ ├── A02_buildin.html │ ├── A02_buildin.md │ ├── A03_selfdefine.html │ ├── A03_selfdefine.md │ ├── A04_ddt.html │ ├── A04_ddt.md │ ├── README.md │ └── index.html ├── A0006_ci │ ├── A01_invoke.html │ ├── A01_invoke.md │ ├── A02_cishell.html │ ├── A02_cishell.md │ ├── README.md │ └── index.html ├── A0007_assert │ ├── A01_contains.html │ ├── A01_contains.md │ ├── A02_recurjson.html │ ├── A02_recurjson.md │ ├── A03_conditionbool.html │ ├── A03_conditionbool.md │ ├── A04_assertstruct.html │ ├── A04_assertstruct.md │ ├── README.md │ └── index.html ├── A0008_errors │ ├── A03_other.html │ ├── A03_other.md │ ├── README.md │ └── index.html ├── A0009_data │ ├── A01_mysqldb.html │ ├── A01_mysqldb.md │ ├── A02_redis.html │ ├── A02_redis.md │ ├── A03_mongo.html │ ├── A03_mongo.md │ ├── README.md │ └── index.html ├── A0010_context │ ├── A01_vars.html │ ├── A01_vars.md │ ├── A02_functions.html │ ├── A02_functions.md │ ├── A03_usedemo.md │ ├── README.md │ └── index.html ├── gitbook │ ├── fonts │ │ └── fontawesome │ │ │ ├── FontAwesome.otf │ │ │ ├── fontawesome-webfont.eot │ │ │ ├── fontawesome-webfont.svg │ │ │ ├── fontawesome-webfont.ttf │ │ │ ├── fontawesome-webfont.woff │ │ │ └── fontawesome-webfont.woff2 │ ├── gitbook-plugin-expandable-chapters │ │ ├── expandable-chapters.css │ │ └── expandable-chapters.js │ ├── gitbook-plugin-fontsettings │ │ ├── fontsettings.js │ │ └── website.css │ ├── gitbook-plugin-highlight │ │ ├── ebook.css │ │ └── website.css │ ├── gitbook-plugin-livereload │ │ └── plugin.js │ ├── gitbook-plugin-lunr │ │ ├── lunr.min.js │ │ └── search-lunr.js │ ├── gitbook-plugin-search │ │ ├── lunr.min.js │ │ ├── search-engine.js │ │ ├── search.css │ │ └── search.js │ ├── gitbook-plugin-sharing │ │ └── buttons.js │ ├── gitbook-plugin-splitter │ │ ├── splitter.css │ │ └── splitter.js │ ├── gitbook-plugin-theme-comscore │ │ ├── test.css │ │ └── test.js │ ├── gitbook.js │ ├── images │ │ ├── apple-touch-icon-precomposed-152.png │ │ └── favicon.ico │ ├── style.css │ └── theme.js ├── image │ ├── DATASERVICE用户截图.png │ ├── DATASERVICE用户配置value截图.png │ ├── KEYWORD示例.png │ ├── MOCK普通模式.png │ ├── MOCK最大匹配1.png │ ├── MOCK最大匹配2.png │ ├── MOCK正则restful接口.png │ ├── MOCK添加mock高级模式.png │ ├── MOCK添加示例.png │ ├── MOCK添加页面.png │ ├── MOCK请求方式列表展示.png │ ├── MOCK高级模式代码.png │ ├── MOCK高级模式相关变量.png │ ├── MOCK高级模式默认引入包.png │ ├── PYTHON内置变量示例.png │ ├── PYTHON数据驱动.png │ ├── PYTHON自定义类.png │ ├── PYTHON自定义类引用.png │ ├── 口测试平台组合文本环境变量.png │ ├── 接口测试平台DUBBO接口使用.png │ ├── 接口测试平台DUBBO接口导入日志.png │ ├── 接口测试平台DUBBO接口操作.png │ ├── 接口测试平台DUBBO接口查询.png │ ├── 接口测试平台DUBBO接口添加.png │ ├── 接口测试平台DUBBO接口添加case.png │ ├── 接口测试平台http之业务流.png │ ├── 接口测试平台http之任务流执行顺序.png │ ├── 接口测试平台http之执行结果.png │ ├── 接口测试平台http之添加任务.png │ ├── 接口测试平台http之添加任务集.png │ ├── 接口测试平台http之添加接口.png │ ├── 接口测试平台http之添加接口2.png │ ├── 接口测试平台使用jenkins插件.png │ ├── 接口测试平台全局变量使用.png │ ├── 接口测试平台全局变量操作.png │ ├── 接口测试平台全局变量查询.png │ ├── 接口测试平台全局变量添加.png │ ├── 接口测试平台全局变量编辑.png │ ├── 接口测试平台前台HTTP单接口列表页.png │ ├── 接口测试平台前台业务流变量传递示例.png │ ├── 接口测试平台前台任务列表指示执行.png │ ├── 接口测试平台前台任务集测试报告.png │ ├── 接口测试平台前台使用token更新.png │ ├── 接口测试平台前台使用业务流变量传递调试结果.png │ ├── 接口测试平台前台使用业务流同步与新增步骤.png │ ├── 接口测试平台前台使用任务执行报告统计.png │ ├── 接口测试平台前台使用任务执行结果.png │ ├── 接口测试平台前台使用任务报告详情.png │ ├── 接口测试平台前台使用任务集列表执行.png │ ├── 接口测试平台前台使用任务集执行.png │ ├── 接口测试平台前台使用任务集结果列表查看报告.png │ ├── 接口测试平台前台使用单接口创建.png │ ├── 接口测试平台前台使用持续集成示例.png │ ├── 接口测试平台前台使用添加任务集.png │ ├── 接口测试平台前台使用请求地址配置.png │ ├── 接口测试平台前台选择环境执行任务.png │ ├── 接口测试平台后台业务流选择单接口页面.png │ ├── 接口测试平台后台使用业务线模块关联.png │ ├── 接口测试平台后台使用执行服务管理页面.png │ ├── 接口测试平台后台使用数据服务器管理.png │ ├── 接口测试平台后台使用服务URI管理.png │ ├── 接口测试平台后台使用来源管理.png │ ├── 接口测试平台后台使用添加业务线.png │ ├── 接口测试平台后台使用添加模块.png │ ├── 接口测试平台后台使用环境配置管理.png │ ├── 接口测试平台后台使用用户添加页面.png │ ├── 接口测试平台后台使用用户管理页面.png │ ├── 接口测试平台后台小组管理页面.png │ ├── 接口测试平台后台执行服务编辑页面.png │ ├── 接口测试平台后台用户授权按钮.png │ ├── 接口测试平台后台用户添加页面.png │ ├── 接口测试平台后台首页.png │ ├── 接口测试平台数据服务.png │ ├── 接口测试平台数据服务组合文本.png │ ├── 接口测试平台架构图opensource.png │ ├── 接口测试平台组合文本使用.png │ ├── 接口测试平台组合文本使用结果.png │ ├── 接口测试平台组合文本操作.png │ ├── 接口测试平台组合文本查询.png │ ├── 接口测试平台组合文本添加.png │ ├── 接口测试平台组合文本环境变量.png │ ├── 接口测试平台组合文本编辑.png │ ├── 接口测试平台配置管理之服务配置.png │ ├── 接口测试平台配置管理之环境配置.png │ ├── 接口测试平台配置管理之请求地址配置.png │ ├── 测试平台前台使用添加任务.png │ ├── 测试模型.png │ ├── 添加请求地址.png │ ├── 用户服务列表.png │ ├── 用户服务添加.png │ ├── 用户环境列表查看.png │ ├── 用户环境添加.png │ ├── 请求地址列表.png │ ├── 进入服务配置.png │ ├── 进入环境配置.png │ └── 进入请求地址配置.png ├── index.html ├── search_index.json └── unnamed.patch ├── book.json ├── image ├── DATASERVICE用户截图.png ├── DATASERVICE用户配置value截图.png ├── KEYWORD示例.png ├── MOCK普通模式.png ├── MOCK最大匹配1.png ├── MOCK最大匹配2.png ├── MOCK正则restful接口.png ├── MOCK添加mock高级模式.png ├── MOCK添加示例.png ├── MOCK添加页面.png ├── MOCK请求方式列表展示.png ├── MOCK高级模式代码.png ├── MOCK高级模式相关变量.png ├── MOCK高级模式默认引入包.png ├── PYTHON内置变量示例.png ├── PYTHON数据驱动.png ├── PYTHON自定义类.png ├── PYTHON自定义类引用.png ├── 口测试平台组合文本环境变量.png ├── 常见问题解答.pdf ├── 接口测试平台DUBBO接口使用.png ├── 接口测试平台DUBBO接口导入日志.png ├── 接口测试平台DUBBO接口操作.png ├── 接口测试平台DUBBO接口查询.png ├── 接口测试平台DUBBO接口添加.png ├── 接口测试平台DUBBO接口添加case.png ├── 接口测试平台http之业务流.png ├── 接口测试平台http之任务流执行顺序.png ├── 接口测试平台http之执行结果.png ├── 接口测试平台http之添加任务.png ├── 接口测试平台http之添加任务集.png ├── 接口测试平台http之添加接口.png ├── 接口测试平台http之添加接口2.png ├── 接口测试平台使用jenkins插件.png ├── 接口测试平台全局变量使用.png ├── 接口测试平台全局变量操作.png ├── 接口测试平台全局变量查询.png ├── 接口测试平台全局变量添加.png ├── 接口测试平台全局变量编辑.png ├── 接口测试平台前台HTTP单接口列表页.png ├── 接口测试平台前台业务流变量传递示例.png ├── 接口测试平台前台任务列表指示执行.png ├── 接口测试平台前台任务集测试报告.png ├── 接口测试平台前台使用token更新.png ├── 接口测试平台前台使用业务流变量传递调试结果.png ├── 接口测试平台前台使用业务流同步与新增步骤.png ├── 接口测试平台前台使用任务执行报告统计.png ├── 接口测试平台前台使用任务执行结果.png ├── 接口测试平台前台使用任务报告详情.png ├── 接口测试平台前台使用任务集列表执行.png ├── 接口测试平台前台使用任务集执行.png ├── 接口测试平台前台使用任务集结果列表查看报告.png ├── 接口测试平台前台使用单接口创建.png ├── 接口测试平台前台使用持续集成示例.png ├── 接口测试平台前台使用添加任务集.png ├── 接口测试平台前台使用请求地址配置.png ├── 接口测试平台前台选择环境执行任务.png ├── 接口测试平台后台业务流选择单接口页面.png ├── 接口测试平台后台使用业务线模块关联.png ├── 接口测试平台后台使用执行服务管理页面.png ├── 接口测试平台后台使用数据服务器管理.png ├── 接口测试平台后台使用服务URI管理.png ├── 接口测试平台后台使用来源管理.png ├── 接口测试平台后台使用添加业务线.png ├── 接口测试平台后台使用添加模块.png ├── 接口测试平台后台使用环境配置管理.png ├── 接口测试平台后台使用用户添加页面.png ├── 接口测试平台后台使用用户管理页面.png ├── 接口测试平台后台小组管理页面.png ├── 接口测试平台后台执行服务编辑页面.png ├── 接口测试平台后台用户授权按钮.png ├── 接口测试平台后台用户添加页面.png ├── 接口测试平台后台首页.png ├── 接口测试平台数据服务.png ├── 接口测试平台数据服务组合文本.png ├── 接口测试平台架构图opensource.png ├── 接口测试平台组合文本使用.png ├── 接口测试平台组合文本使用结果.png ├── 接口测试平台组合文本操作.png ├── 接口测试平台组合文本查询.png ├── 接口测试平台组合文本添加.png ├── 接口测试平台组合文本环境变量.png ├── 接口测试平台组合文本编辑.png ├── 接口测试平台配置管理之服务配置.png ├── 接口测试平台配置管理之环境配置.png ├── 接口测试平台配置管理之请求地址配置.png ├── 测试平台前台使用添加任务.png ├── 测试模型.png ├── 添加请求地址.png ├── 用户服务列表.png ├── 用户服务添加.png ├── 用户环境列表查看.png ├── 用户环境添加.png ├── 请求地址列表.png ├── 进入服务配置.png ├── 进入环境配置.png └── 进入请求地址配置.png ├── node_modules ├── balanced-match │ ├── .npmignore │ ├── LICENSE.md │ ├── README.md │ ├── index.js │ └── package.json ├── brace-expansion │ ├── LICENSE │ ├── README.md │ ├── index.js │ └── package.json ├── concat-map │ ├── .travis.yml │ ├── LICENSE │ ├── README.markdown │ ├── example │ │ └── map.js │ ├── index.js │ ├── package.json │ └── test │ │ └── map.js ├── daggy │ ├── .npmignore │ ├── README.htm │ ├── README.md │ ├── README.old.md │ ├── daggy.js │ └── package.json ├── fantasy-identities │ ├── .npmignore │ ├── identity.js │ └── package.json ├── folktale │ ├── CHANGELOG.md │ ├── CONTRIBUTORS │ ├── README.md │ ├── adt │ │ ├── index.js │ │ └── union │ │ │ ├── derivations │ │ │ ├── debug-representation.js │ │ │ ├── equality.js │ │ │ ├── index.js │ │ │ └── serialization.js │ │ │ ├── index.js │ │ │ └── union.js │ ├── annotated │ │ ├── adt │ │ │ ├── index.js │ │ │ └── union │ │ │ │ ├── derivations │ │ │ │ ├── debug-representation.js │ │ │ │ ├── equality.js │ │ │ │ ├── index.js │ │ │ │ └── serialization.js │ │ │ │ ├── index.js │ │ │ │ └── union.js │ │ ├── concurrency │ │ │ ├── future │ │ │ │ ├── _deferred.js │ │ │ │ ├── _execution-state.js │ │ │ │ ├── _future.js │ │ │ │ └── index.js │ │ │ ├── index.js │ │ │ └── task │ │ │ │ ├── _task-execution.js │ │ │ │ ├── _task.js │ │ │ │ ├── do.js │ │ │ │ ├── index.js │ │ │ │ ├── task.js │ │ │ │ ├── wait-all.js │ │ │ │ └── wait-any.js │ │ ├── conversions │ │ │ ├── future-to-promise.js │ │ │ ├── index.js │ │ │ ├── maybe-to-result.js │ │ │ ├── maybe-to-validation.js │ │ │ ├── nodeback-to-task.js │ │ │ ├── nullable-to-maybe.js │ │ │ ├── nullable-to-result.js │ │ │ ├── nullable-to-validation.js │ │ │ ├── promise-to-future.js │ │ │ ├── promised-to-task.js │ │ │ ├── result-to-maybe.js │ │ │ ├── result-to-validation.js │ │ │ ├── validation-to-maybe.js │ │ │ └── validation-to-result.js │ │ ├── core │ │ │ ├── index.js │ │ │ ├── lambda │ │ │ │ ├── compose.js │ │ │ │ ├── constant.js │ │ │ │ ├── curry.js │ │ │ │ ├── identity.js │ │ │ │ ├── index.js │ │ │ │ └── partialize.js │ │ │ └── object │ │ │ │ ├── from-pairs.js │ │ │ │ ├── index.js │ │ │ │ ├── map-entries.js │ │ │ │ ├── map-values.js │ │ │ │ ├── to-pairs.js │ │ │ │ └── values.js │ │ ├── fantasy-land │ │ │ ├── alt.js │ │ │ ├── apply.js │ │ │ ├── bimap.js │ │ │ ├── chain.js │ │ │ ├── concat.js │ │ │ ├── curried.js │ │ │ ├── empty.js │ │ │ ├── equals.js │ │ │ ├── index.js │ │ │ ├── infix.js │ │ │ ├── map.js │ │ │ └── of.js │ │ ├── helpers │ │ │ ├── assert-function.js │ │ │ ├── assert-object.js │ │ │ ├── assert-type.js │ │ │ ├── copy-documentation.js │ │ │ ├── defer.js │ │ │ ├── define-adt-methods.js │ │ │ ├── define.js │ │ │ ├── extend.js │ │ │ ├── fantasy-land.js │ │ │ ├── provide-fantasy-land-aliases.js │ │ │ ├── thunk.js │ │ │ ├── unsupported-method.js │ │ │ ├── warn-deprecated-method.js │ │ │ └── warn-deprecation.js │ │ ├── index.js │ │ ├── maybe │ │ │ ├── index.js │ │ │ └── maybe.js │ │ ├── result │ │ │ ├── index.js │ │ │ ├── result.js │ │ │ └── try.js │ │ └── validation │ │ │ ├── chain.js │ │ │ ├── collect.js │ │ │ ├── index.js │ │ │ └── validation.js │ ├── concurrency │ │ ├── future │ │ │ ├── _deferred.js │ │ │ ├── _execution-state.js │ │ │ ├── _future.js │ │ │ └── index.js │ │ ├── index.js │ │ └── task │ │ │ ├── _task-execution.js │ │ │ ├── _task.js │ │ │ ├── do.js │ │ │ ├── index.js │ │ │ ├── task.js │ │ │ ├── wait-all.js │ │ │ └── wait-any.js │ ├── conversions │ │ ├── future-to-promise.js │ │ ├── index.js │ │ ├── maybe-to-result.js │ │ ├── maybe-to-validation.js │ │ ├── nodeback-to-task.js │ │ ├── nullable-to-maybe.js │ │ ├── nullable-to-result.js │ │ ├── nullable-to-validation.js │ │ ├── promise-to-future.js │ │ ├── promised-to-task.js │ │ ├── result-to-maybe.js │ │ ├── result-to-validation.js │ │ ├── validation-to-maybe.js │ │ └── validation-to-result.js │ ├── core │ │ ├── index.js │ │ ├── lambda │ │ │ ├── compose.js │ │ │ ├── constant.js │ │ │ ├── curry.js │ │ │ ├── identity.js │ │ │ ├── index.js │ │ │ └── partialize.js │ │ └── object │ │ │ ├── from-pairs.js │ │ │ ├── index.js │ │ │ ├── map-entries.js │ │ │ ├── map-values.js │ │ │ ├── to-pairs.js │ │ │ └── values.js │ ├── fantasy-land │ │ ├── alt.js │ │ ├── apply.js │ │ ├── bimap.js │ │ ├── chain.js │ │ ├── concat.js │ │ ├── curried.js │ │ ├── empty.js │ │ ├── equals.js │ │ ├── index.js │ │ ├── infix.js │ │ ├── map.js │ │ └── of.js │ ├── helpers │ │ ├── assert-function.js │ │ ├── assert-object.js │ │ ├── assert-type.js │ │ ├── copy-documentation.js │ │ ├── defer.js │ │ ├── define-adt-methods.js │ │ ├── define.js │ │ ├── extend.js │ │ ├── fantasy-land.js │ │ ├── provide-fantasy-land-aliases.js │ │ ├── thunk.js │ │ ├── unsupported-method.js │ │ ├── warn-deprecated-method.js │ │ └── warn-deprecation.js │ ├── index.js │ ├── maybe │ │ ├── index.js │ │ └── maybe.js │ ├── package.json │ ├── result │ │ ├── index.js │ │ ├── result.js │ │ └── try.js │ └── validation │ │ ├── chain.js │ │ ├── collect.js │ │ ├── index.js │ │ └── validation.js ├── fs.realpath │ ├── LICENSE │ ├── README.md │ ├── index.js │ ├── old.js │ └── package.json ├── gitbook-plugin-expandable-chapters │ ├── .npmignore │ ├── .project │ ├── LICENSE │ ├── README.md │ ├── book │ │ ├── expandable-chapters.css │ │ └── expandable-chapters.js │ ├── index.js │ └── package.json ├── gitbook-plugin-splitter │ ├── .npmignore │ ├── LICENSE.txt │ ├── README.md │ ├── book │ │ ├── splitter.css │ │ └── splitter.js │ ├── gitbook-splitter-demo.gif │ ├── index.js │ └── package.json ├── gitbook-plugin-summary │ ├── LICENSE │ ├── README.md │ ├── files.js │ ├── fs.js │ ├── index.js │ ├── package.json │ ├── processor.js │ └── renderer.js ├── gitbook-plugin-theme-comscore │ ├── .npmignore │ ├── LICENSE │ ├── README.md │ ├── book │ │ ├── test.css │ │ └── test.js │ ├── index.js │ └── package.json ├── gitbook-plugin-toggle-chapters │ ├── .npmignore │ ├── LICENSE │ ├── README.md │ ├── book │ │ ├── toggle.css │ │ └── toggle.js │ ├── index.js │ └── package.json ├── glob │ ├── LICENSE │ ├── README.md │ ├── changelog.md │ ├── common.js │ ├── glob.js │ ├── package.json │ └── sync.js ├── immutable-ext │ ├── .npmignore │ ├── LICENSE │ ├── README.md │ ├── browser_dist │ │ └── index.js │ ├── index.js │ ├── package-lock.json │ ├── package.json │ └── test │ │ └── test.js ├── immutable │ ├── LICENSE │ ├── README.md │ ├── contrib │ │ └── cursor │ │ │ ├── README.md │ │ │ ├── __tests__ │ │ │ └── Cursor.ts.skip │ │ │ ├── index.d.ts │ │ │ └── index.js │ ├── dist │ │ ├── immutable-nonambient.d.ts │ │ ├── immutable.d.ts │ │ ├── immutable.js │ │ ├── immutable.js.flow │ │ └── immutable.min.js │ └── package.json ├── inflight │ ├── LICENSE │ ├── README.md │ ├── inflight.js │ └── package.json ├── inherits │ ├── LICENSE │ ├── README.md │ ├── inherits.js │ ├── inherits_browser.js │ └── package.json ├── markdown-parser │ ├── .npmignore │ ├── .travis.yml │ ├── Gruntfile.js │ ├── MIT-LICENSE.txt │ ├── README.md │ ├── package.json │ ├── src │ │ ├── markdown-grammar.pegjs │ │ ├── markdown-parser.js │ │ ├── parser-browser.js │ │ └── parser.js │ └── test │ │ └── main.js ├── minimatch │ ├── LICENSE │ ├── README.md │ ├── minimatch.js │ └── package.json ├── once │ ├── LICENSE │ ├── README.md │ ├── once.js │ └── package.json ├── path-is-absolute │ ├── index.js │ ├── license │ ├── package.json │ └── readme.md └── wrappy │ ├── LICENSE │ ├── README.md │ ├── package.json │ └── wrappy.js └── unnamed.patch /.gitignore: -------------------------------------------------------------------------------- 1 | #通用 2 | .idea/* -------------------------------------------------------------------------------- /A0000_quickstart/A01_configuser.md: -------------------------------------------------------------------------------- 1 | # 管理员登录 2 | 3 | 进入地址 http://127.0.0.1/myadmin 4 | 系统初始化会加入默认最高权限管理员,默认用户名admin 密码123456 5 | 登录后进入后台首页 6 | 7 | ![图片](/image/接口测试平台后台首页.png) 8 | 9 | 进入 [用户小组管理] -> [用户管理] 中添加用户: 10 | 11 | ![图片](/image/接口测试平台后台使用用户管理页面.png) 12 | 13 | 点击添加用户,录入用户信息: 14 | 15 | ![图片](/image/接口测试平台后台使用用户添加页面.png) 16 | 17 | 保存后即可登录测试平台前台 http://127.0.0.1/ 18 | 19 | -------------------------------------------------------------------------------- /A0000_quickstart/A02_configbusinessline.md: -------------------------------------------------------------------------------- 1 | # 管理员配置业务线/模块/数据环境 2 | 3 | ## 业务线 4 | 5 | 对系统用户增删改查操作的管理页面 6 | 7 | ### 用户查看列表页[授权]按钮: 8 | 9 | ![图片](/image/接口测试平台后台用户授权按钮.png) 10 | 11 | 当用户权限为非默认权限时,此字段生效,可配置当前用户所具有的权限。 12 | 13 | ### 用户添加字段说明: 14 | 15 | ![图片](/image/接口测试平台后台用户添加页面.png) 16 | 17 | 账号: 登录时使用的唯一账号 (必填) 18 | 19 | 密码: 登录时使用的密码 (必填) 20 | 21 | 确认密码:与密码一致 (必填) 22 | 23 | 用户名: 昵称,显示用 (必填) 24 | 25 | 邮箱: 接口测试报告邮件的邮箱 (必填) 26 | 27 | token: 作为此用户的标识,用户可自己多次生成 (可选) 28 | 29 | 用户类型:作为此用户的标识,预留字段 (可选) 30 | 31 | 审核状态:作为此用户状态标识,状态为通过才可访问系统 (可选) 32 | 33 | 是否有效:作为此用户状态标识,状态为有效才可访问系统 (可选) 34 | 35 | 默认权限:作为此用户基础权限标识,可进入 【权限管理】->【接口权限管理】 中查看默认权限 (可选) 36 | 37 | ## 小组管理 38 | 39 | ![图片](/image/接口测试平台后台小组管理页面.png) 40 | 41 | ### 组员管理: 42 | 43 | 可以编辑小组内的成员,小组内成员之间拥有对互相数据的所有权限 44 | 45 | ### 角色管理: 46 | 47 | 设置组长,小组刚创建时没有组长,初次设置组长后组长可设置组内任意一人为组长,组长之间也可以取消对方的组长角色,设置为组长后, 48 | 组长用户可直接登录后台( http://127.0.0.1/myadmin ),拥有用户管理权限和自己为小组组长的所有小组权限 49 | 50 | ### 授权: 51 | 52 | 管理员或组长可对小组进行授权,此处授权为组内成员相互之间数据的权限,并不影响用户本身的权限 53 | 54 | ### 数据转移: 55 | 56 | 小组内的成员可进行数据转移,将组员A创建的数据转移到组员B名下 57 | 58 | 59 | 60 | 61 | 62 | -------------------------------------------------------------------------------- /A0000_quickstart/A03_interface.md: -------------------------------------------------------------------------------- 1 | # 用例编写 2 | 3 | 用例分为HTTP和DUBBO两种,每种用例又分为单接口和业务流用例。
4 | 在使用入门部分,只讲解HTTP单接口和业务流的入门使用。
5 | 6 | ## 编写单接口用例 7 | 8 | ![图片](/image/接口测试平台前台使用单接口创建.png) 9 | 10 | 接口名称: 本条单接口数据名称标识 11 | 12 | 接口描述: 本条单接口数据详细描述 13 | 14 | 业务线: 一级分组 15 | 16 | 模块: 二级分组 17 | 18 | 来源: 表示被测接口所属平台 19 | 20 | 优先级: 此条用例的优先级 21 | 22 | 准备: 在准备中定义一些初始变量,例如执行登录、执行其他接口用例,调用全局变量组合文本等。 23 | 24 | 执行信息: 按照HTTP协议填入请求方法、请求url、请求参数、请求头、请求体等信息。 25 | 26 | 断言恢复: 普通模式主要是用 ASSERT() 关键字进行断言,或者 ASSERT_STRUCT() 关键字来断言结构。 27 | 28 | 调试: 快捷的在编写用例时调试接口用例。点击接口调试区域的环境按钮,可直接在选择的环境中调试用例。(需要在调试环境下配置被测服务的请求地址) 29 | 30 | ## 编写业务流测试用例 31 | 32 | 业务流为多个业务场景用例,一般是多个接口串联起来的场景。业务流分为业务流信息和步骤信息, 33 | 其中步骤信息与单接口用例相似,包含各类执行信息。
34 |
35 | 业务流用例可直接引用已编写好的单接口: 36 | 37 | ![图片](/image/接口测试平台后台业务流选择单接口页面.png) 38 | 39 | ![图片](/image/接口测试平台前台使用业务流同步与新增步骤.png) 40 | 41 | 同步:勾选同步时,本步骤在业务流中修改不生效,与单接口数据一致,以单接口为准,单接口被修改时,本步骤会同步修改 42 | 43 | 新增步骤:点击置灰步骤的文本框 44 | 45 | 新增步骤后点击步骤右侧的绿色编辑按钮,输入新的步骤数据,这里我们去掉勾选,在步骤1中拿到返回值解析后将某个值传递到下个接口的参数中进行请求示例。 46 | 47 | ![图片](/image/接口测试平台前台业务流变量传递示例.png) 48 | 49 | 在调试中可以看到这个请求的参数,testVal变量已经被解析为 "baidu" 50 | 51 | ![图片](/image/接口测试平台前台使用业务流变量传递调试结果.png) 52 | 53 | 点击保存,存储数据
54 | 55 | 业务流中,后续步骤可以引用前面步骤的变量,以及前面步骤的登录信息等。
56 | -------------------------------------------------------------------------------- /A0000_quickstart/A03_userconfig.md: -------------------------------------------------------------------------------- 1 | # 权限管理 2 | 3 | ## 接口权限管理 4 | 5 | 用户端各个页面的数据权限 6 | 7 | ### 关键字段说明: 8 | 9 | 接口url:平台设置的请求url 10 | 11 | 权限Key:字段属性唯一 12 | 13 | 权限:目前设置为 add / edit / copy / delete / record / run / distinct 14 | 15 | 是否默认:与用户的[是否具有默认权限] 字段对应,此处设置为默认权限的接口是用户拥有的默认权限 16 | 17 | 18 | -------------------------------------------------------------------------------- /A0000_quickstart/A04_admin.md: -------------------------------------------------------------------------------- 1 | # 管理员管理 2 | 3 | 管理员是可以登录后台的用户,系统初始化时会添加一个超级管理阿云 4 | 将用户设置为组长后静默添加此用户为组长,权限为用户管理与自己为组长的小组权限, 5 | 其余管理员需自己添加,也可以添加超级管理员 6 | 7 | ## 管理员添加说明 8 | 9 | 管理员与用户不同的数据,修改管理员的密码不会修改与管理员登录名一致的前台用户的密码。 10 | 11 | 超级管理员具有所有权限,包括前台数据的所有权限。 12 | 13 | 超级管理员不可以被授权,即使授权也无效。 14 | 15 | 普通管理员只能被授权后台的权限。 16 | -------------------------------------------------------------------------------- /A0000_quickstart/A04_task.md: -------------------------------------------------------------------------------- 1 | # 任务 2 | 3 | 任务为多个单接口和业务流的合集,任务执行为串行,执行完毕后自动生成测试报告,任务中可直接引入单接口和业务流用例 4 | 5 | ## 添加任务 6 | 7 | ![图片](/image/测试平台前台使用添加任务.png) 8 | 9 | 输入任务名称、描述后,引入单接口用例和业务流用例,保存任务。 10 | 11 | ## 任务执行 12 | 13 | ![图片](/image/接口测试平台前台任务列表指示执行.png) 14 | 15 | 选择```执行环境```后,点击 ```立即执行``` 后自动跳转到执行进度页面执行完毕后生成执行结果 16 | 17 | ![图片](/image/接口测试平台前台选择环境执行任务.png) 18 | 19 | ## 查看任务执行报告 20 | 21 | ![图片](/image/接口测试平台前台使用任务执行结果.png) 22 | 23 | 点击 ```统计/详情``` 按钮查看执行详情 24 | 25 | ![图片](/image/接口测试平台前台使用任务执行报告统计.png) 26 | 27 | 点击 ```接口/用例``` 按钮 切换查看单接口用例和业务流用例执行结果 28 | 29 | ![图片](/image/接口测试平台前台使用任务报告详情.png) 30 | 31 | 32 | # 任务集 33 | 34 | 任务集为多个任务的合集,任务集为并行,每个任务都有自己的进程,各个任务的执行顺序依然为串行 35 | 36 | ## 添加任务集 37 | 38 | ![图片](/image/接口测试平台前台使用添加任务集.png) 39 | 40 | ## 任务集执行 41 | 42 | ![图片](/image/接口测试平台前台使用任务集列表执行.png) 43 | 44 | 选择 ```执行环境``` 后 可执行任务集 45 | 46 | ![图片](/image/接口测试平台前台使用任务集执行.png) 47 | 48 | ## 任务集执行报告 49 | 50 | ![图片](/image/接口测试平台前台使用任务集结果列表查看报告.png) 51 | 52 | 任务集的报告中链接到各个任务的报告 53 | 54 | ![图片](/image/接口测试平台前台任务集测试报告.png) -------------------------------------------------------------------------------- /A0000_quickstart/A05_cicd.md: -------------------------------------------------------------------------------- 1 | # 结合jenkins的持续集成 2 | 3 | 首先进入 ```配置管理``` ```持续集成```中按提示更新token 4 | 5 | ![图片](/image/接口测试平台前台使用token更新.png) 6 | 7 | ## 使用sosotest jenkins 插件的持续集成 8 | 9 | 安装jenkins插件 10 | 11 | 新增插件构建步骤 12 | 13 | ![图片](/image/接口测试平台使用jenkins插件.png) 14 | 15 | ## 使用shell 脚本的持续集成 16 | 17 | 新增 执行 shell 构建步骤 18 | 19 | ![图片](/image/接口测试平台前台使用持续集成示例.png) 20 | 21 | 22 | 23 | 24 | 25 | 26 | -------------------------------------------------------------------------------- /A0000_quickstart/A05_config.md: -------------------------------------------------------------------------------- 1 | # 平台配置管理 2 | 3 | ## 业务线管理 4 | 5 | 业务线是用例属性的一级分类,需与模块关联,本系统中用例可拥有共两级分类,以区分用例所属的团队、功能、范围等信息 6 | 7 | ## 模块管理 8 | 9 | 模块是用例属性的二级分类,需与业务线关联,本系统中用例可拥有共两级分类,以区分用例所属的团队、功能、范围等信息 10 | 11 | ## 业务线模块关联关联 12 | 13 | 多对多关系管理业务线与模块 14 | 15 | ## 来源管理 16 | 17 | 标记HTTP接口来源 18 | 19 | ## 数据服务器管理 20 | 21 | 发送请求的数据服务器配置,一个数据服务器可关联多个环境,可配置服务器的 DB、Redis ,且可配置多个 主键值分别为 [DB] / [REDIS] 22 | 23 | 数据服务器 Key值 与 名称 添加后不可修改 24 | 25 | 例: 26 | 27 | [DB] 28 | host = 0.0.0.0 29 | port = 3306 30 | 31 | [DB-test] 32 | host = 192.168.0.1 33 | port = 3305 34 | 35 | ## 环境配置管理 36 | 37 | 请求的环境,多个环境可指向同一个数据服务器,与数据服务器是多对一的关系 38 | 39 | 环境配置 key值 与 名称 添加后不可修改 40 | 41 | 执行时是否显示: 在执行时是否显示此环境 42 | 43 | ## uri管理 44 | 45 | 系统中使用uri来管理服务器的域名,此处只是添加一个空的uri,在前台中配置各环境的uri 46 | 47 | 优先级:数字越小,默认显示的uri排序越靠前 48 | 49 | uri管理 key值 与 名称 添加后不可修改 50 | 51 | ## 服务管理 52 | 53 | 分布式中对slave的管理,服务在启动时根据根目录config.ini 注册到master,注册后自动在此页面新增slave信息, 54 | 默认执行任务进程最大数和调试进程最大数为0,在此页面配置进程数。 55 | 56 | ## 执行Python代码管理 57 | 58 | 关于执行Python代码的时间以及默认引入库的配置,建议使用初始值,超过限定时间会强制停止线程执行,返回超时提示。 59 | 60 | 在使用三方库时需先在服务器上安装库 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | -------------------------------------------------------------------------------- /A0000_quickstart/A06_operate.md: -------------------------------------------------------------------------------- 1 | # 操作记录管理 -------------------------------------------------------------------------------- /A0000_quickstart/README.md: -------------------------------------------------------------------------------- 1 | # 从零开始你的测试 2 | 3 | 本章主要讲述sosotest安装部署完之后, 4 | 如何从零开始配置数据、环境、服务、编写用例、创建任务(集), 5 | 一直到为持续集成提供服务。
6 |
7 | >本章所有示例均以部署到本机为准,请求地址是 http://127.0.0.1 8 | 9 |
10 | 下面是sosotest的设计模型,通过此模型可以更好的理解平台的配置。
11 | 12 | ![图片](/image/测试模型.png) 13 | 14 | 首先是最基础的数据服务。
15 | >一般包括数据库,redis,mango等。目前支持mysql数据库配置和redis配置。 16 | 17 | 数据服务之上就是环境。 18 | >一个公司的测试环境应该包含多套,每套环境下应该有多个服务的闭环或者被测服务与mock服务的闭环。
19 | >多个环境可以用同一套数据服务。比如环境A和环境B都是使用的数据服务M。环境C使用数据服务N。 20 | 21 | 环境之中部署的就是服务。
22 | >服务表示被测系统,比如有个服务向外提供http服务,我们就需要添加这个服务到sosotest上。
23 | >命名规则建议使用git的项目名称进行申请,服务多的情况下能够很好的区分。
24 | >同一个服务只需要申请一次,在多个环境下执行也只需要申请一次即可。 25 | 26 | 在对应环境下部署的对应服务应该向外提供服务访问地址,也就是请求地址配置。
27 | >同一个环境下可以部署多套服务。
28 | >同理,同一个服务可以部署多套测试环境。
29 | >某个环境下的某个服务对外提供一个请求地址,[环境-服务] 是联合唯一的。
30 | >比如环境A下服务1的请求地址是 http://envA.git1.com,那么环境A下的服务1就不能再有其他的请求地址配置。
31 | >假设环境B下服务1的请求地址是 http://envB.git1.com,那么服务1的测试用例就可以在环境A和B下同时测试。 32 | 33 | 数据服务->环境->服务->请求地址,这是sosotest的设计模型中的配置层面的重要的四部分。 34 | 35 | -------------------------------------------------------------------------------- /A0001_admin/A01_login.md: -------------------------------------------------------------------------------- 1 | # 管理员登录 2 | 3 | 进入地址 http://127.0.0.1/myadmin 4 | 系统初始化会加入默认最高权限管理员,默认用户名admin 密码123456 5 | 登录后进入 6 | 7 | ***如要执行测试,要先启动master和最少一个slave,然后进入平台配置管理->执行服务管理中,配置最大可执行的调试进程和任务执行进程,缺省值为1*** -------------------------------------------------------------------------------- /A0001_admin/A02_user_group_manage.md: -------------------------------------------------------------------------------- 1 | # 用户小组管理 2 | 3 | 用户管理为对用户数据的增删改查,小组管理为对用户数据的共享,同小组的数据可相互操作 4 | 5 | ## 用户管理 6 | 7 | 对系统用户增删改查操作的管理页面 8 | 9 | ### 用户查看列表页[授权]按钮: 10 | 11 | 当用户权限为非默认权限时,此字段生效,可配置当前用户所具有的权限。 12 | 13 | ### 用户添加字段说明: 14 | 15 | 账号: 登录时使用的唯一账号 (必填) 16 | 17 | 密码: 登录时使用的密码 (必填) 18 | 19 | 确认密码:与密码一致 (必填) 20 | 21 | 用户名: 昵称,显示用 (必填) 22 | 23 | 邮箱: 接口测试报告邮件的邮箱 (必填) 24 | 25 | token: 作为此用户的标识,用户可自己多次生成 (可选) 26 | 27 | 用户类型:作为此用户的标识,预留字段 (可选) 28 | 29 | 审核状态:作为此用户状态标识,状态为通过才可访问系统 (可选) 30 | 31 | 是否有效:作为此用户状态标识,状态为有效才可访问系统 (可选) 32 | 33 | 默认权限:作为此用户基础权限标识,可进入 【权限管理】->【接口权限管理】 中查看默认权限 (可选) 34 | 35 | ## 小组管理 36 | 37 | ### 组员管理: 38 | 39 | 可以编辑小组内的成员,小组内成员之间拥有对互相数据的所有权限 40 | 41 | ### 角色管理: 42 | 43 | 设置组长,小组刚创建时没有组长,初次设置组长后组长可设置组内任意一人为组长,组长之间也可以取消对方的组长角色,设置为组长后, 44 | 组长用户可直接登录后台( http://127.0.0.1/myadmin ),拥有用户管理权限和自己为小组组长的所有小组权限 45 | 46 | ### 授权: 47 | 48 | 管理员或组长可对小组进行授权,此处授权为组内成员相互之间数据的权限,并不影响用户本身的权限 49 | 50 | ### 数据转移: 51 | 52 | 小组内的成员可进行数据转移,将组员A创建的数据转移到组员B名下 53 | 54 | 55 | 56 | 57 | 58 | -------------------------------------------------------------------------------- /A0001_admin/A03_permission.md: -------------------------------------------------------------------------------- 1 | # 权限管理 2 | 3 | 对前台及后台的权限控制 4 | 5 | ## 接口权限管理 6 | 7 | 用户端各个页面的数据权限 8 | 9 | ### 关键字段说明: 10 | 11 | 接口url:平台设置的请求url 12 | 13 | 权限Key:字段属性唯一 14 | 15 | 权限:目前设置为 add / edit / copy / delete / record / run / distinct 16 | 17 | 是否默认:与用户的[是否具有默认权限] 字段对应,此处设置为默认权限的接口是用户拥有的默认权限 18 | 19 | 20 | -------------------------------------------------------------------------------- /A0001_admin/A04_admin.md: -------------------------------------------------------------------------------- 1 | # 管理员管理 2 | 3 | 管理员是可以登录后台的用户,系统初始化时会添加一个超级管理员 4 | 将用户设置为组长后静默添加此用户为组长,权限为用户管理与自己为组长的小组权限, 5 | 其余管理员需自己添加,也可以添加超级管理员 6 | 7 | ## 管理员添加说明 8 | 9 | 管理员与用户不同的数据,修改管理员的密码不会修改与管理员登录名一致的前台用户的密码。 10 | 11 | 超级管理员具有所有权限,包括前台数据的所有权限。 12 | 13 | 超级管理员不可以被授权,即使授权也无效。 14 | 15 | 普通管理员只能被授权后台的权限。 16 | -------------------------------------------------------------------------------- /A0001_admin/A06_operate.md: -------------------------------------------------------------------------------- 1 | # 操作记录管理 -------------------------------------------------------------------------------- /A0001_admin/README.md: -------------------------------------------------------------------------------- 1 | # 后台管理部分 2 | 3 | 管理员或者组长登录后,可以通过后台管理进行用户小组管理,业务线模块配置,来源配置,数据服务(mysqldb-redis-mongo)的配置。
4 | 系统管理员还可以进行slave并行任务数量控制等。 -------------------------------------------------------------------------------- /A0002_user/A01_config.md: -------------------------------------------------------------------------------- 1 | # 配置管理 2 | ## 1、环境配置 3 | 4 | 进入环境配置页面,先查看是否有满足条件的环境,系统内置了test1-test5,以及与发布,线上等。 5 | 6 | 如果没有,点击「添加」,出现下方输入框,配置名称和环境key可以写同一个,,配置描述是对这个环境的描述,数据服务,选择此套环境对应的数据库,填写完毕后,点击「添加」即可。 7 | 8 | ![图片](/image/接口测试平台配置管理之环境配置.png) 9 | 10 | ## 2、服务配置 11 | 一个服务只需添加一次,选择不同的协议类一类型即可 12 | 13 | 进入配置管理-->服务配置,点击「添加」,进入到页面底部,选择要申请添加的服务的支持的协议,支持多选,然后写入git地址的最后一个/和.git之间的内容,举例:git@git.lianjia.com:alliance/evaluate-biz-support.git。 服务名称填写evaluate-biz-support即可。 14 | 15 | ![图片](/image/接口测试平台配置管理之服务配置.png) 16 | 17 | ## 3、请求地址配置 18 | 环境、服务配置完成后,要针对不同的环境,配置自己服务的请求地址 19 | 20 | 进入配置管理-->请求地址配置,点击「添加」,选择你要进行测试的环境、服务,在下方写下请求地址,例如http:test-evaluate.biz.ke.com(http协议需要加协议名称)、10.26.33.94: 11877(dubbo只要ip:port即可) 21 | 22 | ![图片](/image/接口测试平台配置管理之请求地址配置.png) 23 | 24 | -------------------------------------------------------------------------------- /A0002_user/A02_http.md: -------------------------------------------------------------------------------- 1 | # HTTP接口测试 2 | ## 添加接口 3 | 4 | ![图片](/image/接口测试平台http之添加接口.png) 5 | 6 | 点击左上方「添加接口用例」,输入接口名称、接口描述,选择业务线及模块(如果没有可联系业务线管理员配置) 7 | 8 | 准备部分可以根据需要填写,如需要校验某个字段,在右侧选择DB_SELECT,输入你需要的数据库,及sql,当然你也可以不写。来源及优先级根据需要填写。规范请参照:http://wiki.lianjia.com/pages/viewpage.action?pageId=322752452 9 | 10 | 11 | ![图片](/image/接口测试平台http之添加接口2.png) 12 | 13 | 选择自己测试的接口请求方式,输入接口的URL,超时时间,性能时间,选填。默认是20和1。 14 | 15 | 参数按需填写,断言可断言值,可断言结构。详情参照下方:断言处理。 16 | 17 | ## 添加业务流 18 | 19 | ![图片](/image/接口测试平台http之业务流.png) 20 | 21 | 点击「添加业务流」-->「选择单接口」,下方出现你添加的所有接口,选取需要测试的接口,点击保存,如下图: 22 | 23 | 24 | ![图片](/image/接口测试平台http之任务流执行顺序.png) 25 | 26 | 上下拖动「步骤一」、「步骤二」可以实现顺序执行case 27 | 28 | 点击「保存」,创建任务流完成 29 | 30 | ## 添加任务 31 | 点击「添加任务」,进入下方页面,输入任务名称、任务描述、优先级、持续集成,默认邮件列表 32 | 优先变量按需填写,接下来点击「选择但接口」或者「选择业务流」,「选择但接口」同上,「选择业务流」是选择你创建过的业务流,可以选择N个,同样支持调整执行顺序,鼠标拖动「序号」,点击「保存」即可。 33 | 34 | ![图片](/image/接口测试平台http之添加任务.png) 35 | 36 | ## 添加任务集 37 | 操作同任务大同小异,点击「添加任务集」,输入「任务集名称」、「任务集描述」、「默认邮件列表」后,点击「选择任务」,选择你创建的任务(同样支持按顺序执行)。 38 | ![图片](/image/接口测试平台http之添加任务集.png) 39 | 40 | ## 执行结果 41 | 42 | ![图片](/image/接口测试平台http之执行结果.png) 43 | 44 | 默认按照执行人搜索、也可按照上图中箭头所指一行信息进行搜索 45 | 46 | 同时还可以在每个执行后面查看任务信息、执行及查看报告 47 | 48 | 49 | ## 历史统计 50 | 51 | 此页面记录已添加到任务的接口执行情况,可按照URI、接口URL、任务编号、任务执行编号、环境配置名称进行搜索 52 | 53 | 54 | 55 | 56 | 57 | -------------------------------------------------------------------------------- /A0002_user/A03_dubbo.md: -------------------------------------------------------------------------------- 1 | # DUBBO接口测试 2 | 3 | 4 | ## DUBBO接口添加 5 | 首先进入```数据服务``` ```DUBBO接口```页面 添加 6 | ![图片](/image/接口测试平台DUBBO接口添加.png) 7 | ![图片](/image/接口测试平台DUBBO接口添加case.png) 8 | 输入接口名称(必填),接口描述(必填),业务线,准备信息,执行信息(必填),断言,[保存]即可. 9 | 10 | ## DUBBO接口查询 11 | 12 | ![图片](/image/接口测试平台DUBBO接口查询.png) 13 | 可根据接口创建人、接口编号、接口名称、接口描述、系统system、服务serviceClass、接口method、业务线、模块条件匹配查询 14 | 15 | ## DUBBO接口使用 16 | 17 | ![图片](/image/接口测试平台DUBBO接口使用.png) 18 | 19 | 根据case所需测试环境,选择页面底部已配置的环境点击执行 20 | 21 | ## DUBBO接口操作 22 | 23 | ![图片](/image/接口测试平台DUBBO接口操作.png) 24 | 25 | 点击 ```查看``` 按钮查看接口详情,点击 ```复制``` 按钮可以复制接口编辑调试后[保存]成新的接口, 26 | 点击 ```删除``` 按钮删除接口,点击```编辑``` 按钮可修改接口并进行调试 27 | 28 | ## DUBBO接口导入日志 29 | 30 | ![图片](/image/接口测试平台DUBBO接口导入日志.png) 31 | 32 | 文件上传成功解析后,页面底部有[开始导入]按钮,对于平台解析出的用例,可进行导入,或是删除不需要的用例后再导入 33 | 平台有对历史的用例进行去重:去重是根据接口,方法,及请求参数的key一致性 34 | 导入后,可查看及编辑用例 35 | 36 | -------------------------------------------------------------------------------- /A0002_user/A04_globalvar.md: -------------------------------------------------------------------------------- 1 | # 全局变量 2 | 3 | 全局变量可以在平台中所有case处引用,常在[准备/执行信息/断言恢复]中使用 4 | 5 | ## 全局变量添加 6 | 首先进入```数据服务``` ```全局变量```页面 添加 7 | ![图片](/image/接口测试平台数据服务.png) 8 | ![图片](/image/接口测试平台全局变量添加.png) 9 | 输入变量key,变量值及变量描述,保存编辑即可. 10 | 变量值如果是各环境通用全局变量,则输入通用全局变量字段即可,否则可根据各套环境输入对应环境的变量值. 11 | 12 | ## 全局变量查询 13 | 14 | ![图片](/image/接口测试平台全局变量查询.png) 15 | 可根据[创建人]/[变量key]/[变量value]/[变量描述]条件匹配查询 16 | 17 | ## 全局变量使用 18 | 19 | ![图片](/image/接口测试平台全局变量使用.png) 20 | 21 | 调用方式$GVAR[gvarKey] ,可直接在[准备/执行信息/断言恢复]等处使用 22 | 23 | ## 全局变量操作 24 | 25 | ![图片](/image/接口测试平台全局变量操作.png) 26 | 27 | 点击 ```查看``` 按钮查看变量详情,点击 ```删除``` 按钮删除变量,点击```编辑``` 按钮可修改变量 28 | 29 | ![图片](/image/接口测试平台全局变量编辑.png) 30 | 31 | 32 | -------------------------------------------------------------------------------- /A0002_user/A05_text.md: -------------------------------------------------------------------------------- 1 | # 组合文本 2 | 3 | 组合文本可以在平台中所有case处引用,常在[准备/执行信息/断言恢复]中使用 4 | 5 | ## 组合文本添加 6 | 首先进入```数据服务``` - ```组合文本```页面 添加 7 | ![图片](/image/接口测试平台数据服务组合文本.png) 8 | ![图片](/image/接口测试平台组合文本添加.png) 9 | 输入配置key,配置Value及变量描述,[添加]即可。
10 |
11 | 组合文本中变量值如果是各环境通用变量,则输入通用变量字段即可,否则可根据各套环境输入对应环境的变量值. 12 | ![图片](/image/接口测试平台组合文本环境变量.png) 13 | 14 | ## 组合文本查询 15 | 16 | ![图片](/image/接口测试平台组合文本查询.png) 17 | 可根据[创建人]/[文本key]/[变量value]/[变量描述]条件匹配查询 18 | 19 | ## 组合文本使用 20 | 21 | ![图片](/image/接口测试平台组合文本使用.png) 22 | ![图片](/image/接口测试平台组合文本使用结果.png) 23 | 24 | 调用方式1:$TEXT[textKey] 25 | 调用方式2:$IMPORT[textKey] 26 | 调用方式3:$RUNFUNC[textKey] 27 | 28 | ## 全组合文本操作 29 | 30 | ![图片](/image/接口测试平台组合文本操作.png) 31 | 32 | 点击 ```查看``` 按钮查看组合文本详情,点击 ```删除``` 按钮删除组合文本,点击```编辑``` 按钮可修改组合文本 33 | 34 | ![图片](/image/接口测试平台组合文本编辑.png) 35 | 36 | 37 | -------------------------------------------------------------------------------- /A0002_user/README.md: -------------------------------------------------------------------------------- 1 | # 用户使用 2 | 3 | 本章主要讲述用户如何配置服务、环境和请求地址,配置完成后如何进行接口测试。
4 | 介绍平台数据的维护,如何进行数据业务分离。
5 | -------------------------------------------------------------------------------- /A0003_mock/A01_mock_introduce.md: -------------------------------------------------------------------------------- 1 | # mock介绍 2 | 3 | -------------------------------------------------------------------------------- /A0003_mock/A03_requestmock.md: -------------------------------------------------------------------------------- 1 | # 请求mock 2 | 3 | 下图是示例列表: 4 | ![图片](/image/MOCK请求方式列表展示.png) 5 | 说明:
6 | 待配置的请求URI的配置分为4部分,分别为入口mock,服务key,TagKey,环境Key(环境key可定制录制详情,下一节讲到)。
7 | 举例:http://127.0.0.1/mock/http-testservice/common/test1
8 | 例如/getuser有3个MOCK信息,但是mock地址都是:http://127.0.0.1/mock/http-testservice/common/test1/getuser
9 | 只需要将实际请求的URI配置为http://127.0.0.1/mock/http-testservice/common/test1即可,那么请求到源服务的/getuser,将请求到mock服务。
10 |
11 | # 小技巧:
12 | 如果发现mock返回的信息与预期要返回的信息不一致时,查看响应的header中是否有mockinfo的信息, 13 | 如果有看看mock id是否正确,如果没有就是没有从mock平台返回,是录制返回的。 14 | -------------------------------------------------------------------------------- /A0003_mock/A04_recodermock.md: -------------------------------------------------------------------------------- 1 | # mock录制 2 | 3 | mock录制是sosotest的一个特色功能,你可以通过在环境中配置服务的请求地址,然后配置录制参数后,就可以通过mock服务来录制被mock服务的接口信息。
4 | 例如服务http-testservice有接口/getuser,在环境key为test1的请求地址为http://testservice.com。
5 | 此时用url
6 | http://127.0.0.1/mock/http-testservice/common/test1/getuser?id=1
7 | 来访问mock服务,如果mock平台没有此mock信息,mock服务将会发送请求 http://testservice.com/getuser?id=1 到test1的请求地址, 8 | 然后获取到响应后,将接口信息录制到平台,并返回实际结果是mock调用方。
9 |
10 | 默认录制时,只录制请求的url信息,请求的param、body、header等默认不变录制。如果要定制录制方式,可以使用如下方式:
11 | 在环境key后面加入---rec,然后在---rec后加入要录制的参数,例如-no -all -header -param -body
12 | 举例如下:
13 | >不录制任何信息,只是实时的获取实际服务的响应结果并返回
14 | >http://127.0.0.1/mock/http-testservice/common/test1---rec-no/getuser?id=1
15 | 16 | >录制所有信息(url/param/header/body)到mock数据
17 | >http://127.0.0.1/mock/http-testservice/common/test1---rec-all/getuser?id=1 18 | 19 | >录制url和请求行的参数信息到mock数据
20 | >http://127.0.0.1/mock/http-testservice/common/test1---rec-param/getuser?id=1 21 | 22 | >录制url和请求体的body信息到mock数据
23 | >http://127.0.0.1/mock/http-testservice/common/test1---rec-body/getuser?id=1 24 | 25 | >录制url、请求行的参数信息和请求体的body信息到mock数据
26 | >http://127.0.0.1/mock/http-testservice/common/test1---rec-param-body/getuser?id=1 -------------------------------------------------------------------------------- /A0003_mock/README.md: -------------------------------------------------------------------------------- 1 | # MOCK服务 2 | 3 | sosotest提供了HTTP MOCK服务。本章主要介绍:
4 | 5 | * 如何使用MOCK服务进行HTTP接口mock,如何mock restful接口,如何动态返回mock结果。
6 | * 如何设置代理使用MOCK服务进行接口录制。
7 | * 如何使用MOCK绑定接口用例实现契约测试。
8 | 9 | -------------------------------------------------------------------------------- /A0004_keyword/A01_use.md: -------------------------------------------------------------------------------- 1 | # 使用关键字 2 | 3 | 在准备和断言恢复中,可以使用关键字,关键字又分为内置关键字和自定义关键字。
4 |
5 | ## 关键字模式使用规则 6 | 1、无需引入,直接使用。
7 | 2、必须是英文半角分号结尾。
8 | 3、注释是英文半角#开头,英文半角;结尾。例如:
9 | ```python 10 | # 这是一个合法的注释,注意看我后面; 11 | ``` 12 | 4、变量声明key = value;,英文半角分号;结尾。变量值不分类型,都是字符串,不需要加引号!例如:
13 | ```python 14 | # 这是一个变量声明; 15 | name= wangjiliang; 16 | userid = 100001; 17 | ``` 18 | 5、关键字模式下调用关键字,直接使用关键字即可。参数值不分类型,都是字符串,不需要加引号!
19 | 参数分为列表参数和字典参数,列表参数直接写值即可,字典参数要写key和value,多个参数用英文半角逗号,分隔。例如:
20 | ```python 21 | # 执行接口HTTP_INTERFACE_1; 22 | EXECUTE_INTERFACE(HTTP_INTERFACE_1); 23 | # 生成一个1到10的随机数并赋值给变量randint; 24 | randint = RANDOM_INT(1,10); 25 | # redis设置值(设计redis、db的使用在章节数据操作中介绍),其中timeout等属于字典参数; 26 | REDIS_SET( name,wangjiliang,timeout=10,db=0,service=testservice ); 27 | ``` 28 | 29 | 使用示例见下图:
30 | ![图片](/image/KEYWORD示例.png) -------------------------------------------------------------------------------- /A0004_keyword/A02_buildin.md: -------------------------------------------------------------------------------- 1 | # 内置关键字介绍 2 | 3 | 本节主要介绍平台内置的关键字。
4 | 这些关键字都是在准备和断言恢复中进行使用的。
5 | 6 | # mysql数据操作类关键字 7 | 8 | ## mysql数据库查询:DB_SELECT(service,sql) 9 | ### 输入:
10 | 参数1 service:数据服务配置中的DB配置下的key。 11 | 参数2 sql: 要执行的select语句。必须是select语句,且必须有where子句。表名要带数据库名。
12 | 例如后台管理员配置过服务service为test,且test的配置下有database dbA下有数据表tableA,那么sql语句应该是:
13 | ```python 14 | datalist = DB_SELECT( test, select * from dbA.tableA where id = 1 ); 15 | ``` 16 | ### 输出:
17 | 输入是一个列表,列表下是json字符串。举例如下:
18 | ```python 19 | [{"id":1,"name":"张三"},{"id":2,"name":"李四"}] 20 | ``` 21 | -------------------------------------------------------------------------------- /A0004_keyword/README.md: -------------------------------------------------------------------------------- 1 | # 关键字模式介绍 2 | 3 | 在处理执行前的准备和执行后的断言恢复时,有两种模式可以使用。一种是关键字模式,一种是python模式,本章主要介绍关键字模式。
4 | 本章主要介绍如何什么是关键字模式,如何使用内置关键字,如何编写自定义关键字。 5 | 6 | # 部分完成(内置说明未完成) 7 | -------------------------------------------------------------------------------- /A0005_pythonmode/A01_use.md: -------------------------------------------------------------------------------- 1 | # 使用python模式 2 | 3 | ## 如何进入python模式 4 | 在准备、断言恢复输入框中,以 # python开头,即可进入python模式。进入python模式后,框内的代码均以python方式处理,关键字模式的调用需要使用内置call函数完成。 5 | 6 | ## python模式使用规则 7 | 1、纯python语法。
8 | 2、内置python函数无需引入。
9 | 3、自定义python代码需要imports后才可使用。
10 | 11 | ## 示例 12 | python模式下变量声明:
13 | ```python 14 | # python 15 | varint = 1 16 | varstr = "this is a string" 17 | ``` 18 | 19 | python模式下调用关键字:
20 | ```python 21 | # python 22 | varint = call("RANDOM_INT(1,10)") 23 | ``` 24 | -------------------------------------------------------------------------------- /A0005_pythonmode/A02_buildin.md: -------------------------------------------------------------------------------- 1 | # 内置python函数介绍 -------------------------------------------------------------------------------- /A0005_pythonmode/A04_ddt.md: -------------------------------------------------------------------------------- 1 | # 数据驱动 2 | 3 | 使用python模式的内置函数```execute_current()```,能够实现数据驱动。
4 | 5 | ## 示例 6 | 场景:
7 | 测试使用不同的用户进行登录接口测试。 8 | 代码如下: 9 | ```python 10 | # python 11 | IS_CONTINUE = False # 执行完数据驱动脚本后,无需继续执行 12 | userlist = ["zhangsan","lisi","wangwu","zhaoliu"] 13 | totalcount, passcount, failcount = 0,0,0 14 | for user in userlist: 15 | execute_current() # 执行当前接口的执行信息,使用变量user 16 | # 输出执行后的输入和输出信息 17 | log("processedHeader: %s" % context.processedHeader) 18 | log("processedUrl: %s" % context.processedUrl) 19 | log("processedParams: %s" % context.processedParams) 20 | log("processedBodyContent: %s" % context.processedBodyContent) 21 | retContent = const("RESP_TEXT") 22 | log("retContent: %s" % retContent) 23 | # 对返回结果进行判断。 24 | if "sosotest" in retContent: 25 | passcount += 1 26 | log("PASS") 27 | else: 28 | failcount += 1 29 | log("FAIL") 30 | 31 | # 开始设置测试结果,如果有失败则失败,否则全部成功。 32 | if failcount > 0: 33 | set_result("FAIL","测试未通过,失败%d次。" % failcount) 34 | else: 35 | set_result("PASS","测试通过.") 36 | ``` 37 | 图片示例: 38 | ![图片](/image/PYTHON数据驱动.png) -------------------------------------------------------------------------------- /A0005_pythonmode/README.md: -------------------------------------------------------------------------------- 1 | # python模式介绍 2 | 3 | 在处理执行前的准备和执行后的断言恢复时,有两种模式可以使用。一种是关键字模式,一种是python模式,本章主要介绍python模式。
4 | 本章主要介绍如何什么是python模式,如何使用内置python函数,如何编写自定义python代码。 5 | 6 | # 部分完成(内置说明未完成) 7 | -------------------------------------------------------------------------------- /A0006_ci/A01_invoke.md: -------------------------------------------------------------------------------- 1 | # invoke接口介绍 -------------------------------------------------------------------------------- /A0006_ci/A02_cishell.md: -------------------------------------------------------------------------------- 1 | # CI shell 脚本说明 -------------------------------------------------------------------------------- /A0006_ci/README.md: -------------------------------------------------------------------------------- 1 | # 持续集成 2 | 3 | 如何使用sosotest提供的invoke接口调度平台执行任务,如何通过回调获取执行结果,如何使用jenkins插件完成sosotest任务执行。 4 | 5 | 6 | # 暂未完成 -------------------------------------------------------------------------------- /A0007_assert/A02_recurjson.md: -------------------------------------------------------------------------------- 1 | # 递归JSON断言 2 | 假设接口用例执行的返回结果是:
3 | ```python 4 | { 5 | "code":10000, 6 | "message":"success", 7 | "data":{ 8 | "name":"Criss", 9 | "age":18 10 | } 11 | } 12 | ``` 13 |
14 | 15 | ## 关键字模式下的JSON递归断言 16 | 使用内置关键字`ASSERT()`
17 |
18 | 假设要断言name是Criss。
19 | 只需要将相应的json当作参数传入关键字,如下:
20 | ```python 21 | ASSERT({"data":{"name":"Criss"}}); 22 | ``` 23 |
24 | 假设要断言name是Criss,code是10000。
25 | 只需要将要断言的部分写成结构相同的json语句即可,不断言的部分不写,如下:
26 | ```python 27 | ASSERT( 28 | { 29 | "code":10000, 30 | "data":{"name":"Criss"} 31 | } 32 | ); 33 | ``` 34 | 35 | ## python模式下的JSON递归断言 36 | 使用内置函数`asserts()`
37 |
38 | 假设要断言name是Criss。
39 | 只需要将相应的json当作参数传入关键字,如下:
40 | ```python 41 | asserts('{"data":{"name":"Criss"}}') 42 | ``` 43 |
44 | 假设要断言name是Criss,code是10000。
45 | 只需要将要断言的部分写成结构相同的json语句即可,不断言的部分不写,如下:
46 | ```python 47 | asserts(""" 48 | { 49 | "code":10000, 50 | "data":{"name":"Criss"} 51 | } 52 | """) 53 | ``` -------------------------------------------------------------------------------- /A0007_assert/A04_assertstruct.md: -------------------------------------------------------------------------------- 1 | # 结构断言 2 | 3 | 假设接口用例执行的返回结果是:
4 | ```python 5 | { 6 | "code":10000, 7 | "message":"success", 8 | "data":{ 9 | "name":"Criss", 10 | "age":18 11 | } 12 | } 13 | ``` 14 |
15 | 16 | ## 关键字模式下的结构断言 17 | 使用内置关键字`ASSERT_STRUCT()`
18 |
19 | 要对返回的结果进行结构断言,
20 | 只需要将正确的json结构传入,只要对应的key对应的数据类型正确即可,如下:
21 | ```python 22 | ASSERT_STRUCT( 23 | { 24 | "code":10002, 25 | "message":"rror", 26 | "data":{ 27 | "name":"Cassie", 28 | "age":10 29 | } 30 | } 31 | ); 32 | ``` 33 | 注:即使我们的code,message等的值与返回值不符合,但是类型符合,结构断言依然是通过的。
34 |
35 | 36 | ## python模式下的结构断言 37 | 使用内置函数`assert_struct()`
38 |
39 | 要对返回的结果进行结构断言,
40 | 只需要将正确的json结构传入,只要对应的key对应的数据类型正确即可,如下:
41 | ```python 42 | assert_struct(""" 43 | { 44 | "code":10002, 45 | "message":"rror", 46 | "data":{ 47 | "name":"Cassie", 48 | "age":10 49 | } 50 | } 51 | """) 52 | ``` 53 | 54 | -------------------------------------------------------------------------------- /A0007_assert/README.md: -------------------------------------------------------------------------------- 1 | # 断言处理 2 | 3 | 本章介绍
4 | 如何在关键字模式下使用ASSERT()关键字进行断言;
5 | 如何在python模式下使用asserts()函数进行断言。 -------------------------------------------------------------------------------- /A0008_errors/A03_other.md: -------------------------------------------------------------------------------- 1 | # 莫名其妙的错误 2 | 3 | ## 关键字模式 4 | 发现不了变量:
5 | >看看每个语句后面是否有分号,包括注释也要有分号结尾。
6 | 7 | 关键字未执行:
8 | >关键字后面的括号与关键字之间是否有空格。
9 | >关键字的括号是否是英文半角。 10 | 11 | ## python模式 12 | python代码报错:
13 | >看看代码缩进是不是4个空格,还是tab。
14 | >默认的tab会转为空格,不排除一些未考虑到的情况,比如用户复制粘贴过来的代码。 -------------------------------------------------------------------------------- /A0008_errors/README.md: -------------------------------------------------------------------------------- 1 | # 常见错误原因 -------------------------------------------------------------------------------- /A0009_data/A02_redis.md: -------------------------------------------------------------------------------- 1 | # redis缓存操作 2 | 3 | ![图片](/image/DATASERVICE用户配置value截图.png) 4 | 5 | 在```准备```或者```断言恢复```中,可以通过关键字或者python内置函数进行redis操作。
6 | 请记住两个概念:图片中 ```=>``` 之前的是**service**,之后的是配置的请求地址。
7 | 本图中REDIS下有两个**service**,分别是default和service1,其中default的配置在关键字调用时可以省略(建议不要省略,便于理解)。
8 | 9 | ## 关键字模式下的redis操作 10 | 11 | > 调用的关键字模式,均是大写 12 | 13 | ```python 14 | 15 | # 使用关键字设置redis,第一个参数是key,第二个参数是value。后面3个字典参数有默认值。; 16 | REDIS_SET( key,value,timeout=10,db=0,service=default ); 17 | 18 | # 使用关键字REDIS_GET得到某个key的值并返回; 19 | getvalue = REDIS_GET( key,db=0,service=default ); 20 | 21 | # 使用关键字REDIS_DEL删除某个key的值; 22 | REDIS_DEL( key,db=0,service=default ); 23 | 24 | # 使用关键字REDIS_FLUSHALL清空所有缓存; 25 | REDIS_FLUSHALL( db=0,service=default ); 26 | 27 | ``` 28 | 29 | ## python模式下的redis操作 30 | 31 | > 调用的是内置函数,都是小写 32 | 33 | 34 | 35 | ```python 36 | # python 37 | 38 | # 使用内置函数redis_set设置redis,第一个参数是key,第二个参数是value。后面3个可选参数。 39 | redis_set("rediskey","value", timeout = None,db = 0, service="default") 40 | 41 | # 使用内置函数redis_get得到某个key的值并返回 42 | getvalue = redis_get("rediskey", db = 0, service="default") 43 | 44 | # 使用内置函数redis_del删除某个key的值 45 | redis_del("rediskey", db = 0, service="default") 46 | 47 | # 使用内置函数redis_flushall清空所有缓存 48 | redis_flushall(db = 0, service="default") 49 | 50 | ``` -------------------------------------------------------------------------------- /A0010_context/A02_functions.md: -------------------------------------------------------------------------------- 1 | # 常用函数 2 | 3 | context中的常用函数介绍。 4 | 5 | ## context.setResult(result,errorMsg) 6 | >设置测试结果。其中result可以是PASS/FAIL/ERROR/EXCEPTION,errorMsg是个字符串。 7 | 8 | 应用场景:在python模式下或者自定义关键字中,设置测试结果。
9 | 例如python模式下,设置测试结果FAIL。 10 | ```python 11 | # python 12 | context.setResult("FAIL","测试结果失败!") 13 | ``` 14 | 15 | ## context.setVar(varkey,value) 16 | >设置变量,如果没有则新增,如果存在则修改变量值。 17 | 18 | 应用场景:在python模式下或者自定义关键字中,设置变量值到变量池。
19 | 例如python模式下,设置一个变量a的值等于10。 20 | ```python 21 | # python 22 | context.setVar("a",10) # 功能相当于 a = 10 ,但是直接声明时,如果没有被引用,不会展示到报告中。 23 | ``` 24 | 25 | ## context.getRequestAddr(uriKey) 26 | >获取当前接口/步骤执行环境下的服务uriKey对应的请求地址。 27 | 28 | 应用场景:在python模式下或者自定义关键字中,获取某个服务uri的请求地址。
29 | 一般与context.host应该是一致的。 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | ```python 44 | 45 | 46 | def getRequestAddr(self,uriKey): 47 | """ 48 | 获取服务的请求地址。(环境key通过成员变量中的httpConfKey获取) 49 | Args: 50 | uriKey: 服务key 51 | Returns: 52 | 无。 53 | """ 54 | pass 55 | ``` -------------------------------------------------------------------------------- /A0010_context/A03_usedemo.md: -------------------------------------------------------------------------------- 1 | # 经典使用场景 -------------------------------------------------------------------------------- /_book/.gitignore: -------------------------------------------------------------------------------- 1 | #通用 2 | .idea/* -------------------------------------------------------------------------------- /_book/A0000_quickstart/A01_configuser.md: -------------------------------------------------------------------------------- 1 | # 管理员登录 2 | 3 | 进入地址 http://127.0.0.1/myadmin 4 | 系统初始化会加入默认最高权限管理员,默认用户名admin 密码123456 5 | 登录后进入后台首页 6 | 7 | ![图片](/image/接口测试平台后台首页.png) 8 | 9 | 进入 [用户小组管理] -> [用户管理] 中添加用户: 10 | 11 | ![图片](/image/接口测试平台后台使用用户管理页面.png) 12 | 13 | 点击添加用户,录入用户信息: 14 | 15 | ![图片](/image/接口测试平台后台使用用户添加页面.png) 16 | 17 | 保存后即可登录测试平台前台 http://127.0.0.1/ 18 | 19 | -------------------------------------------------------------------------------- /_book/A0000_quickstart/A02_configbusinessline.md: -------------------------------------------------------------------------------- 1 | # 管理员配置业务线/模块/数据环境 2 | 3 | ## 业务线 4 | 5 | 对系统用户增删改查操作的管理页面 6 | 7 | ### 用户查看列表页[授权]按钮: 8 | 9 | ![图片](/image/接口测试平台后台用户授权按钮.png) 10 | 11 | 当用户权限为非默认权限时,此字段生效,可配置当前用户所具有的权限。 12 | 13 | ### 用户添加字段说明: 14 | 15 | ![图片](/image/接口测试平台后台用户添加页面.png) 16 | 17 | 账号: 登录时使用的唯一账号 (必填) 18 | 19 | 密码: 登录时使用的密码 (必填) 20 | 21 | 确认密码:与密码一致 (必填) 22 | 23 | 用户名: 昵称,显示用 (必填) 24 | 25 | 邮箱: 接口测试报告邮件的邮箱 (必填) 26 | 27 | token: 作为此用户的标识,用户可自己多次生成 (可选) 28 | 29 | 用户类型:作为此用户的标识,预留字段 (可选) 30 | 31 | 审核状态:作为此用户状态标识,状态为通过才可访问系统 (可选) 32 | 33 | 是否有效:作为此用户状态标识,状态为有效才可访问系统 (可选) 34 | 35 | 默认权限:作为此用户基础权限标识,可进入 【权限管理】->【接口权限管理】 中查看默认权限 (可选) 36 | 37 | ## 小组管理 38 | 39 | ![图片](/image/接口测试平台后台小组管理页面.png) 40 | 41 | ### 组员管理: 42 | 43 | 可以编辑小组内的成员,小组内成员之间拥有对互相数据的所有权限 44 | 45 | ### 角色管理: 46 | 47 | 设置组长,小组刚创建时没有组长,初次设置组长后组长可设置组内任意一人为组长,组长之间也可以取消对方的组长角色,设置为组长后, 48 | 组长用户可直接登录后台( http://127.0.0.1/myadmin ),拥有用户管理权限和自己为小组组长的所有小组权限 49 | 50 | ### 授权: 51 | 52 | 管理员或组长可对小组进行授权,此处授权为组内成员相互之间数据的权限,并不影响用户本身的权限 53 | 54 | ### 数据转移: 55 | 56 | 小组内的成员可进行数据转移,将组员A创建的数据转移到组员B名下 57 | 58 | 59 | 60 | 61 | 62 | -------------------------------------------------------------------------------- /_book/A0000_quickstart/A03_interface.md: -------------------------------------------------------------------------------- 1 | # 用例编写 2 | 3 | 用例分为HTTP和DUBBO两种,每种用例又分为单接口和业务流用例。
4 | 在使用入门部分,只讲解HTTP单接口和业务流的入门使用。
5 | 6 | ## 编写单接口用例 7 | 8 | ![图片](/image/接口测试平台前台使用单接口创建.png) 9 | 10 | 接口名称: 本条单接口数据名称标识 11 | 12 | 接口描述: 本条单接口数据详细描述 13 | 14 | 业务线: 一级分组 15 | 16 | 模块: 二级分组 17 | 18 | 来源: 表示被测接口所属平台 19 | 20 | 优先级: 此条用例的优先级 21 | 22 | 准备: 在准备中定义一些初始变量,例如执行登录、执行其他接口用例,调用全局变量组合文本等。 23 | 24 | 执行信息: 按照HTTP协议填入请求方法、请求url、请求参数、请求头、请求体等信息。 25 | 26 | 断言恢复: 普通模式主要是用ASSERT()关键字进行断言,或者ASSERT_STRUCT()关键字来断言结构。 27 | 28 | 调试: 快捷的在编写用例时调试接口用例。点击接口调试区域的环境按钮,可直接在选择的环境中调试用例。(需要在调试环境下配置被测服务的请求地址) 29 | 30 | ## 编写业务流测试用例 31 | 32 | 业务流为多个业务场景用例,一般是多个接口串联起来的场景。业务流分为业务流信息和步骤信息, 33 | 其中步骤信息与单接口用例相似,包含各类执行信息。
34 |
35 | 业务流用例可直接引用已编写好的单接口: 36 | 37 | ![图片](/image/接口测试平台后台业务流选择单接口页面.png) 38 | 39 | ![图片](/image/接口测试平台前台使用业务流同步与新增步骤.png) 40 | 41 | 同步:勾选同步时,本步骤在业务流中修改不生效,与单接口数据一致,以单接口为准,单接口被修改时,本步骤会同步修改 42 | 43 | 新增步骤:点击置灰步骤的文本框 44 | 45 | 新增步骤后点击步骤右侧的绿色编辑按钮,输入新的步骤数据,这里我们去掉勾选,在步骤1中拿到返回值解析后将某个值传递到下个接口的参数中进行请求示例。 46 | 47 | ![图片](/image/接口测试平台前台业务流变量传递示例.png) 48 | 49 | 在调试中可以看到这个请求的参数,testVal变量已经被解析为 "baidu" 50 | 51 | ![图片](/image/接口测试平台前台使用业务流变量传递调试结果.png) 52 | 53 | 点击保存,存储数据
54 | 55 | 业务流中,后续步骤可以引用前面步骤的变量,以及前面步骤的登录信息等。
56 | -------------------------------------------------------------------------------- /_book/A0000_quickstart/A03_userconfig.md: -------------------------------------------------------------------------------- 1 | # 权限管理 2 | 3 | ## 接口权限管理 4 | 5 | 用户端各个页面的数据权限 6 | 7 | ### 关键字段说明: 8 | 9 | 接口url:平台设置的请求url 10 | 11 | 权限Key:字段属性唯一 12 | 13 | 权限:目前设置为 add / edit / copy / delete / record / run / distinct 14 | 15 | 是否默认:与用户的[是否具有默认权限] 字段对应,此处设置为默认权限的接口是用户拥有的默认权限 16 | 17 | 18 | -------------------------------------------------------------------------------- /_book/A0000_quickstart/A04_admin.md: -------------------------------------------------------------------------------- 1 | # 管理员管理 2 | 3 | 管理员是可以登录后台的用户,系统初始化时会添加一个超级管理阿云 4 | 将用户设置为组长后静默添加此用户为组长,权限为用户管理与自己为组长的小组权限, 5 | 其余管理员需自己添加,也可以添加超级管理员 6 | 7 | ## 管理员添加说明 8 | 9 | 管理员与用户不同的数据,修改管理员的密码不会修改与管理员登录名一致的前台用户的密码。 10 | 11 | 超级管理员具有所有权限,包括前台数据的所有权限。 12 | 13 | 超级管理员不可以被授权,即使授权也无效。 14 | 15 | 普通管理员只能被授权后台的权限。 16 | -------------------------------------------------------------------------------- /_book/A0000_quickstart/A04_task.md: -------------------------------------------------------------------------------- 1 | # 任务 2 | 3 | 任务为多个单接口和业务流的合集,任务执行为串行,执行完毕后自动生成测试报告,任务中可直接引入单接口和业务流用例 4 | 5 | ## 添加任务 6 | 7 | ![图片](/image/测试平台前台使用添加任务.png) 8 | 9 | 输入任务名称、描述后,引入单接口用例和业务流用例,保存任务。 10 | 11 | ## 任务执行 12 | 13 | ![图片](/image/接口测试平台前台任务列表指示执行.png) 14 | 15 | 选择```执行环境```后,点击 ```立即执行``` 后自动跳转到执行进度页面执行完毕后生成执行结果 16 | 17 | ![图片](/image/接口测试平台前台选择环境执行任务.png) 18 | 19 | ## 查看任务执行报告 20 | 21 | ![图片](/image/接口测试平台前台使用任务执行结果.png) 22 | 23 | 点击 ```统计/详情``` 按钮查看执行详情 24 | 25 | ![图片](/image/接口测试平台前台使用任务执行报告统计.png) 26 | 27 | 点击 ```接口/用例``` 按钮 切换查看单接口用例和业务流用例执行结果 28 | 29 | ![图片](/image/接口测试平台前台使用任务报告详情.png) 30 | 31 | 32 | # 任务集 33 | 34 | 任务集为多个任务的合集,任务集为并行,每个任务都有自己的进程,各个任务的执行顺序依然为串行 35 | 36 | ## 添加任务集 37 | 38 | ![图片](/image/接口测试平台前台使用添加任务集.png) 39 | 40 | ## 任务集执行 41 | 42 | ![图片](/image/接口测试平台前台使用任务集列表执行.png) 43 | 44 | 选择 ```执行环境``` 后 可执行任务集 45 | 46 | ![图片](/image/接口测试平台前台使用任务集执行.png) 47 | 48 | ## 任务集执行报告 49 | 50 | ![图片](/image/接口测试平台前台使用任务集结果列表查看报告.png) 51 | 52 | 任务集的报告中链接到各个任务的报告 53 | 54 | ![图片](/image/接口测试平台前台任务集测试报告.png) -------------------------------------------------------------------------------- /_book/A0000_quickstart/A05_cicd.md: -------------------------------------------------------------------------------- 1 | # 结合jenkins的持续集成 2 | 3 | 首先进入 ```配置管理``` ```持续集成```中按提示更新token 4 | 5 | ![图片](/image/接口测试平台前台使用token更新.png) 6 | 7 | ## 使用sosotest jenkins 插件的持续集成 8 | 9 | 安装jenkins插件 10 | 11 | 新增插件构建步骤 12 | 13 | ![图片](/image/接口测试平台使用jenkins插件.png) 14 | 15 | ## 使用shell 脚本的持续集成 16 | 17 | 新增 执行 shell 构建步骤 18 | 19 | ![图片](/image/接口测试平台前台使用持续集成示例.png) 20 | 21 | 22 | 23 | 24 | 25 | 26 | -------------------------------------------------------------------------------- /_book/A0000_quickstart/A05_config.md: -------------------------------------------------------------------------------- 1 | # 平台配置管理 2 | 3 | ## 业务线管理 4 | 5 | 业务线是用例属性的一级分类,需与模块关联,本系统中用例可拥有共两级分类,以区分用例所属的团队、功能、范围等信息 6 | 7 | ## 模块管理 8 | 9 | 模块是用例属性的二级分类,需与业务线关联,本系统中用例可拥有共两级分类,以区分用例所属的团队、功能、范围等信息 10 | 11 | ## 业务线模块关联关联 12 | 13 | 多对多关系管理业务线与模块 14 | 15 | ## 来源管理 16 | 17 | 标记HTTP接口来源 18 | 19 | ## 数据服务器管理 20 | 21 | 发送请求的数据服务器配置,一个数据服务器可关联多个环境,可配置服务器的 DB、Redis ,且可配置多个 主键值分别为 [DB] / [REDIS] 22 | 23 | 数据服务器 Key值 与 名称 添加后不可修改 24 | 25 | 例: 26 | 27 | [DB] 28 | host = 0.0.0.0 29 | port = 3306 30 | 31 | [DB-test] 32 | host = 192.168.0.1 33 | port = 3305 34 | 35 | ## 环境配置管理 36 | 37 | 请求的环境,多个环境可指向同一个数据服务器,与数据服务器是多对一的关系 38 | 39 | 环境配置 key值 与 名称 添加后不可修改 40 | 41 | 执行时是否显示: 在执行时是否显示此环境 42 | 43 | ## uri管理 44 | 45 | 系统中使用uri来管理服务器的域名,此处只是添加一个空的uri,在前台中配置各环境的uri 46 | 47 | 优先级:数字越小,默认显示的uri排序越靠前 48 | 49 | uri管理 key值 与 名称 添加后不可修改 50 | 51 | ## 服务管理 52 | 53 | 分布式中对slave的管理,服务在启动时根据根目录config.ini 注册到master,注册后自动在此页面新增slave信息, 54 | 默认执行任务进程最大数和调试进程最大数为0,在此页面配置进程数。 55 | 56 | ## 执行Python代码管理 57 | 58 | 关于执行Python代码的时间以及默认引入库的配置,建议使用初始值,超过限定时间会强制停止线程执行,返回超时提示。 59 | 60 | 在使用三方库时需先在服务器上安装库 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | -------------------------------------------------------------------------------- /_book/A0000_quickstart/A06_operate.md: -------------------------------------------------------------------------------- 1 | # 操作记录管理 -------------------------------------------------------------------------------- /_book/A0000_quickstart/README.md: -------------------------------------------------------------------------------- 1 | # 从零开始你的测试 2 | 3 | 本章主要讲述sosotest安装部署完之后, 4 | 如何从零开始配置数据、环境、服务、编写用例、创建任务(集), 5 | 一直到为持续集成提供服务。
6 |
7 | >本章所有示例均以部署到本机为准,请求地址是 http://127.0.0.1 8 | 9 |
10 | 下面是sosotest的设计模型,通过此模型可以更好的理解平台的配置。
11 | 12 | ![图片](/image/测试模型.png) 13 | 14 | 首先是最基础的数据服务。
15 | >一般包括数据库,redis,mango等。目前支持mysql数据库配置和redis配置。 16 | 17 | 数据服务之上就是环境。 18 | >一个公司的测试环境应该包含多套,每套环境下应该有多个服务的闭环或者被测服务与mock服务的闭环。
19 | >多个环境可以用同一套数据服务。比如环境A和环境B都是使用的数据服务M。环境C使用数据服务N。 20 | 21 | 环境之中部署的就是服务。
22 | >服务表示被测系统,比如有个服务向外提供http服务,我们就需要添加这个服务到sosotest上。
23 | >命名规则建议使用git的git地址的名称进行申请,服务多的情况下能够很好的区分。
24 | >同一个服务只需要申请一次,在多个环境下执行也只需要申请一次即可。 25 | 26 | 在对应环境下部署的对应服务应该向外提供服务访问地址,也就是请求地址配置。
27 | >同一个环境下可以部署多套服务。
28 | >同理,同一个服务可以部署与多套测试环境。
29 | >某个环境下的某个服务对外提供一个请求地址,环境-服务是联合唯一的。
30 | >比如环境A下服务1的请求地址是 http://envA.git1.com,那么环境A下的服务1就不能再有其他的请求地址配置。
31 | >假设环境B下服务1的请求地址是 http://envB.git1.com,那么服务1的测试用例就可以在环境A和B下同时测试。 32 | 33 | 数据服务->环境->服务->请求地址,这是sosotest的设计模型中的配置层面的重要的四部分。 34 | 35 | -------------------------------------------------------------------------------- /_book/A0001_admin/A01_login.md: -------------------------------------------------------------------------------- 1 | # 管理员登录 2 | 3 | 进入地址 http://127.0.0.1/myadmin 4 | 系统初始化会加入默认最高权限管理员,默认用户名admin 密码123456 5 | 登录后进入 6 | 7 | ***如要执行测试,要先启动master和最少一个slave,然后进入平台配置管理->执行服务管理中,配置最大可执行的调试进程和任务执行进程,缺省值为1*** -------------------------------------------------------------------------------- /_book/A0001_admin/A02_user_group_manage.md: -------------------------------------------------------------------------------- 1 | # 用户小组管理 2 | 3 | 用户管理为对用户数据的增删改查,小组管理为对用户数据的共享,同小组的数据可相互操作 4 | 5 | ## 用户管理 6 | 7 | 对系统用户增删改查操作的管理页面 8 | 9 | ### 用户查看列表页[授权]按钮: 10 | 11 | 当用户权限为非默认权限时,此字段生效,可配置当前用户所具有的权限。 12 | 13 | ### 用户添加字段说明: 14 | 15 | 账号: 登录时使用的唯一账号 (必填) 16 | 17 | 密码: 登录时使用的密码 (必填) 18 | 19 | 确认密码:与密码一致 (必填) 20 | 21 | 用户名: 昵称,显示用 (必填) 22 | 23 | 邮箱: 接口测试报告邮件的邮箱 (必填) 24 | 25 | token: 作为此用户的标识,用户可自己多次生成 (可选) 26 | 27 | 用户类型:作为此用户的标识,预留字段 (可选) 28 | 29 | 审核状态:作为此用户状态标识,状态为通过才可访问系统 (可选) 30 | 31 | 是否有效:作为此用户状态标识,状态为有效才可访问系统 (可选) 32 | 33 | 默认权限:作为此用户基础权限标识,可进入 【权限管理】->【接口权限管理】 中查看默认权限 (可选) 34 | 35 | ## 小组管理 36 | 37 | ### 组员管理: 38 | 39 | 可以编辑小组内的成员,小组内成员之间拥有对互相数据的所有权限 40 | 41 | ### 角色管理: 42 | 43 | 设置组长,小组刚创建时没有组长,初次设置组长后组长可设置组内任意一人为组长,组长之间也可以取消对方的组长角色,设置为组长后, 44 | 组长用户可直接登录后台( http://127.0.0.1/myadmin ),拥有用户管理权限和自己为小组组长的所有小组权限 45 | 46 | ### 授权: 47 | 48 | 管理员或组长可对小组进行授权,此处授权为组内成员相互之间数据的权限,并不影响用户本身的权限 49 | 50 | ### 数据转移: 51 | 52 | 小组内的成员可进行数据转移,将组员A创建的数据转移到组员B名下 53 | 54 | 55 | 56 | 57 | 58 | -------------------------------------------------------------------------------- /_book/A0001_admin/A03_permission.md: -------------------------------------------------------------------------------- 1 | # 权限管理 2 | 3 | 对前台及后台的权限控制 4 | 5 | ## 接口权限管理 6 | 7 | 用户端各个页面的数据权限 8 | 9 | ### 关键字段说明: 10 | 11 | 接口url:平台设置的请求url 12 | 13 | 权限Key:字段属性唯一 14 | 15 | 权限:目前设置为 add / edit / copy / delete / record / run / distinct 16 | 17 | 是否默认:与用户的[是否具有默认权限] 字段对应,此处设置为默认权限的接口是用户拥有的默认权限 18 | 19 | 20 | -------------------------------------------------------------------------------- /_book/A0001_admin/A04_admin.md: -------------------------------------------------------------------------------- 1 | # 管理员管理 2 | 3 | 管理员是可以登录后台的用户,系统初始化时会添加一个超级管理员 4 | 将用户设置为组长后静默添加此用户为组长,权限为用户管理与自己为组长的小组权限, 5 | 其余管理员需自己添加,也可以添加超级管理员 6 | 7 | ## 管理员添加说明 8 | 9 | 管理员与用户不同的数据,修改管理员的密码不会修改与管理员登录名一致的前台用户的密码。 10 | 11 | 超级管理员具有所有权限,包括前台数据的所有权限。 12 | 13 | 超级管理员不可以被授权,即使授权也无效。 14 | 15 | 普通管理员只能被授权后台的权限。 16 | -------------------------------------------------------------------------------- /_book/A0001_admin/A06_operate.md: -------------------------------------------------------------------------------- 1 | # 操作记录管理 -------------------------------------------------------------------------------- /_book/A0001_admin/README.md: -------------------------------------------------------------------------------- 1 | # 后台管理部分 2 | 3 | 管理员或者组长登录后,可以通过后台管理进行用户小组管理,业务线模块配置,来源配置,数据服务(mysqldb-redis-mongo)的配置。
4 | 系统管理员还可以进行slave并行任务数量控制等。 -------------------------------------------------------------------------------- /_book/A0002_user/A01_config.md: -------------------------------------------------------------------------------- 1 | # 配置管理 2 | ## 1、环境配置 3 | 4 | 进入环境配置页面,先查看是否有满足条件的环境,系统内置了test1-test5,以及与发布,线上等。 5 | 6 | 如果没有,点击「添加」,出现下方输入框,配置名称和环境key可以写同一个,,配置描述是对这个环境的描述,数据服务,选择此套环境对应的数据库,填写完毕后,点击「添加」即可。 7 | 8 | ![图片](/image/接口测试平台配置管理之环境配置.png) 9 | 10 | ## 2、服务配置 11 | 一个服务只需添加一次,选择不同的协议类一类型即可 12 | 13 | 进入配置管理-->服务配置,点击「添加」,进入到页面底部,选择要申请添加的服务的支持的协议,支持多选,然后写入git地址的最后一个/和.git之间的内容,举例:git@git.lianjia.com:alliance/evaluate-biz-support.git。 服务名称填写evaluate-biz-support即可。 14 | 15 | ![图片](/image/接口测试平台配置管理之服务配置.png) 16 | 17 | ## 3、请求地址配置 18 | 环境、服务配置完成后,要针对不同的环境,配置自己服务的请求地址 19 | 20 | 进入配置管理-->请求地址配置,点击「添加」,选择你要进行测试的环境、服务,在下方写下请求地址,例如http:test-evaluate.biz.ke.com(http协议需要加协议名称)、10.26.33.94: 11877(dubbo只要ip:port即可) 21 | 22 | ![图片](/image/接口测试平台配置管理之请求地址配置.png) 23 | 24 | -------------------------------------------------------------------------------- /_book/A0002_user/A02_http.md: -------------------------------------------------------------------------------- 1 | # HTTP接口测试 2 | ## 添加接口 3 | 4 | ![图片](/image/接口测试平台http之添加接口.png) 5 | 6 | 点击左上方「添加接口用例」,输入接口名称、接口描述,选择业务线及模块(如果没有可联系业务线管理员配置或者王吉亮) 7 | 8 | 准备部分可以根据需要填写,如需要校验某个字段,在右侧选择DB_SELECT,输入你需要的数据库,及sql,当然你也可以不写。来源及优先级根据需要填写。规范请参照:http://wiki.lianjia.com/pages/viewpage.action?pageId=322752452 9 | 10 | 11 | ![图片](/image/接口测试平台http之添加接口2.png) 12 | 13 | 选择自己测试的接口请求方式,输入接口的URL,超时时间,性能时间,选填。默认是20和1。 14 | 15 | 参数按需填写,断言可断言值,可断言结构。详情参照下方:断言处理。 16 | 17 | ## 添加业务流 18 | 19 | ![图片](/image/接口测试平台http之业务流.png) 20 | 21 | 点击「添加业务流」-->「选择单接口」,下方出现你添加的所有接口,选取需要测试的接口,点击保存,如下图: 22 | 23 | 24 | ![图片](/image/接口测试平台http之任务流执行顺序.png) 25 | 26 | 上下拖动「步骤一」、「步骤二」可以实现顺序执行case 27 | 28 | 点击「保存」,创建任务流完成 29 | 30 | ## 添加任务 31 | 点击「添加任务」,进入下方页面,输入任务名称、任务描述、优先级、持续集成,默认邮件列表 32 | 优先变量按需填写,接下来点击「选择但接口」或者「选择业务流」,「选择但接口」同上,「选择业务流」是选择你创建过的业务流,可以选择N个,同样支持调整执行顺序,鼠标拖动「序号」,点击「保存」即可。 33 | 34 | ![图片](/image/接口测试平台http之添加任务.png) 35 | 36 | ## 添加任务集 37 | 操作同任务大同小异,点击「添加任务集」,输入「任务集名称」、「任务集描述」、「默认邮件列表」后,点击「选择任务」,选择你创建的任务(同样支持按顺序执行)。 38 | ![图片](/image/接口测试平台http之添加任务集.png) 39 | 40 | ## 执行结果 41 | 42 | ![图片](/image/接口测试平台http之执行结果.png) 43 | 44 | 默认按照执行人搜索、也可按照上图中箭头所指一行信息进行搜索 45 | 46 | 同时还可以在每个执行后面查看任务信息、执行及查看报告 47 | 48 | 49 | ## 历史统计 50 | 51 | 此页面记录已添加到任务的接口执行情况,可按照URI、接口URL、任务编号、任务执行编号、环境配置名称进行搜索 52 | 53 | 54 | 55 | 56 | 57 | -------------------------------------------------------------------------------- /_book/A0002_user/A03_dubbo.md: -------------------------------------------------------------------------------- 1 | # DUBBO接口测试 2 | 3 | 4 | ## DUBBO接口添加 5 | 首先进入```数据服务``` ```DUBBO接口```页面 添加 6 | ![图片](/image/接口测试平台DUBBO接口添加.png) 7 | ![图片](/image/接口测试平台DUBBO接口添加case.png) 8 | 输入接口名称(必填),接口描述(必填),业务线,准备信息,执行信息(必填),断言,[保存]即可. 9 | 10 | ## DUBBO接口查询 11 | 12 | ![图片](/image/接口测试平台DUBBO接口查询.png) 13 | 可根据接口创建人、接口编号、接口名称、接口描述、系统system、服务serviceClass、接口method、业务线、模块条件匹配查询 14 | 15 | ## DUBBO接口使用 16 | 17 | ![图片](/image/接口测试平台DUBBO接口使用.png) 18 | 19 | 根据case所需测试环境,选择页面底部已配置的环境点击执行 20 | 21 | ## DUBBO接口操作 22 | 23 | ![图片](/image/接口测试平台DUBBO接口操作.png) 24 | 25 | 点击 ```查看``` 按钮查看接口详情,点击 ```复制``` 按钮可以复制接口编辑调试后[保存]成新的接口, 26 | 点击 ```删除``` 按钮删除接口,点击```编辑``` 按钮可修改接口并进行调试 27 | 28 | ## DUBBO接口导入日志 29 | 30 | ![图片](/image/接口测试平台DUBBO接口导入日志.png) 31 | 32 | 文件上传成功解析后,页面底部有[开始导入]按钮,对于平台解析出的用例,可进行导入,或是删除不需要的用例后再导入 33 | 平台有对历史的用例进行去重:去重是根据接口,方法,及请求参数的key一致性 34 | 导入后,可查看及编辑用例 35 | 36 | -------------------------------------------------------------------------------- /_book/A0002_user/A04_globalvar.md: -------------------------------------------------------------------------------- 1 | # 全局变量 2 | 3 | 全局变量可以在平台中所有case处引用,常在[准备/执行信息/断言恢复]中使用 4 | 5 | ## 全局变量添加 6 | 首先进入```数据服务``` ```全局变量```页面 添加 7 | ![图片](/image/接口测试平台数据服务.png) 8 | ![图片](/image/接口测试平台全局变量添加.png) 9 | 输入变量key,变量值及变量描述,保存编辑即可. 10 | 变量值如果是各环境通用全局变量,则输入通用全局变量字段即可,否则可根据各套环境输入对应环境的变量值. 11 | 12 | ## 全局变量查询 13 | 14 | ![图片](/image/接口测试平台全局变量查询.png) 15 | 可根据[创建人]/[变量key]/[变量value]/[变量描述]条件匹配查询 16 | 17 | ## 全局变量使用 18 | 19 | ![图片](/image/接口测试平台全局变量使用.png) 20 | 21 | 调用方式$GVAR[gvarKey] ,可直接在[准备/执行信息/断言恢复]等处使用 22 | 23 | ## 全局变量操作 24 | 25 | ![图片](/image/接口测试平台全局变量操作.png) 26 | 27 | 点击 ```查看``` 按钮查看变量详情,点击 ```删除``` 按钮删除变量,点击```编辑``` 按钮可修改变量 28 | 29 | ![图片](/image/接口测试平台全局变量编辑.png) 30 | 31 | 32 | -------------------------------------------------------------------------------- /_book/A0002_user/A05_text.md: -------------------------------------------------------------------------------- 1 | # 组合文本 2 | 3 | 组合文本可以在平台中所有case处引用,常在[准备/执行信息/断言恢复]中使用 4 | 5 | ## 组合文本添加 6 | 首先进入```数据服务``` ```组合文本```页面 添加 7 | ![图片](/image/接口测试平台数据服务组合文本.png) 8 | ![图片](/image/接口测试平台组合文本添加.png) 9 | 输入配置key,配置Value及变量描述,[添加]即可. 10 | 组合文本中变量值如果是各环境通用变量,则输入通用变量字段即可,否则可根据各套环境输入对应环境的变量值. 11 | ![图片](/image/接口测试平台组合文本环境变量.png) 12 | 13 | ## 组合文本查询 14 | 15 | ![图片](/image/接口测试平台组合文本查询.png) 16 | 可根据[创建人]/[文本key]/[变量value]/[变量描述]条件匹配查询 17 | 18 | ## 组合文本使用 19 | 20 | ![图片](/image/接口测试平台组合文本使用.png) 21 | ![图片](/image/接口测试平台组合文本使用结果.png) 22 | 23 | 调用方式1:$TEXT[textKey] 24 | 调用方式2:$IMPORT[textKey] 25 | 调用方式3:$RUNFUNC[textKey] 26 | 27 | ## 全组合文本操作 28 | 29 | ![图片](/image/接口测试平台组合文本操作.png) 30 | 31 | 点击 ```查看``` 按钮查看组合文本详情,点击 ```删除``` 按钮删除组合文本,点击```编辑``` 按钮可修改组合文本 32 | 33 | ![图片](/image/接口测试平台组合文本编辑.png) 34 | 35 | 36 | -------------------------------------------------------------------------------- /_book/A0002_user/README.md: -------------------------------------------------------------------------------- 1 | # 用户使用 2 | 3 | 本章主要讲述用户如何配置服务、环境和请求地址,配置完成后如何进行接口测试。
4 | 介绍平台数据的维护,如何进行数据业务分离。
5 | -------------------------------------------------------------------------------- /_book/A0003_mock/A01_mock_introduce.md: -------------------------------------------------------------------------------- 1 | # mock介绍 2 | 3 | -------------------------------------------------------------------------------- /_book/A0003_mock/A03_requestmock.md: -------------------------------------------------------------------------------- 1 | # 请求mock 2 | 3 | 下图是示例列表: 4 | ![图片](/image/MOCK请求方式列表展示.png) 5 | 说明:
6 | 待配置的请求URI的配置分为4部分,分别为入口mock,服务key,TagKey,环境Key(环境key可定制录制详情,下一节讲到)。
7 | 举例:http://127.0.0.1/mock/http-testservice/common/test1
8 | 例如/getuser有3个MOCK信息,但是mock地址都是:http://127.0.0.1/mock/http-testservice/common/test1/getuser
9 | 只需要将实际请求的URI配置为http://127.0.0.1/mock/http-testservice/common/test1即可,那么请求到源服务的/getuser,将请求到mock服务。
10 |
11 | # 小技巧:
12 | 如果发现mock返回的信息与预期要返回的信息不一致时,查看响应的header中是否有mockinfo的信息, 13 | 如果有看看mock id是否正确,如果没有就是没有从mock平台返回,是录制返回的。 14 | -------------------------------------------------------------------------------- /_book/A0003_mock/A04_recodermock.md: -------------------------------------------------------------------------------- 1 | # mock录制 2 | 3 | mock录制是sosotest的一个特色功能,你可以通过在环境中配置服务的请求地址,然后配置录制参数后,就可以通过mock服务来录制被mock服务的接口信息。
4 | 例如服务http-testservice有接口/getuser,在环境key为test1的请求地址为http://testservice.com。
5 | 此时用url
6 | http://127.0.0.1/mock/http-testservice/common/test1/getuser?id=1
7 | 来访问mock服务,如果mock平台没有此mock信息,mock服务将会发送请求 http://testservice.com/getuser?id=1 到test1的请求地址, 8 | 然后获取到响应后,将接口信息录制到平台,并返回实际结果是mock调用方。
9 |
10 | 默认录制时,只录制请求的url信息,请求的param、body、header等默认不变录制。如果要定制录制方式,可以使用如下方式:
11 | 在环境key后面加入---rec,然后在---rec后加入要录制的参数,例如-no -all -header -param -body
12 | 举例如下:
13 | >不录制任何信息,只是实时的获取实际服务的响应结果并返回
14 | >http://127.0.0.1/mock/http-testservice/common/test1---rec-no/getuser?id=1
15 | 16 | >录制所有信息(url/param/header/body)到mock数据
17 | >http://127.0.0.1/mock/http-testservice/common/test1---rec-all/getuser?id=1 18 | 19 | >录制url和请求行的参数信息到mock数据
20 | >http://127.0.0.1/mock/http-testservice/common/test1---rec-param/getuser?id=1 21 | 22 | >录制url和请求体的body信息到mock数据
23 | >http://127.0.0.1/mock/http-testservice/common/test1---rec-body/getuser?id=1 24 | 25 | >录制url、请求行的参数信息和请求体的body信息到mock数据
26 | >http://127.0.0.1/mock/http-testservice/common/test1---rec-param-body/getuser?id=1 -------------------------------------------------------------------------------- /_book/A0003_mock/README.md: -------------------------------------------------------------------------------- 1 | # MOCK服务 2 | 3 | sosotest提供了HTTP MOCK服务。
4 | 本章主要介绍如何使用MOCK服务进行HTTP接口mock,如何mock restful接口,如何动态返回mock结果。
5 | 如何设置代理使用MOCK服务进行接口录制。
6 | 如何使用MOCK绑定接口用例实现契约测试。
7 | 8 | -------------------------------------------------------------------------------- /_book/A0004_keyword/A01_use.md: -------------------------------------------------------------------------------- 1 | # 使用关键字 2 | 3 | 在准备和断言恢复中,可以使用关键字,关键字又分为内置关键字和自定义关键字。
4 |
5 | ## 关键字模式使用规则 6 | 1、无需引入,直接使用。
7 | 2、必须是英文半角分号结尾。
8 | 3、注释是英文半角#开头,英文半角;结尾。例如:
9 | ```python 10 | # 这是一个合法的注释,注意看我后面; 11 | ``` 12 | 4、变量声明key = value;,英文半角分号;结尾。变量值不分类型,都是字符串,不需要加引号!例如:
13 | ```python 14 | # 这是一个变量声明; 15 | name= wangjiliang; 16 | userid = 100001; 17 | ``` 18 | 5、关键字模式下调用关键字,直接使用关键字即可。参数值不分类型,都是字符串,不需要加引号!
19 | 参数分为列表参数和字典参数,列表参数直接写值即可,字典参数要写key和value,多个参数用英文半角逗号,分隔。例如:
20 | ```python 21 | # 执行接口HTTP_INTERFACE_1; 22 | EXECUTE_INTERFACE(HTTP_INTERFACE_1); 23 | # 生成一个1到10的随机数并赋值给变量randint; 24 | randint = RANDOM_INT(1,10); 25 | # redis设置值(设计redis、db的使用在章节数据操作中介绍),其中timeout等属于字典参数; 26 | REDIS_SET( name,wangjiliang,timeout=10,db=0,service=testservice ); 27 | ``` 28 | 29 | 使用示例见下图:
30 | ![图片](/image/KEYWORD示例.png) -------------------------------------------------------------------------------- /_book/A0004_keyword/A02_buildin.md: -------------------------------------------------------------------------------- 1 | # 内置关键字介绍 2 | 3 | 本节主要介绍平台内置的关键字。
4 | 这些关键字都是在准备和断言恢复中进行使用的。
5 | 6 | # mysql数据操作类关键字 7 | 8 | ## mysql数据库查询:DB_SELECT(service,sql) 9 | ### 输入:
10 | 参数1 service:数据服务配置中的DB配置下的key。 11 | 参数2 sql: 要执行的select语句。必须是select语句,且必须有where子句。表名要带数据库名。
12 | 例如后台管理员配置过服务service为test,且test的配置下有database dbA下有数据表tableA,那么sql语句应该是:
13 | ```python 14 | datalist = DB_SELECT( test, select * from dbA.tableA where id = 1 ); 15 | ``` 16 | ### 输出:
17 | 输入是一个列表,列表下是json字符串。举例如下:
18 | ```python 19 | [{"id":1,"name":"张三"},{"id":2,"name":"李四"}] 20 | ``` 21 | -------------------------------------------------------------------------------- /_book/A0004_keyword/README.md: -------------------------------------------------------------------------------- 1 | # 关键字模式介绍 2 | 3 | 在处理执行前的准备和执行后的断言恢复时,有两种模式可以使用。一种是关键字模式,一种是python模式,本章主要介绍关键字模式。
4 | 本章主要介绍如何什么是关键字模式,如何使用内置关键字,如何编写自定义关键字。 5 | 6 | # 部分完成(内置说明未完成) 7 | -------------------------------------------------------------------------------- /_book/A0005_pythonmode/A01_use.md: -------------------------------------------------------------------------------- 1 | # 使用python模式 2 | 3 | ## 如何进入python模式 4 | 在准备、断言恢复输入框中,以 # python开头,即可进入python模式。进入python模式后,框内的代码均以python方式处理,关键字模式的调用需要使用内置call函数完成。 5 | 6 | ## python模式使用规则 7 | 1、纯python语法。
8 | 2、内置python函数无需引入。
9 | 3、自定义python代码需要imports后才可使用。
10 | 11 | ## 示例 12 | python模式下变量声明:
13 | ```python 14 | # python 15 | varint = 1 16 | varstr = "this is a string" 17 | ``` 18 | 19 | python模式下调用关键字:
20 | ```python 21 | # python 22 | varint = call("RANDOM_INT(1,10)") 23 | ``` 24 | -------------------------------------------------------------------------------- /_book/A0005_pythonmode/A02_buildin.md: -------------------------------------------------------------------------------- 1 | # 内置python函数介绍 -------------------------------------------------------------------------------- /_book/A0005_pythonmode/A04_ddt.md: -------------------------------------------------------------------------------- 1 | # 数据驱动 2 | 3 | 使用python模式的内置函数```execute_current()```,能够实现数据驱动。
4 | 5 | ## 示例 6 | 场景:
7 | 测试使用不同的用户进行登录接口测试。 8 | 代码如下: 9 | ```python 10 | # python 11 | IS_CONTINUE = False # 执行完数据驱动脚本后,无需继续执行 12 | userlist = ["zhangsan","lisi","wangwu","zhaoliu"] 13 | totalcount, passcount, failcount = 0,0,0 14 | for user in userlist: 15 | execute_current() # 执行当前接口的执行信息,使用变量user 16 | # 输出执行后的输入和输出信息 17 | log("processedHeader: %s" % context.processedHeader) 18 | log("processedUrl: %s" % context.processedUrl) 19 | log("processedParams: %s" % context.processedParams) 20 | log("processedBodyContent: %s" % context.processedBodyContent) 21 | retContent = const("RESP_TEXT") 22 | log("retContent: %s" % retContent) 23 | # 对返回结果进行判断。 24 | if "sosotest" in retContent: 25 | passcount += 1 26 | log("PASS") 27 | else: 28 | failcount += 1 29 | log("FAIL") 30 | 31 | # 开始设置测试结果,如果有失败则失败,否则全部成功。 32 | if failcount > 0: 33 | set_result("FAIL","测试未通过,失败%d次。" % failcount) 34 | else: 35 | set_result("PASS","测试通过.") 36 | ``` 37 | 图片示例: 38 | ![图片](/image/PYTHON数据驱动.png) -------------------------------------------------------------------------------- /_book/A0005_pythonmode/README.md: -------------------------------------------------------------------------------- 1 | # python模式介绍 2 | 3 | 在处理执行前的准备和执行后的断言恢复时,有两种模式可以使用。一种是关键字模式,一种是python模式,本章主要介绍python模式。
4 | 本章主要介绍如何什么是python模式,如何使用内置python函数,如何编写自定义python代码。 5 | 6 | # 部分完成(内置说明未完成) 7 | -------------------------------------------------------------------------------- /_book/A0006_ci/A01_invoke.md: -------------------------------------------------------------------------------- 1 | # invoke接口介绍 -------------------------------------------------------------------------------- /_book/A0006_ci/A02_cishell.md: -------------------------------------------------------------------------------- 1 | # CI shell 脚本说明 -------------------------------------------------------------------------------- /_book/A0006_ci/README.md: -------------------------------------------------------------------------------- 1 | # 持续集成 2 | 3 | 如何使用sosotest提供的invoke接口调度平台执行任务,如何通过回调获取执行结果,如何使用jenkins插件完成sosotest任务执行。 4 | 5 | 6 | # 暂未完成 -------------------------------------------------------------------------------- /_book/A0007_assert/A02_recurjson.md: -------------------------------------------------------------------------------- 1 | # 递归JSON断言 2 | 假设接口用例执行的返回结果是:
3 | ```python 4 | { 5 | "code":10000, 6 | "message":"success", 7 | "data":{ 8 | "name":"Criss", 9 | "age":18 10 | } 11 | } 12 | ``` 13 |
14 | 15 | ## 关键字模式下的JSON递归断言 16 | 使用内置关键字`ASSERT()`
17 |
18 | 假设要断言name是Criss。
19 | 只需要将相应的json当作参数传入关键字,如下:
20 | ```python 21 | ASSERT({"data":{"name":"Criss"}}); 22 | ``` 23 |
24 | 假设要断言name是Criss,code是10000。
25 | 只需要将要断言的部分写成结构相同的json语句即可,不断言的部分不写,如下:
26 | ```python 27 | ASSERT( 28 | { 29 | "code":10000, 30 | "data":{"name":"Criss"} 31 | } 32 | ); 33 | ``` 34 | 35 | ## python模式下的JSON递归断言 36 | 使用内置函数`asserts()`
37 |
38 | 假设要断言name是Criss。
39 | 只需要将相应的json当作参数传入关键字,如下:
40 | ```python 41 | asserts('{"data":{"name":"Criss"}}') 42 | ``` 43 |
44 | 假设要断言name是Criss,code是10000。
45 | 只需要将要断言的部分写成结构相同的json语句即可,不断言的部分不写,如下:
46 | ```python 47 | asserts(""" 48 | { 49 | "code":10000, 50 | "data":{"name":"Criss"} 51 | } 52 | """) 53 | ``` -------------------------------------------------------------------------------- /_book/A0007_assert/A04_assertstruct.md: -------------------------------------------------------------------------------- 1 | # 结构断言 2 | 3 | 假设接口用例执行的返回结果是:
4 | ```python 5 | { 6 | "code":10000, 7 | "message":"success", 8 | "data":{ 9 | "name":"Criss", 10 | "age":18 11 | } 12 | } 13 | ``` 14 |
15 | 16 | ## 关键字模式下的结构断言 17 | 使用内置关键字`ASSERT_STRUCT()`
18 |
19 | 要对返回的结果进行结构断言,
20 | 只需要将正确的json结构传入,只要对应的key对应的数据类型正确即可,如下:
21 | ```python 22 | ASSERT_STRUCT( 23 | { 24 | "code":10002, 25 | "message":"rror", 26 | "data":{ 27 | "name":"Cassie", 28 | "age":10 29 | } 30 | } 31 | ); 32 | ``` 33 | 注:即使我们的code,message等的值与返回值不符合,但是类型符合,结构断言依然是通过的。
34 |
35 | 36 | ## python模式下的结构断言 37 | 使用内置函数`assert_struct()`
38 |
39 | 要对返回的结果进行结构断言,
40 | 只需要将正确的json结构传入,只要对应的key对应的数据类型正确即可,如下:
41 | ```python 42 | assert_struct(""" 43 | { 44 | "code":10002, 45 | "message":"rror", 46 | "data":{ 47 | "name":"Cassie", 48 | "age":10 49 | } 50 | } 51 | """) 52 | ``` 53 | 54 | -------------------------------------------------------------------------------- /_book/A0007_assert/README.md: -------------------------------------------------------------------------------- 1 | # 断言处理 2 | 3 | 本章介绍
4 | 如何在关键字模式下使用ASSERT()关键字进行断言;
5 | 如何在python模式下使用asserts()函数进行断言。 -------------------------------------------------------------------------------- /_book/A0008_errors/A03_other.md: -------------------------------------------------------------------------------- 1 | # 莫名其妙的错误 2 | 3 | ## 关键字模式 4 | 发现不了变量:
5 | >看看每个语句后面是否有分号,包括注释也要有分号结尾。
6 | 7 | 关键字未执行:
8 | >关键字后面的括号与关键字之间是否有空格。
9 | >关键字的括号是否是英文半角。 10 | 11 | ## python模式 12 | python代码报错:
13 | >看看代码缩进是不是4个空格,还是tab。
14 | >默认的tab会转为空格,不排除一些未考虑到的情况,比如用户复制粘贴过来的代码。 -------------------------------------------------------------------------------- /_book/A0008_errors/README.md: -------------------------------------------------------------------------------- 1 | # 常见错误原因 -------------------------------------------------------------------------------- /_book/A0010_context/A02_functions.md: -------------------------------------------------------------------------------- 1 | # 常用函数 2 | 3 | context中的常用函数介绍。 4 | 5 | ## context.setResult(result,errorMsg) 6 | >设置测试结果。其中result可以是PASS/FAIL/ERROR/EXCEPTION,errorMsg是个字符串。 7 | 8 | 应用场景:在python模式下或者自定义关键字中,设置测试结果。
9 | 例如python模式下,设置测试结果FAIL。 10 | ```python 11 | # python 12 | context.setResult("FAIL","测试结果失败!") 13 | ``` 14 | 15 | ## context.setVar(varkey,value) 16 | >设置变量,如果没有则新增,如果存在则修改变量值。 17 | 18 | 应用场景:在python模式下或者自定义关键字中,设置变量值到变量池。
19 | 例如python模式下,设置一个变量a的值等于10。 20 | ```python 21 | # python 22 | context.setVar("a",10) # 功能相当于 a = 10 ,但是直接声明时,如果没有被引用,不会展示到报告中。 23 | ``` 24 | 25 | ## context.getRequestAddr(uriKey) 26 | >获取当前接口/步骤执行环境下的服务uriKey对应的请求地址。 27 | 28 | 应用场景:在python模式下或者自定义关键字中,获取某个服务uri的请求地址。
29 | 一般与context.host应该是一致的。 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | ```python 44 | 45 | 46 | def getRequestAddr(self,uriKey): 47 | """ 48 | 获取服务的请求地址。(环境key通过成员变量中的httpConfKey获取) 49 | Args: 50 | uriKey: 服务key 51 | Returns: 52 | 无。 53 | """ 54 | pass 55 | ``` -------------------------------------------------------------------------------- /_book/A0010_context/A03_usedemo.md: -------------------------------------------------------------------------------- 1 | # 经典使用场景 -------------------------------------------------------------------------------- /_book/gitbook/fonts/fontawesome/FontAwesome.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/truelovesdu/sosotest_docs/7cf5c4abc7f0775f9fa1f0fbc70335f35518b3aa/_book/gitbook/fonts/fontawesome/FontAwesome.otf -------------------------------------------------------------------------------- /_book/gitbook/fonts/fontawesome/fontawesome-webfont.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/truelovesdu/sosotest_docs/7cf5c4abc7f0775f9fa1f0fbc70335f35518b3aa/_book/gitbook/fonts/fontawesome/fontawesome-webfont.eot -------------------------------------------------------------------------------- /_book/gitbook/fonts/fontawesome/fontawesome-webfont.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/truelovesdu/sosotest_docs/7cf5c4abc7f0775f9fa1f0fbc70335f35518b3aa/_book/gitbook/fonts/fontawesome/fontawesome-webfont.ttf -------------------------------------------------------------------------------- /_book/gitbook/fonts/fontawesome/fontawesome-webfont.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/truelovesdu/sosotest_docs/7cf5c4abc7f0775f9fa1f0fbc70335f35518b3aa/_book/gitbook/fonts/fontawesome/fontawesome-webfont.woff -------------------------------------------------------------------------------- /_book/gitbook/fonts/fontawesome/fontawesome-webfont.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/truelovesdu/sosotest_docs/7cf5c4abc7f0775f9fa1f0fbc70335f35518b3aa/_book/gitbook/fonts/fontawesome/fontawesome-webfont.woff2 -------------------------------------------------------------------------------- /_book/gitbook/gitbook-plugin-expandable-chapters/expandable-chapters.css: -------------------------------------------------------------------------------- 1 | .book .book-summary .chapter > .articles { 2 | overflow: hidden; 3 | max-height: 0px; 4 | } 5 | 6 | .book .book-summary .chapter.expanded > .articles { 7 | max-height: 9999px; 8 | } 9 | 10 | .book .book-summary .exc-trigger { 11 | position: absolute; 12 | left: 12px; 13 | top: 12px; 14 | } 15 | 16 | .book .book-summary ul.summary li a, 17 | .book .book-summary ul.summary li span { 18 | padding-left: 30px; 19 | cursor: pointer; 20 | } 21 | 22 | .book .book-summary .exc-trigger:before { 23 | content: "\f054"; 24 | } 25 | 26 | .book .book-summary .expanded > a .exc-trigger:before, 27 | .book .book-summary .expanded > span .exc-trigger:before { 28 | content: "\f078"; 29 | } 30 | -------------------------------------------------------------------------------- /_book/gitbook/gitbook-plugin-livereload/plugin.js: -------------------------------------------------------------------------------- 1 | (function() { 2 | var newEl = document.createElement('script'), 3 | firstScriptTag = document.getElementsByTagName('script')[0]; 4 | 5 | if (firstScriptTag) { 6 | newEl.async = 1; 7 | newEl.src = '//' + window.location.hostname + ':35729/livereload.js'; 8 | firstScriptTag.parentNode.insertBefore(newEl, firstScriptTag); 9 | } 10 | 11 | })(); 12 | -------------------------------------------------------------------------------- /_book/gitbook/gitbook-plugin-search/search.css: -------------------------------------------------------------------------------- 1 | /* 2 | This CSS only styled the search results section, not the search input 3 | It defines the basic interraction to hide content when displaying results, etc 4 | */ 5 | #book-search-results .search-results { 6 | display: none; 7 | } 8 | #book-search-results .search-results ul.search-results-list { 9 | list-style-type: none; 10 | padding-left: 0; 11 | } 12 | #book-search-results .search-results ul.search-results-list li { 13 | margin-bottom: 1.5rem; 14 | padding-bottom: 0.5rem; 15 | /* Highlight results */ 16 | } 17 | #book-search-results .search-results ul.search-results-list li p em { 18 | background-color: rgba(255, 220, 0, 0.4); 19 | font-style: normal; 20 | } 21 | #book-search-results .search-results .no-results { 22 | display: none; 23 | } 24 | #book-search-results.open .search-results { 25 | display: block; 26 | } 27 | #book-search-results.open .search-noresults { 28 | display: none; 29 | } 30 | #book-search-results.no-results .search-results .has-results { 31 | display: none; 32 | } 33 | #book-search-results.no-results .search-results .no-results { 34 | display: block; 35 | } 36 | -------------------------------------------------------------------------------- /_book/gitbook/gitbook-plugin-splitter/splitter.css: -------------------------------------------------------------------------------- 1 | .divider-content-summary { 2 | position: absolute; 3 | top: 0; 4 | right: 0; 5 | height: 100%; 6 | width: 5px; 7 | display: table; 8 | cursor: col-resize; 9 | color: #ccc; 10 | -webkit-transition: color 350ms ease; 11 | -moz-transition: color 350ms ease; 12 | -o-transition: color 350ms ease; 13 | transition: color 350ms ease 14 | } 15 | .divider-content-summary:hover { 16 | color: #444; 17 | } 18 | .divider-content-summary__icon { 19 | display: table-cell; 20 | vertical-align: middle; 21 | text-align: center; 22 | } 23 | -------------------------------------------------------------------------------- /_book/gitbook/gitbook-plugin-theme-comscore/test.css: -------------------------------------------------------------------------------- 1 | section { 2 | width:100%; 3 | } 4 | h1 { 5 | color: #2674BA; 6 | } 7 | h2 { 8 | color: #0099CC; 9 | } 10 | h3 { 11 | color: #F77A0B; 12 | } 13 | h4 { 14 | color: #662D91; 15 | } 16 | h5 { 17 | color: #444444; 18 | } 19 | th { 20 | background-color: #2674BA; 21 | color: white; 22 | } 23 | -------------------------------------------------------------------------------- /_book/gitbook/gitbook-plugin-theme-comscore/test.js: -------------------------------------------------------------------------------- 1 | require(["gitbook"], function(gitbook) { 2 | gitbook.events.bind("page.change", function() { 3 | // do something 4 | }); 5 | 6 | gitbook.events.bind("exercise.submit", function() { 7 | // do something 8 | }); 9 | }); -------------------------------------------------------------------------------- /_book/gitbook/images/apple-touch-icon-precomposed-152.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/truelovesdu/sosotest_docs/7cf5c4abc7f0775f9fa1f0fbc70335f35518b3aa/_book/gitbook/images/apple-touch-icon-precomposed-152.png -------------------------------------------------------------------------------- /_book/gitbook/images/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/truelovesdu/sosotest_docs/7cf5c4abc7f0775f9fa1f0fbc70335f35518b3aa/_book/gitbook/images/favicon.ico -------------------------------------------------------------------------------- /_book/image/DATASERVICE用户截图.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/truelovesdu/sosotest_docs/7cf5c4abc7f0775f9fa1f0fbc70335f35518b3aa/_book/image/DATASERVICE用户截图.png -------------------------------------------------------------------------------- /_book/image/DATASERVICE用户配置value截图.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/truelovesdu/sosotest_docs/7cf5c4abc7f0775f9fa1f0fbc70335f35518b3aa/_book/image/DATASERVICE用户配置value截图.png -------------------------------------------------------------------------------- /_book/image/KEYWORD示例.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/truelovesdu/sosotest_docs/7cf5c4abc7f0775f9fa1f0fbc70335f35518b3aa/_book/image/KEYWORD示例.png -------------------------------------------------------------------------------- /_book/image/MOCK普通模式.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/truelovesdu/sosotest_docs/7cf5c4abc7f0775f9fa1f0fbc70335f35518b3aa/_book/image/MOCK普通模式.png -------------------------------------------------------------------------------- /_book/image/MOCK最大匹配1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/truelovesdu/sosotest_docs/7cf5c4abc7f0775f9fa1f0fbc70335f35518b3aa/_book/image/MOCK最大匹配1.png -------------------------------------------------------------------------------- /_book/image/MOCK最大匹配2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/truelovesdu/sosotest_docs/7cf5c4abc7f0775f9fa1f0fbc70335f35518b3aa/_book/image/MOCK最大匹配2.png -------------------------------------------------------------------------------- /_book/image/MOCK正则restful接口.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/truelovesdu/sosotest_docs/7cf5c4abc7f0775f9fa1f0fbc70335f35518b3aa/_book/image/MOCK正则restful接口.png -------------------------------------------------------------------------------- /_book/image/MOCK添加mock高级模式.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/truelovesdu/sosotest_docs/7cf5c4abc7f0775f9fa1f0fbc70335f35518b3aa/_book/image/MOCK添加mock高级模式.png -------------------------------------------------------------------------------- /_book/image/MOCK添加示例.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/truelovesdu/sosotest_docs/7cf5c4abc7f0775f9fa1f0fbc70335f35518b3aa/_book/image/MOCK添加示例.png -------------------------------------------------------------------------------- /_book/image/MOCK添加页面.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/truelovesdu/sosotest_docs/7cf5c4abc7f0775f9fa1f0fbc70335f35518b3aa/_book/image/MOCK添加页面.png -------------------------------------------------------------------------------- /_book/image/MOCK请求方式列表展示.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/truelovesdu/sosotest_docs/7cf5c4abc7f0775f9fa1f0fbc70335f35518b3aa/_book/image/MOCK请求方式列表展示.png -------------------------------------------------------------------------------- /_book/image/MOCK高级模式代码.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/truelovesdu/sosotest_docs/7cf5c4abc7f0775f9fa1f0fbc70335f35518b3aa/_book/image/MOCK高级模式代码.png -------------------------------------------------------------------------------- /_book/image/MOCK高级模式相关变量.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/truelovesdu/sosotest_docs/7cf5c4abc7f0775f9fa1f0fbc70335f35518b3aa/_book/image/MOCK高级模式相关变量.png -------------------------------------------------------------------------------- /_book/image/MOCK高级模式默认引入包.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/truelovesdu/sosotest_docs/7cf5c4abc7f0775f9fa1f0fbc70335f35518b3aa/_book/image/MOCK高级模式默认引入包.png -------------------------------------------------------------------------------- /_book/image/PYTHON内置变量示例.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/truelovesdu/sosotest_docs/7cf5c4abc7f0775f9fa1f0fbc70335f35518b3aa/_book/image/PYTHON内置变量示例.png -------------------------------------------------------------------------------- /_book/image/PYTHON数据驱动.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/truelovesdu/sosotest_docs/7cf5c4abc7f0775f9fa1f0fbc70335f35518b3aa/_book/image/PYTHON数据驱动.png -------------------------------------------------------------------------------- /_book/image/PYTHON自定义类.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/truelovesdu/sosotest_docs/7cf5c4abc7f0775f9fa1f0fbc70335f35518b3aa/_book/image/PYTHON自定义类.png -------------------------------------------------------------------------------- /_book/image/PYTHON自定义类引用.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/truelovesdu/sosotest_docs/7cf5c4abc7f0775f9fa1f0fbc70335f35518b3aa/_book/image/PYTHON自定义类引用.png -------------------------------------------------------------------------------- /_book/image/口测试平台组合文本环境变量.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/truelovesdu/sosotest_docs/7cf5c4abc7f0775f9fa1f0fbc70335f35518b3aa/_book/image/口测试平台组合文本环境变量.png -------------------------------------------------------------------------------- /_book/image/接口测试平台DUBBO接口使用.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/truelovesdu/sosotest_docs/7cf5c4abc7f0775f9fa1f0fbc70335f35518b3aa/_book/image/接口测试平台DUBBO接口使用.png -------------------------------------------------------------------------------- /_book/image/接口测试平台DUBBO接口导入日志.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/truelovesdu/sosotest_docs/7cf5c4abc7f0775f9fa1f0fbc70335f35518b3aa/_book/image/接口测试平台DUBBO接口导入日志.png -------------------------------------------------------------------------------- /_book/image/接口测试平台DUBBO接口操作.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/truelovesdu/sosotest_docs/7cf5c4abc7f0775f9fa1f0fbc70335f35518b3aa/_book/image/接口测试平台DUBBO接口操作.png -------------------------------------------------------------------------------- /_book/image/接口测试平台DUBBO接口查询.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/truelovesdu/sosotest_docs/7cf5c4abc7f0775f9fa1f0fbc70335f35518b3aa/_book/image/接口测试平台DUBBO接口查询.png -------------------------------------------------------------------------------- /_book/image/接口测试平台DUBBO接口添加.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/truelovesdu/sosotest_docs/7cf5c4abc7f0775f9fa1f0fbc70335f35518b3aa/_book/image/接口测试平台DUBBO接口添加.png -------------------------------------------------------------------------------- /_book/image/接口测试平台DUBBO接口添加case.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/truelovesdu/sosotest_docs/7cf5c4abc7f0775f9fa1f0fbc70335f35518b3aa/_book/image/接口测试平台DUBBO接口添加case.png -------------------------------------------------------------------------------- /_book/image/接口测试平台http之业务流.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/truelovesdu/sosotest_docs/7cf5c4abc7f0775f9fa1f0fbc70335f35518b3aa/_book/image/接口测试平台http之业务流.png -------------------------------------------------------------------------------- /_book/image/接口测试平台http之任务流执行顺序.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/truelovesdu/sosotest_docs/7cf5c4abc7f0775f9fa1f0fbc70335f35518b3aa/_book/image/接口测试平台http之任务流执行顺序.png -------------------------------------------------------------------------------- /_book/image/接口测试平台http之执行结果.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/truelovesdu/sosotest_docs/7cf5c4abc7f0775f9fa1f0fbc70335f35518b3aa/_book/image/接口测试平台http之执行结果.png -------------------------------------------------------------------------------- /_book/image/接口测试平台http之添加任务.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/truelovesdu/sosotest_docs/7cf5c4abc7f0775f9fa1f0fbc70335f35518b3aa/_book/image/接口测试平台http之添加任务.png -------------------------------------------------------------------------------- /_book/image/接口测试平台http之添加任务集.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/truelovesdu/sosotest_docs/7cf5c4abc7f0775f9fa1f0fbc70335f35518b3aa/_book/image/接口测试平台http之添加任务集.png -------------------------------------------------------------------------------- /_book/image/接口测试平台http之添加接口.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/truelovesdu/sosotest_docs/7cf5c4abc7f0775f9fa1f0fbc70335f35518b3aa/_book/image/接口测试平台http之添加接口.png -------------------------------------------------------------------------------- /_book/image/接口测试平台http之添加接口2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/truelovesdu/sosotest_docs/7cf5c4abc7f0775f9fa1f0fbc70335f35518b3aa/_book/image/接口测试平台http之添加接口2.png -------------------------------------------------------------------------------- /_book/image/接口测试平台使用jenkins插件.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/truelovesdu/sosotest_docs/7cf5c4abc7f0775f9fa1f0fbc70335f35518b3aa/_book/image/接口测试平台使用jenkins插件.png -------------------------------------------------------------------------------- /_book/image/接口测试平台全局变量使用.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/truelovesdu/sosotest_docs/7cf5c4abc7f0775f9fa1f0fbc70335f35518b3aa/_book/image/接口测试平台全局变量使用.png -------------------------------------------------------------------------------- /_book/image/接口测试平台全局变量操作.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/truelovesdu/sosotest_docs/7cf5c4abc7f0775f9fa1f0fbc70335f35518b3aa/_book/image/接口测试平台全局变量操作.png -------------------------------------------------------------------------------- /_book/image/接口测试平台全局变量查询.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/truelovesdu/sosotest_docs/7cf5c4abc7f0775f9fa1f0fbc70335f35518b3aa/_book/image/接口测试平台全局变量查询.png -------------------------------------------------------------------------------- /_book/image/接口测试平台全局变量添加.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/truelovesdu/sosotest_docs/7cf5c4abc7f0775f9fa1f0fbc70335f35518b3aa/_book/image/接口测试平台全局变量添加.png -------------------------------------------------------------------------------- /_book/image/接口测试平台全局变量编辑.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/truelovesdu/sosotest_docs/7cf5c4abc7f0775f9fa1f0fbc70335f35518b3aa/_book/image/接口测试平台全局变量编辑.png -------------------------------------------------------------------------------- /_book/image/接口测试平台前台HTTP单接口列表页.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/truelovesdu/sosotest_docs/7cf5c4abc7f0775f9fa1f0fbc70335f35518b3aa/_book/image/接口测试平台前台HTTP单接口列表页.png -------------------------------------------------------------------------------- /_book/image/接口测试平台前台业务流变量传递示例.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/truelovesdu/sosotest_docs/7cf5c4abc7f0775f9fa1f0fbc70335f35518b3aa/_book/image/接口测试平台前台业务流变量传递示例.png -------------------------------------------------------------------------------- /_book/image/接口测试平台前台任务列表指示执行.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/truelovesdu/sosotest_docs/7cf5c4abc7f0775f9fa1f0fbc70335f35518b3aa/_book/image/接口测试平台前台任务列表指示执行.png -------------------------------------------------------------------------------- /_book/image/接口测试平台前台任务集测试报告.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/truelovesdu/sosotest_docs/7cf5c4abc7f0775f9fa1f0fbc70335f35518b3aa/_book/image/接口测试平台前台任务集测试报告.png -------------------------------------------------------------------------------- /_book/image/接口测试平台前台使用token更新.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/truelovesdu/sosotest_docs/7cf5c4abc7f0775f9fa1f0fbc70335f35518b3aa/_book/image/接口测试平台前台使用token更新.png -------------------------------------------------------------------------------- /_book/image/接口测试平台前台使用业务流变量传递调试结果.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/truelovesdu/sosotest_docs/7cf5c4abc7f0775f9fa1f0fbc70335f35518b3aa/_book/image/接口测试平台前台使用业务流变量传递调试结果.png -------------------------------------------------------------------------------- /_book/image/接口测试平台前台使用业务流同步与新增步骤.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/truelovesdu/sosotest_docs/7cf5c4abc7f0775f9fa1f0fbc70335f35518b3aa/_book/image/接口测试平台前台使用业务流同步与新增步骤.png -------------------------------------------------------------------------------- /_book/image/接口测试平台前台使用任务执行报告统计.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/truelovesdu/sosotest_docs/7cf5c4abc7f0775f9fa1f0fbc70335f35518b3aa/_book/image/接口测试平台前台使用任务执行报告统计.png -------------------------------------------------------------------------------- /_book/image/接口测试平台前台使用任务执行结果.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/truelovesdu/sosotest_docs/7cf5c4abc7f0775f9fa1f0fbc70335f35518b3aa/_book/image/接口测试平台前台使用任务执行结果.png -------------------------------------------------------------------------------- /_book/image/接口测试平台前台使用任务报告详情.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/truelovesdu/sosotest_docs/7cf5c4abc7f0775f9fa1f0fbc70335f35518b3aa/_book/image/接口测试平台前台使用任务报告详情.png -------------------------------------------------------------------------------- /_book/image/接口测试平台前台使用任务集列表执行.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/truelovesdu/sosotest_docs/7cf5c4abc7f0775f9fa1f0fbc70335f35518b3aa/_book/image/接口测试平台前台使用任务集列表执行.png -------------------------------------------------------------------------------- /_book/image/接口测试平台前台使用任务集执行.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/truelovesdu/sosotest_docs/7cf5c4abc7f0775f9fa1f0fbc70335f35518b3aa/_book/image/接口测试平台前台使用任务集执行.png -------------------------------------------------------------------------------- /_book/image/接口测试平台前台使用任务集结果列表查看报告.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/truelovesdu/sosotest_docs/7cf5c4abc7f0775f9fa1f0fbc70335f35518b3aa/_book/image/接口测试平台前台使用任务集结果列表查看报告.png -------------------------------------------------------------------------------- /_book/image/接口测试平台前台使用单接口创建.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/truelovesdu/sosotest_docs/7cf5c4abc7f0775f9fa1f0fbc70335f35518b3aa/_book/image/接口测试平台前台使用单接口创建.png -------------------------------------------------------------------------------- /_book/image/接口测试平台前台使用持续集成示例.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/truelovesdu/sosotest_docs/7cf5c4abc7f0775f9fa1f0fbc70335f35518b3aa/_book/image/接口测试平台前台使用持续集成示例.png -------------------------------------------------------------------------------- /_book/image/接口测试平台前台使用添加任务集.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/truelovesdu/sosotest_docs/7cf5c4abc7f0775f9fa1f0fbc70335f35518b3aa/_book/image/接口测试平台前台使用添加任务集.png -------------------------------------------------------------------------------- /_book/image/接口测试平台前台使用请求地址配置.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/truelovesdu/sosotest_docs/7cf5c4abc7f0775f9fa1f0fbc70335f35518b3aa/_book/image/接口测试平台前台使用请求地址配置.png -------------------------------------------------------------------------------- /_book/image/接口测试平台前台选择环境执行任务.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/truelovesdu/sosotest_docs/7cf5c4abc7f0775f9fa1f0fbc70335f35518b3aa/_book/image/接口测试平台前台选择环境执行任务.png -------------------------------------------------------------------------------- /_book/image/接口测试平台后台业务流选择单接口页面.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/truelovesdu/sosotest_docs/7cf5c4abc7f0775f9fa1f0fbc70335f35518b3aa/_book/image/接口测试平台后台业务流选择单接口页面.png -------------------------------------------------------------------------------- /_book/image/接口测试平台后台使用业务线模块关联.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/truelovesdu/sosotest_docs/7cf5c4abc7f0775f9fa1f0fbc70335f35518b3aa/_book/image/接口测试平台后台使用业务线模块关联.png -------------------------------------------------------------------------------- /_book/image/接口测试平台后台使用执行服务管理页面.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/truelovesdu/sosotest_docs/7cf5c4abc7f0775f9fa1f0fbc70335f35518b3aa/_book/image/接口测试平台后台使用执行服务管理页面.png -------------------------------------------------------------------------------- /_book/image/接口测试平台后台使用数据服务器管理.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/truelovesdu/sosotest_docs/7cf5c4abc7f0775f9fa1f0fbc70335f35518b3aa/_book/image/接口测试平台后台使用数据服务器管理.png -------------------------------------------------------------------------------- /_book/image/接口测试平台后台使用服务URI管理.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/truelovesdu/sosotest_docs/7cf5c4abc7f0775f9fa1f0fbc70335f35518b3aa/_book/image/接口测试平台后台使用服务URI管理.png -------------------------------------------------------------------------------- /_book/image/接口测试平台后台使用来源管理.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/truelovesdu/sosotest_docs/7cf5c4abc7f0775f9fa1f0fbc70335f35518b3aa/_book/image/接口测试平台后台使用来源管理.png -------------------------------------------------------------------------------- /_book/image/接口测试平台后台使用添加业务线.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/truelovesdu/sosotest_docs/7cf5c4abc7f0775f9fa1f0fbc70335f35518b3aa/_book/image/接口测试平台后台使用添加业务线.png -------------------------------------------------------------------------------- /_book/image/接口测试平台后台使用添加模块.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/truelovesdu/sosotest_docs/7cf5c4abc7f0775f9fa1f0fbc70335f35518b3aa/_book/image/接口测试平台后台使用添加模块.png -------------------------------------------------------------------------------- /_book/image/接口测试平台后台使用环境配置管理.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/truelovesdu/sosotest_docs/7cf5c4abc7f0775f9fa1f0fbc70335f35518b3aa/_book/image/接口测试平台后台使用环境配置管理.png -------------------------------------------------------------------------------- /_book/image/接口测试平台后台使用用户添加页面.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/truelovesdu/sosotest_docs/7cf5c4abc7f0775f9fa1f0fbc70335f35518b3aa/_book/image/接口测试平台后台使用用户添加页面.png -------------------------------------------------------------------------------- /_book/image/接口测试平台后台使用用户管理页面.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/truelovesdu/sosotest_docs/7cf5c4abc7f0775f9fa1f0fbc70335f35518b3aa/_book/image/接口测试平台后台使用用户管理页面.png -------------------------------------------------------------------------------- /_book/image/接口测试平台后台小组管理页面.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/truelovesdu/sosotest_docs/7cf5c4abc7f0775f9fa1f0fbc70335f35518b3aa/_book/image/接口测试平台后台小组管理页面.png -------------------------------------------------------------------------------- /_book/image/接口测试平台后台执行服务编辑页面.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/truelovesdu/sosotest_docs/7cf5c4abc7f0775f9fa1f0fbc70335f35518b3aa/_book/image/接口测试平台后台执行服务编辑页面.png -------------------------------------------------------------------------------- /_book/image/接口测试平台后台用户授权按钮.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/truelovesdu/sosotest_docs/7cf5c4abc7f0775f9fa1f0fbc70335f35518b3aa/_book/image/接口测试平台后台用户授权按钮.png -------------------------------------------------------------------------------- /_book/image/接口测试平台后台用户添加页面.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/truelovesdu/sosotest_docs/7cf5c4abc7f0775f9fa1f0fbc70335f35518b3aa/_book/image/接口测试平台后台用户添加页面.png -------------------------------------------------------------------------------- /_book/image/接口测试平台后台首页.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/truelovesdu/sosotest_docs/7cf5c4abc7f0775f9fa1f0fbc70335f35518b3aa/_book/image/接口测试平台后台首页.png -------------------------------------------------------------------------------- /_book/image/接口测试平台数据服务.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/truelovesdu/sosotest_docs/7cf5c4abc7f0775f9fa1f0fbc70335f35518b3aa/_book/image/接口测试平台数据服务.png -------------------------------------------------------------------------------- /_book/image/接口测试平台数据服务组合文本.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/truelovesdu/sosotest_docs/7cf5c4abc7f0775f9fa1f0fbc70335f35518b3aa/_book/image/接口测试平台数据服务组合文本.png -------------------------------------------------------------------------------- /_book/image/接口测试平台架构图opensource.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/truelovesdu/sosotest_docs/7cf5c4abc7f0775f9fa1f0fbc70335f35518b3aa/_book/image/接口测试平台架构图opensource.png -------------------------------------------------------------------------------- /_book/image/接口测试平台组合文本使用.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/truelovesdu/sosotest_docs/7cf5c4abc7f0775f9fa1f0fbc70335f35518b3aa/_book/image/接口测试平台组合文本使用.png -------------------------------------------------------------------------------- /_book/image/接口测试平台组合文本使用结果.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/truelovesdu/sosotest_docs/7cf5c4abc7f0775f9fa1f0fbc70335f35518b3aa/_book/image/接口测试平台组合文本使用结果.png -------------------------------------------------------------------------------- /_book/image/接口测试平台组合文本操作.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/truelovesdu/sosotest_docs/7cf5c4abc7f0775f9fa1f0fbc70335f35518b3aa/_book/image/接口测试平台组合文本操作.png -------------------------------------------------------------------------------- /_book/image/接口测试平台组合文本查询.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/truelovesdu/sosotest_docs/7cf5c4abc7f0775f9fa1f0fbc70335f35518b3aa/_book/image/接口测试平台组合文本查询.png -------------------------------------------------------------------------------- /_book/image/接口测试平台组合文本添加.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/truelovesdu/sosotest_docs/7cf5c4abc7f0775f9fa1f0fbc70335f35518b3aa/_book/image/接口测试平台组合文本添加.png -------------------------------------------------------------------------------- /_book/image/接口测试平台组合文本环境变量.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/truelovesdu/sosotest_docs/7cf5c4abc7f0775f9fa1f0fbc70335f35518b3aa/_book/image/接口测试平台组合文本环境变量.png -------------------------------------------------------------------------------- /_book/image/接口测试平台组合文本编辑.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/truelovesdu/sosotest_docs/7cf5c4abc7f0775f9fa1f0fbc70335f35518b3aa/_book/image/接口测试平台组合文本编辑.png -------------------------------------------------------------------------------- /_book/image/接口测试平台配置管理之服务配置.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/truelovesdu/sosotest_docs/7cf5c4abc7f0775f9fa1f0fbc70335f35518b3aa/_book/image/接口测试平台配置管理之服务配置.png -------------------------------------------------------------------------------- /_book/image/接口测试平台配置管理之环境配置.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/truelovesdu/sosotest_docs/7cf5c4abc7f0775f9fa1f0fbc70335f35518b3aa/_book/image/接口测试平台配置管理之环境配置.png -------------------------------------------------------------------------------- /_book/image/接口测试平台配置管理之请求地址配置.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/truelovesdu/sosotest_docs/7cf5c4abc7f0775f9fa1f0fbc70335f35518b3aa/_book/image/接口测试平台配置管理之请求地址配置.png -------------------------------------------------------------------------------- /_book/image/测试平台前台使用添加任务.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/truelovesdu/sosotest_docs/7cf5c4abc7f0775f9fa1f0fbc70335f35518b3aa/_book/image/测试平台前台使用添加任务.png -------------------------------------------------------------------------------- /_book/image/测试模型.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/truelovesdu/sosotest_docs/7cf5c4abc7f0775f9fa1f0fbc70335f35518b3aa/_book/image/测试模型.png -------------------------------------------------------------------------------- /_book/image/添加请求地址.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/truelovesdu/sosotest_docs/7cf5c4abc7f0775f9fa1f0fbc70335f35518b3aa/_book/image/添加请求地址.png -------------------------------------------------------------------------------- /_book/image/用户服务列表.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/truelovesdu/sosotest_docs/7cf5c4abc7f0775f9fa1f0fbc70335f35518b3aa/_book/image/用户服务列表.png -------------------------------------------------------------------------------- /_book/image/用户服务添加.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/truelovesdu/sosotest_docs/7cf5c4abc7f0775f9fa1f0fbc70335f35518b3aa/_book/image/用户服务添加.png -------------------------------------------------------------------------------- /_book/image/用户环境列表查看.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/truelovesdu/sosotest_docs/7cf5c4abc7f0775f9fa1f0fbc70335f35518b3aa/_book/image/用户环境列表查看.png -------------------------------------------------------------------------------- /_book/image/用户环境添加.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/truelovesdu/sosotest_docs/7cf5c4abc7f0775f9fa1f0fbc70335f35518b3aa/_book/image/用户环境添加.png -------------------------------------------------------------------------------- /_book/image/请求地址列表.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/truelovesdu/sosotest_docs/7cf5c4abc7f0775f9fa1f0fbc70335f35518b3aa/_book/image/请求地址列表.png -------------------------------------------------------------------------------- /_book/image/进入服务配置.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/truelovesdu/sosotest_docs/7cf5c4abc7f0775f9fa1f0fbc70335f35518b3aa/_book/image/进入服务配置.png -------------------------------------------------------------------------------- /_book/image/进入环境配置.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/truelovesdu/sosotest_docs/7cf5c4abc7f0775f9fa1f0fbc70335f35518b3aa/_book/image/进入环境配置.png -------------------------------------------------------------------------------- /_book/image/进入请求地址配置.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/truelovesdu/sosotest_docs/7cf5c4abc7f0775f9fa1f0fbc70335f35518b3aa/_book/image/进入请求地址配置.png -------------------------------------------------------------------------------- /_book/unnamed.patch: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/truelovesdu/sosotest_docs/7cf5c4abc7f0775f9fa1f0fbc70335f35518b3aa/_book/unnamed.patch -------------------------------------------------------------------------------- /book.json: -------------------------------------------------------------------------------- 1 | { 2 | "title" : "sosotest", 3 | "theme-default": { 4 | "showLevel": true 5 | }, 6 | "styles": { 7 | "website": "styles/website.css", 8 | "ebook": "styles/ebook.css", 9 | "pdf": "styles/pdf.css", 10 | "mobi": "styles/mobi.css", 11 | "epub": "styles/epub.css" 12 | }, 13 | "plugins": ["expandable-chapters","theme-comscore","splitter"] 14 | } -------------------------------------------------------------------------------- /image/DATASERVICE用户截图.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/truelovesdu/sosotest_docs/7cf5c4abc7f0775f9fa1f0fbc70335f35518b3aa/image/DATASERVICE用户截图.png -------------------------------------------------------------------------------- /image/DATASERVICE用户配置value截图.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/truelovesdu/sosotest_docs/7cf5c4abc7f0775f9fa1f0fbc70335f35518b3aa/image/DATASERVICE用户配置value截图.png -------------------------------------------------------------------------------- /image/KEYWORD示例.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/truelovesdu/sosotest_docs/7cf5c4abc7f0775f9fa1f0fbc70335f35518b3aa/image/KEYWORD示例.png -------------------------------------------------------------------------------- /image/MOCK普通模式.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/truelovesdu/sosotest_docs/7cf5c4abc7f0775f9fa1f0fbc70335f35518b3aa/image/MOCK普通模式.png -------------------------------------------------------------------------------- /image/MOCK最大匹配1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/truelovesdu/sosotest_docs/7cf5c4abc7f0775f9fa1f0fbc70335f35518b3aa/image/MOCK最大匹配1.png -------------------------------------------------------------------------------- /image/MOCK最大匹配2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/truelovesdu/sosotest_docs/7cf5c4abc7f0775f9fa1f0fbc70335f35518b3aa/image/MOCK最大匹配2.png -------------------------------------------------------------------------------- /image/MOCK正则restful接口.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/truelovesdu/sosotest_docs/7cf5c4abc7f0775f9fa1f0fbc70335f35518b3aa/image/MOCK正则restful接口.png -------------------------------------------------------------------------------- /image/MOCK添加mock高级模式.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/truelovesdu/sosotest_docs/7cf5c4abc7f0775f9fa1f0fbc70335f35518b3aa/image/MOCK添加mock高级模式.png -------------------------------------------------------------------------------- /image/MOCK添加示例.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/truelovesdu/sosotest_docs/7cf5c4abc7f0775f9fa1f0fbc70335f35518b3aa/image/MOCK添加示例.png -------------------------------------------------------------------------------- /image/MOCK添加页面.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/truelovesdu/sosotest_docs/7cf5c4abc7f0775f9fa1f0fbc70335f35518b3aa/image/MOCK添加页面.png -------------------------------------------------------------------------------- /image/MOCK请求方式列表展示.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/truelovesdu/sosotest_docs/7cf5c4abc7f0775f9fa1f0fbc70335f35518b3aa/image/MOCK请求方式列表展示.png -------------------------------------------------------------------------------- /image/MOCK高级模式代码.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/truelovesdu/sosotest_docs/7cf5c4abc7f0775f9fa1f0fbc70335f35518b3aa/image/MOCK高级模式代码.png -------------------------------------------------------------------------------- /image/MOCK高级模式相关变量.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/truelovesdu/sosotest_docs/7cf5c4abc7f0775f9fa1f0fbc70335f35518b3aa/image/MOCK高级模式相关变量.png -------------------------------------------------------------------------------- /image/MOCK高级模式默认引入包.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/truelovesdu/sosotest_docs/7cf5c4abc7f0775f9fa1f0fbc70335f35518b3aa/image/MOCK高级模式默认引入包.png -------------------------------------------------------------------------------- /image/PYTHON内置变量示例.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/truelovesdu/sosotest_docs/7cf5c4abc7f0775f9fa1f0fbc70335f35518b3aa/image/PYTHON内置变量示例.png -------------------------------------------------------------------------------- /image/PYTHON数据驱动.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/truelovesdu/sosotest_docs/7cf5c4abc7f0775f9fa1f0fbc70335f35518b3aa/image/PYTHON数据驱动.png -------------------------------------------------------------------------------- /image/PYTHON自定义类.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/truelovesdu/sosotest_docs/7cf5c4abc7f0775f9fa1f0fbc70335f35518b3aa/image/PYTHON自定义类.png -------------------------------------------------------------------------------- /image/PYTHON自定义类引用.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/truelovesdu/sosotest_docs/7cf5c4abc7f0775f9fa1f0fbc70335f35518b3aa/image/PYTHON自定义类引用.png -------------------------------------------------------------------------------- /image/口测试平台组合文本环境变量.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/truelovesdu/sosotest_docs/7cf5c4abc7f0775f9fa1f0fbc70335f35518b3aa/image/口测试平台组合文本环境变量.png -------------------------------------------------------------------------------- /image/常见问题解答.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/truelovesdu/sosotest_docs/7cf5c4abc7f0775f9fa1f0fbc70335f35518b3aa/image/常见问题解答.pdf -------------------------------------------------------------------------------- /image/接口测试平台DUBBO接口使用.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/truelovesdu/sosotest_docs/7cf5c4abc7f0775f9fa1f0fbc70335f35518b3aa/image/接口测试平台DUBBO接口使用.png -------------------------------------------------------------------------------- /image/接口测试平台DUBBO接口导入日志.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/truelovesdu/sosotest_docs/7cf5c4abc7f0775f9fa1f0fbc70335f35518b3aa/image/接口测试平台DUBBO接口导入日志.png -------------------------------------------------------------------------------- /image/接口测试平台DUBBO接口操作.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/truelovesdu/sosotest_docs/7cf5c4abc7f0775f9fa1f0fbc70335f35518b3aa/image/接口测试平台DUBBO接口操作.png -------------------------------------------------------------------------------- /image/接口测试平台DUBBO接口查询.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/truelovesdu/sosotest_docs/7cf5c4abc7f0775f9fa1f0fbc70335f35518b3aa/image/接口测试平台DUBBO接口查询.png -------------------------------------------------------------------------------- /image/接口测试平台DUBBO接口添加.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/truelovesdu/sosotest_docs/7cf5c4abc7f0775f9fa1f0fbc70335f35518b3aa/image/接口测试平台DUBBO接口添加.png -------------------------------------------------------------------------------- /image/接口测试平台DUBBO接口添加case.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/truelovesdu/sosotest_docs/7cf5c4abc7f0775f9fa1f0fbc70335f35518b3aa/image/接口测试平台DUBBO接口添加case.png -------------------------------------------------------------------------------- /image/接口测试平台http之业务流.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/truelovesdu/sosotest_docs/7cf5c4abc7f0775f9fa1f0fbc70335f35518b3aa/image/接口测试平台http之业务流.png -------------------------------------------------------------------------------- /image/接口测试平台http之任务流执行顺序.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/truelovesdu/sosotest_docs/7cf5c4abc7f0775f9fa1f0fbc70335f35518b3aa/image/接口测试平台http之任务流执行顺序.png -------------------------------------------------------------------------------- /image/接口测试平台http之执行结果.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/truelovesdu/sosotest_docs/7cf5c4abc7f0775f9fa1f0fbc70335f35518b3aa/image/接口测试平台http之执行结果.png -------------------------------------------------------------------------------- /image/接口测试平台http之添加任务.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/truelovesdu/sosotest_docs/7cf5c4abc7f0775f9fa1f0fbc70335f35518b3aa/image/接口测试平台http之添加任务.png -------------------------------------------------------------------------------- /image/接口测试平台http之添加任务集.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/truelovesdu/sosotest_docs/7cf5c4abc7f0775f9fa1f0fbc70335f35518b3aa/image/接口测试平台http之添加任务集.png -------------------------------------------------------------------------------- /image/接口测试平台http之添加接口.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/truelovesdu/sosotest_docs/7cf5c4abc7f0775f9fa1f0fbc70335f35518b3aa/image/接口测试平台http之添加接口.png -------------------------------------------------------------------------------- /image/接口测试平台http之添加接口2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/truelovesdu/sosotest_docs/7cf5c4abc7f0775f9fa1f0fbc70335f35518b3aa/image/接口测试平台http之添加接口2.png -------------------------------------------------------------------------------- /image/接口测试平台使用jenkins插件.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/truelovesdu/sosotest_docs/7cf5c4abc7f0775f9fa1f0fbc70335f35518b3aa/image/接口测试平台使用jenkins插件.png -------------------------------------------------------------------------------- /image/接口测试平台全局变量使用.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/truelovesdu/sosotest_docs/7cf5c4abc7f0775f9fa1f0fbc70335f35518b3aa/image/接口测试平台全局变量使用.png -------------------------------------------------------------------------------- /image/接口测试平台全局变量操作.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/truelovesdu/sosotest_docs/7cf5c4abc7f0775f9fa1f0fbc70335f35518b3aa/image/接口测试平台全局变量操作.png -------------------------------------------------------------------------------- /image/接口测试平台全局变量查询.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/truelovesdu/sosotest_docs/7cf5c4abc7f0775f9fa1f0fbc70335f35518b3aa/image/接口测试平台全局变量查询.png -------------------------------------------------------------------------------- /image/接口测试平台全局变量添加.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/truelovesdu/sosotest_docs/7cf5c4abc7f0775f9fa1f0fbc70335f35518b3aa/image/接口测试平台全局变量添加.png -------------------------------------------------------------------------------- /image/接口测试平台全局变量编辑.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/truelovesdu/sosotest_docs/7cf5c4abc7f0775f9fa1f0fbc70335f35518b3aa/image/接口测试平台全局变量编辑.png -------------------------------------------------------------------------------- /image/接口测试平台前台HTTP单接口列表页.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/truelovesdu/sosotest_docs/7cf5c4abc7f0775f9fa1f0fbc70335f35518b3aa/image/接口测试平台前台HTTP单接口列表页.png -------------------------------------------------------------------------------- /image/接口测试平台前台业务流变量传递示例.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/truelovesdu/sosotest_docs/7cf5c4abc7f0775f9fa1f0fbc70335f35518b3aa/image/接口测试平台前台业务流变量传递示例.png -------------------------------------------------------------------------------- /image/接口测试平台前台任务列表指示执行.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/truelovesdu/sosotest_docs/7cf5c4abc7f0775f9fa1f0fbc70335f35518b3aa/image/接口测试平台前台任务列表指示执行.png -------------------------------------------------------------------------------- /image/接口测试平台前台任务集测试报告.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/truelovesdu/sosotest_docs/7cf5c4abc7f0775f9fa1f0fbc70335f35518b3aa/image/接口测试平台前台任务集测试报告.png -------------------------------------------------------------------------------- /image/接口测试平台前台使用token更新.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/truelovesdu/sosotest_docs/7cf5c4abc7f0775f9fa1f0fbc70335f35518b3aa/image/接口测试平台前台使用token更新.png -------------------------------------------------------------------------------- /image/接口测试平台前台使用业务流变量传递调试结果.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/truelovesdu/sosotest_docs/7cf5c4abc7f0775f9fa1f0fbc70335f35518b3aa/image/接口测试平台前台使用业务流变量传递调试结果.png -------------------------------------------------------------------------------- /image/接口测试平台前台使用业务流同步与新增步骤.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/truelovesdu/sosotest_docs/7cf5c4abc7f0775f9fa1f0fbc70335f35518b3aa/image/接口测试平台前台使用业务流同步与新增步骤.png -------------------------------------------------------------------------------- /image/接口测试平台前台使用任务执行报告统计.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/truelovesdu/sosotest_docs/7cf5c4abc7f0775f9fa1f0fbc70335f35518b3aa/image/接口测试平台前台使用任务执行报告统计.png -------------------------------------------------------------------------------- /image/接口测试平台前台使用任务执行结果.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/truelovesdu/sosotest_docs/7cf5c4abc7f0775f9fa1f0fbc70335f35518b3aa/image/接口测试平台前台使用任务执行结果.png -------------------------------------------------------------------------------- /image/接口测试平台前台使用任务报告详情.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/truelovesdu/sosotest_docs/7cf5c4abc7f0775f9fa1f0fbc70335f35518b3aa/image/接口测试平台前台使用任务报告详情.png -------------------------------------------------------------------------------- /image/接口测试平台前台使用任务集列表执行.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/truelovesdu/sosotest_docs/7cf5c4abc7f0775f9fa1f0fbc70335f35518b3aa/image/接口测试平台前台使用任务集列表执行.png -------------------------------------------------------------------------------- /image/接口测试平台前台使用任务集执行.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/truelovesdu/sosotest_docs/7cf5c4abc7f0775f9fa1f0fbc70335f35518b3aa/image/接口测试平台前台使用任务集执行.png -------------------------------------------------------------------------------- /image/接口测试平台前台使用任务集结果列表查看报告.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/truelovesdu/sosotest_docs/7cf5c4abc7f0775f9fa1f0fbc70335f35518b3aa/image/接口测试平台前台使用任务集结果列表查看报告.png -------------------------------------------------------------------------------- /image/接口测试平台前台使用单接口创建.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/truelovesdu/sosotest_docs/7cf5c4abc7f0775f9fa1f0fbc70335f35518b3aa/image/接口测试平台前台使用单接口创建.png -------------------------------------------------------------------------------- /image/接口测试平台前台使用持续集成示例.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/truelovesdu/sosotest_docs/7cf5c4abc7f0775f9fa1f0fbc70335f35518b3aa/image/接口测试平台前台使用持续集成示例.png -------------------------------------------------------------------------------- /image/接口测试平台前台使用添加任务集.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/truelovesdu/sosotest_docs/7cf5c4abc7f0775f9fa1f0fbc70335f35518b3aa/image/接口测试平台前台使用添加任务集.png -------------------------------------------------------------------------------- /image/接口测试平台前台使用请求地址配置.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/truelovesdu/sosotest_docs/7cf5c4abc7f0775f9fa1f0fbc70335f35518b3aa/image/接口测试平台前台使用请求地址配置.png -------------------------------------------------------------------------------- /image/接口测试平台前台选择环境执行任务.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/truelovesdu/sosotest_docs/7cf5c4abc7f0775f9fa1f0fbc70335f35518b3aa/image/接口测试平台前台选择环境执行任务.png -------------------------------------------------------------------------------- /image/接口测试平台后台业务流选择单接口页面.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/truelovesdu/sosotest_docs/7cf5c4abc7f0775f9fa1f0fbc70335f35518b3aa/image/接口测试平台后台业务流选择单接口页面.png -------------------------------------------------------------------------------- /image/接口测试平台后台使用业务线模块关联.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/truelovesdu/sosotest_docs/7cf5c4abc7f0775f9fa1f0fbc70335f35518b3aa/image/接口测试平台后台使用业务线模块关联.png -------------------------------------------------------------------------------- /image/接口测试平台后台使用执行服务管理页面.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/truelovesdu/sosotest_docs/7cf5c4abc7f0775f9fa1f0fbc70335f35518b3aa/image/接口测试平台后台使用执行服务管理页面.png -------------------------------------------------------------------------------- /image/接口测试平台后台使用数据服务器管理.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/truelovesdu/sosotest_docs/7cf5c4abc7f0775f9fa1f0fbc70335f35518b3aa/image/接口测试平台后台使用数据服务器管理.png -------------------------------------------------------------------------------- /image/接口测试平台后台使用服务URI管理.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/truelovesdu/sosotest_docs/7cf5c4abc7f0775f9fa1f0fbc70335f35518b3aa/image/接口测试平台后台使用服务URI管理.png -------------------------------------------------------------------------------- /image/接口测试平台后台使用来源管理.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/truelovesdu/sosotest_docs/7cf5c4abc7f0775f9fa1f0fbc70335f35518b3aa/image/接口测试平台后台使用来源管理.png -------------------------------------------------------------------------------- /image/接口测试平台后台使用添加业务线.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/truelovesdu/sosotest_docs/7cf5c4abc7f0775f9fa1f0fbc70335f35518b3aa/image/接口测试平台后台使用添加业务线.png -------------------------------------------------------------------------------- /image/接口测试平台后台使用添加模块.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/truelovesdu/sosotest_docs/7cf5c4abc7f0775f9fa1f0fbc70335f35518b3aa/image/接口测试平台后台使用添加模块.png -------------------------------------------------------------------------------- /image/接口测试平台后台使用环境配置管理.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/truelovesdu/sosotest_docs/7cf5c4abc7f0775f9fa1f0fbc70335f35518b3aa/image/接口测试平台后台使用环境配置管理.png -------------------------------------------------------------------------------- /image/接口测试平台后台使用用户添加页面.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/truelovesdu/sosotest_docs/7cf5c4abc7f0775f9fa1f0fbc70335f35518b3aa/image/接口测试平台后台使用用户添加页面.png -------------------------------------------------------------------------------- /image/接口测试平台后台使用用户管理页面.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/truelovesdu/sosotest_docs/7cf5c4abc7f0775f9fa1f0fbc70335f35518b3aa/image/接口测试平台后台使用用户管理页面.png -------------------------------------------------------------------------------- /image/接口测试平台后台小组管理页面.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/truelovesdu/sosotest_docs/7cf5c4abc7f0775f9fa1f0fbc70335f35518b3aa/image/接口测试平台后台小组管理页面.png -------------------------------------------------------------------------------- /image/接口测试平台后台执行服务编辑页面.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/truelovesdu/sosotest_docs/7cf5c4abc7f0775f9fa1f0fbc70335f35518b3aa/image/接口测试平台后台执行服务编辑页面.png -------------------------------------------------------------------------------- /image/接口测试平台后台用户授权按钮.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/truelovesdu/sosotest_docs/7cf5c4abc7f0775f9fa1f0fbc70335f35518b3aa/image/接口测试平台后台用户授权按钮.png -------------------------------------------------------------------------------- /image/接口测试平台后台用户添加页面.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/truelovesdu/sosotest_docs/7cf5c4abc7f0775f9fa1f0fbc70335f35518b3aa/image/接口测试平台后台用户添加页面.png -------------------------------------------------------------------------------- /image/接口测试平台后台首页.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/truelovesdu/sosotest_docs/7cf5c4abc7f0775f9fa1f0fbc70335f35518b3aa/image/接口测试平台后台首页.png -------------------------------------------------------------------------------- /image/接口测试平台数据服务.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/truelovesdu/sosotest_docs/7cf5c4abc7f0775f9fa1f0fbc70335f35518b3aa/image/接口测试平台数据服务.png -------------------------------------------------------------------------------- /image/接口测试平台数据服务组合文本.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/truelovesdu/sosotest_docs/7cf5c4abc7f0775f9fa1f0fbc70335f35518b3aa/image/接口测试平台数据服务组合文本.png -------------------------------------------------------------------------------- /image/接口测试平台架构图opensource.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/truelovesdu/sosotest_docs/7cf5c4abc7f0775f9fa1f0fbc70335f35518b3aa/image/接口测试平台架构图opensource.png -------------------------------------------------------------------------------- /image/接口测试平台组合文本使用.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/truelovesdu/sosotest_docs/7cf5c4abc7f0775f9fa1f0fbc70335f35518b3aa/image/接口测试平台组合文本使用.png -------------------------------------------------------------------------------- /image/接口测试平台组合文本使用结果.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/truelovesdu/sosotest_docs/7cf5c4abc7f0775f9fa1f0fbc70335f35518b3aa/image/接口测试平台组合文本使用结果.png -------------------------------------------------------------------------------- /image/接口测试平台组合文本操作.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/truelovesdu/sosotest_docs/7cf5c4abc7f0775f9fa1f0fbc70335f35518b3aa/image/接口测试平台组合文本操作.png -------------------------------------------------------------------------------- /image/接口测试平台组合文本查询.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/truelovesdu/sosotest_docs/7cf5c4abc7f0775f9fa1f0fbc70335f35518b3aa/image/接口测试平台组合文本查询.png -------------------------------------------------------------------------------- /image/接口测试平台组合文本添加.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/truelovesdu/sosotest_docs/7cf5c4abc7f0775f9fa1f0fbc70335f35518b3aa/image/接口测试平台组合文本添加.png -------------------------------------------------------------------------------- /image/接口测试平台组合文本环境变量.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/truelovesdu/sosotest_docs/7cf5c4abc7f0775f9fa1f0fbc70335f35518b3aa/image/接口测试平台组合文本环境变量.png -------------------------------------------------------------------------------- /image/接口测试平台组合文本编辑.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/truelovesdu/sosotest_docs/7cf5c4abc7f0775f9fa1f0fbc70335f35518b3aa/image/接口测试平台组合文本编辑.png -------------------------------------------------------------------------------- /image/接口测试平台配置管理之服务配置.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/truelovesdu/sosotest_docs/7cf5c4abc7f0775f9fa1f0fbc70335f35518b3aa/image/接口测试平台配置管理之服务配置.png -------------------------------------------------------------------------------- /image/接口测试平台配置管理之环境配置.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/truelovesdu/sosotest_docs/7cf5c4abc7f0775f9fa1f0fbc70335f35518b3aa/image/接口测试平台配置管理之环境配置.png -------------------------------------------------------------------------------- /image/接口测试平台配置管理之请求地址配置.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/truelovesdu/sosotest_docs/7cf5c4abc7f0775f9fa1f0fbc70335f35518b3aa/image/接口测试平台配置管理之请求地址配置.png -------------------------------------------------------------------------------- /image/测试平台前台使用添加任务.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/truelovesdu/sosotest_docs/7cf5c4abc7f0775f9fa1f0fbc70335f35518b3aa/image/测试平台前台使用添加任务.png -------------------------------------------------------------------------------- /image/测试模型.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/truelovesdu/sosotest_docs/7cf5c4abc7f0775f9fa1f0fbc70335f35518b3aa/image/测试模型.png -------------------------------------------------------------------------------- /image/添加请求地址.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/truelovesdu/sosotest_docs/7cf5c4abc7f0775f9fa1f0fbc70335f35518b3aa/image/添加请求地址.png -------------------------------------------------------------------------------- /image/用户服务列表.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/truelovesdu/sosotest_docs/7cf5c4abc7f0775f9fa1f0fbc70335f35518b3aa/image/用户服务列表.png -------------------------------------------------------------------------------- /image/用户服务添加.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/truelovesdu/sosotest_docs/7cf5c4abc7f0775f9fa1f0fbc70335f35518b3aa/image/用户服务添加.png -------------------------------------------------------------------------------- /image/用户环境列表查看.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/truelovesdu/sosotest_docs/7cf5c4abc7f0775f9fa1f0fbc70335f35518b3aa/image/用户环境列表查看.png -------------------------------------------------------------------------------- /image/用户环境添加.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/truelovesdu/sosotest_docs/7cf5c4abc7f0775f9fa1f0fbc70335f35518b3aa/image/用户环境添加.png -------------------------------------------------------------------------------- /image/请求地址列表.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/truelovesdu/sosotest_docs/7cf5c4abc7f0775f9fa1f0fbc70335f35518b3aa/image/请求地址列表.png -------------------------------------------------------------------------------- /image/进入服务配置.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/truelovesdu/sosotest_docs/7cf5c4abc7f0775f9fa1f0fbc70335f35518b3aa/image/进入服务配置.png -------------------------------------------------------------------------------- /image/进入环境配置.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/truelovesdu/sosotest_docs/7cf5c4abc7f0775f9fa1f0fbc70335f35518b3aa/image/进入环境配置.png -------------------------------------------------------------------------------- /image/进入请求地址配置.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/truelovesdu/sosotest_docs/7cf5c4abc7f0775f9fa1f0fbc70335f35518b3aa/image/进入请求地址配置.png -------------------------------------------------------------------------------- /node_modules/balanced-match/.npmignore: -------------------------------------------------------------------------------- 1 | test 2 | .gitignore 3 | .travis.yml 4 | Makefile 5 | example.js 6 | -------------------------------------------------------------------------------- /node_modules/balanced-match/LICENSE.md: -------------------------------------------------------------------------------- 1 | (MIT) 2 | 3 | Copyright (c) 2013 Julian Gruber <julian@juliangruber.com> 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy of 6 | this software and associated documentation files (the "Software"), to deal in 7 | the Software without restriction, including without limitation the rights to 8 | use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies 9 | of the Software, and to permit persons to whom the Software is furnished to do 10 | so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /node_modules/brace-expansion/LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2013 Julian Gruber 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /node_modules/concat-map/.travis.yml: -------------------------------------------------------------------------------- 1 | language: node_js 2 | node_js: 3 | - 0.4 4 | - 0.6 5 | -------------------------------------------------------------------------------- /node_modules/concat-map/LICENSE: -------------------------------------------------------------------------------- 1 | This software is released under the MIT license: 2 | 3 | Permission is hereby granted, free of charge, to any person obtaining a copy of 4 | this software and associated documentation files (the "Software"), to deal in 5 | the Software without restriction, including without limitation the rights to 6 | use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of 7 | the Software, and to permit persons to whom the Software is furnished to do so, 8 | subject to the following conditions: 9 | 10 | The above copyright notice and this permission notice shall be included in all 11 | copies or substantial portions of the Software. 12 | 13 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 14 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS 15 | FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR 16 | COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER 17 | IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 18 | CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 19 | -------------------------------------------------------------------------------- /node_modules/concat-map/example/map.js: -------------------------------------------------------------------------------- 1 | var concatMap = require('../'); 2 | var xs = [ 1, 2, 3, 4, 5, 6 ]; 3 | var ys = concatMap(xs, function (x) { 4 | return x % 2 ? [ x - 0.1, x, x + 0.1 ] : []; 5 | }); 6 | console.dir(ys); 7 | -------------------------------------------------------------------------------- /node_modules/concat-map/index.js: -------------------------------------------------------------------------------- 1 | module.exports = function (xs, fn) { 2 | var res = []; 3 | for (var i = 0; i < xs.length; i++) { 4 | var x = fn(xs[i], i); 5 | if (isArray(x)) res.push.apply(res, x); 6 | else res.push(x); 7 | } 8 | return res; 9 | }; 10 | 11 | var isArray = Array.isArray || function (xs) { 12 | return Object.prototype.toString.call(xs) === '[object Array]'; 13 | }; 14 | -------------------------------------------------------------------------------- /node_modules/concat-map/test/map.js: -------------------------------------------------------------------------------- 1 | var concatMap = require('../'); 2 | var test = require('tape'); 3 | 4 | test('empty or not', function (t) { 5 | var xs = [ 1, 2, 3, 4, 5, 6 ]; 6 | var ixes = []; 7 | var ys = concatMap(xs, function (x, ix) { 8 | ixes.push(ix); 9 | return x % 2 ? [ x - 0.1, x, x + 0.1 ] : []; 10 | }); 11 | t.same(ys, [ 0.9, 1, 1.1, 2.9, 3, 3.1, 4.9, 5, 5.1 ]); 12 | t.same(ixes, [ 0, 1, 2, 3, 4, 5 ]); 13 | t.end(); 14 | }); 15 | 16 | test('always something', function (t) { 17 | var xs = [ 'a', 'b', 'c', 'd' ]; 18 | var ys = concatMap(xs, function (x) { 19 | return x === 'b' ? [ 'B', 'B', 'B' ] : [ x ]; 20 | }); 21 | t.same(ys, [ 'a', 'B', 'B', 'B', 'c', 'd' ]); 22 | t.end(); 23 | }); 24 | 25 | test('scalars', function (t) { 26 | var xs = [ 'a', 'b', 'c', 'd' ]; 27 | var ys = concatMap(xs, function (x) { 28 | return x === 'b' ? [ 'B', 'B', 'B' ] : x; 29 | }); 30 | t.same(ys, [ 'a', 'B', 'B', 'B', 'c', 'd' ]); 31 | t.end(); 32 | }); 33 | 34 | test('undefs', function (t) { 35 | var xs = [ 'a', 'b', 'c', 'd' ]; 36 | var ys = concatMap(xs, function () {}); 37 | t.same(ys, [ undefined, undefined, undefined, undefined ]); 38 | t.end(); 39 | }); 40 | -------------------------------------------------------------------------------- /node_modules/daggy/.npmignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | -------------------------------------------------------------------------------- /node_modules/daggy/README.old.md: -------------------------------------------------------------------------------- 1 | # Daggy 2 | 3 | Library for creating tagged constructors. 4 | 5 | ## Examples 6 | 7 | ### `daggy.getInstance` 8 | 9 | ```javascript 10 | function WrappedArray() { 11 | var self = daggy.getInstance(this, WrappedArray); 12 | self._array = [].slice.apply(arguments); 13 | return self; 14 | } 15 | new WrappedArray(1, 2, 3) instanceof WrappedArray; // true 16 | WrappedArray(1, 2, 3) instanceof WrappedArray; // true 17 | ``` 18 | 19 | ### `daggy.tagged` 20 | 21 | ```javascript 22 | var Tuple3 = daggy.tagged('x', 'y', 'z'); 23 | 24 | var _123 = Tuple3(1, 2, 3); // optional new keyword 25 | _123.x == 1 && _123.y == 2 && _123.z == 3; // true 26 | _123 instanceof Tuple3; // true 27 | ``` 28 | 29 | ### `daggy.taggedSum` 30 | 31 | ```javascript 32 | var Option = daggy.taggedSum({ 33 | Some: ['x'], 34 | None: [] 35 | }); 36 | 37 | Option.Some(1) instanceof Option.Some; // true 38 | Option.Some(1) instanceof Option; // true 39 | Option.None instanceof Option; // true 40 | 41 | function incOrZero(o) { 42 | return o.cata({ 43 | Some: function(x) { 44 | return x + 1; 45 | }, 46 | None: function() { 47 | return 0; 48 | } 49 | }); 50 | } 51 | incOrZero(Option.Some(1)); // 2 52 | incOrZero(Option.None); // 0 53 | ``` 54 | -------------------------------------------------------------------------------- /node_modules/fantasy-identities/.npmignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | -------------------------------------------------------------------------------- /node_modules/fantasy-identities/identity.js: -------------------------------------------------------------------------------- 1 | var daggy = require('daggy'), 2 | Identity = daggy.tagged('x'); 3 | 4 | // Methods 5 | Identity.of = Identity; 6 | Identity.prototype.chain = function(f) { 7 | return f(this.x); 8 | }; 9 | 10 | // Derived 11 | Identity.prototype.map = function(f) { 12 | return this.chain(function(a) { 13 | return Identity.of(f(a)); 14 | }); 15 | }; 16 | Identity.prototype.ap = function(a) { 17 | return this.chain(function(f) { 18 | return a.map(f); 19 | }); 20 | }; 21 | 22 | // Export 23 | if(typeof module != 'undefined') 24 | module.exports = Identity; 25 | -------------------------------------------------------------------------------- /node_modules/folktale/CONTRIBUTORS: -------------------------------------------------------------------------------- 1 | - Quildreen Motta (http://robotlolita.me) 2 | - Dan Fockler (https://github.com/dfockler) 3 | - Brian Luft (https://github.com/unbracketed) 4 | - Kevin Deisz (https://github.com/kddeisz) 5 | - Brian Lonsdorf (https://github.com/DrBoolean) 6 | - Raine Virta (https://github.com/raine) 7 | - Hardy Jones (https://github.com/joneshf) 8 | - ven (https://github.com/vendethiel) 9 | - tpoole 10 | - Talon (https://github.com/LegitTalon) 11 | - Mika Väisänen (https://github.com/mvaisanen) 12 | - Brett (https://github.com/bberry6) 13 | - Kris Reeves (https://github.com/myndzi) 14 | - Tenor Biel (https://github.com/L8D) 15 | - Juan Soto (https://github.com/sotojuan) 16 | - Florian (https://github.com/floriansimon1) 17 | - Jordan Ryan Reuter (https://www.jreut.com) 18 | - Josh Miller (https://github.com/Josh-Miller) 19 | -------------------------------------------------------------------------------- /node_modules/folktale/adt/index.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | //---------------------------------------------------------------------- 4 | // 5 | // This source file is part of the Folktale project. 6 | // 7 | // Licensed under MIT. See LICENCE for full licence information. 8 | // See CONTRIBUTORS for the list of contributors to the project. 9 | // 10 | //---------------------------------------------------------------------- 11 | 12 | /*~ 13 | * stability: experimental 14 | * name: module folktale/adt 15 | */ 16 | module.exports = { 17 | union: require('./union') 18 | }; -------------------------------------------------------------------------------- /node_modules/folktale/adt/union/derivations/index.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | //---------------------------------------------------------------------- 4 | // 5 | // This source file is part of the Folktale project. 6 | // 7 | // Licensed under MIT. See LICENCE for full licence information. 8 | // See CONTRIBUTORS for the list of contributors to the project. 9 | // 10 | //---------------------------------------------------------------------- 11 | 12 | /*~ 13 | * stability: experimental 14 | * name: module folktale/adt/union/derivations 15 | */ 16 | module.exports = { 17 | serialization: require('./serialization'), 18 | equality: require('./equality'), 19 | debugRepresentation: require('./debug-representation') 20 | }; -------------------------------------------------------------------------------- /node_modules/folktale/adt/union/index.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | //---------------------------------------------------------------------- 4 | // 5 | // This source file is part of the Folktale project. 6 | // 7 | // Licensed under MIT. See LICENCE for full licence information. 8 | // See CONTRIBUTORS for the list of contributors to the project. 9 | // 10 | //---------------------------------------------------------------------- 11 | 12 | /*~ 13 | * stability: experimental 14 | * name: module folktale/adt/union 15 | */ 16 | module.exports = { 17 | union: require('./union'), 18 | derivations: require('./derivations') 19 | }; -------------------------------------------------------------------------------- /node_modules/folktale/annotated/helpers/assert-function.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | //---------------------------------------------------------------------- 4 | // 5 | // This source file is part of the Folktale project. 6 | // 7 | // Licensed under MIT. See LICENCE for full licence information. 8 | // See CONTRIBUTORS for the list of contributors to the project. 9 | // 10 | //---------------------------------------------------------------------- 11 | 12 | module.exports = function (method, transformation) { 13 | if (typeof transformation !== 'function') { 14 | throw new TypeError(method + ' expects a function, but was given ' + transformation + '.'); 15 | } 16 | }; -------------------------------------------------------------------------------- /node_modules/folktale/annotated/helpers/assert-object.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; 4 | 5 | //---------------------------------------------------------------------- 6 | // 7 | // This source file is part of the Folktale project. 8 | // 9 | // Licensed under MIT. See LICENCE for full licence information. 10 | // See CONTRIBUTORS for the list of contributors to the project. 11 | // 12 | //---------------------------------------------------------------------- 13 | 14 | module.exports = function (method, maybeObject) { 15 | if ((typeof maybeObject === 'undefined' ? 'undefined' : _typeof(maybeObject)) !== 'object') { 16 | throw new TypeError(method + ' expects an Object, but was given ' + maybeObject + '.'); 17 | } 18 | }; -------------------------------------------------------------------------------- /node_modules/folktale/annotated/helpers/copy-documentation.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | //---------------------------------------------------------------------- 4 | // 5 | // This source file is part of the Folktale project. 6 | // 7 | // Licensed under MIT. See LICENCE for full licence information. 8 | // See CONTRIBUTORS for the list of contributors to the project. 9 | // 10 | //---------------------------------------------------------------------- 11 | 12 | var mm = Symbol.for('@@meta:magical'); 13 | 14 | var copyDocumentation = function copyDocumentation(source, target) { 15 | var extensions = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; 16 | 17 | if (process.env.FOLKTALE_DOCS !== 'false') { 18 | target[mm] = Object.assign({}, source[mm] || {}, extensions); 19 | } 20 | }; 21 | 22 | module.exports = copyDocumentation; -------------------------------------------------------------------------------- /node_modules/folktale/annotated/helpers/defer.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | //---------------------------------------------------------------------- 4 | // 5 | // This source file is part of the Folktale project. 6 | // 7 | // Licensed under MIT. See LICENCE for full licence information. 8 | // See CONTRIBUTORS for the list of contributors to the project. 9 | // 10 | //---------------------------------------------------------------------- 11 | 12 | /* eslint-disable no-magic-numbers, max-statements-per-line */ 13 | var defer = typeof setImmediate !== 'undefined' ? function (f) { 14 | return setImmediate(f); 15 | } : typeof process !== 'undefined' ? function (f) { 16 | return process.nextTick(f); 17 | } : /* otherwise */function (f) { 18 | return setTimeout(f, 0); 19 | }; 20 | /* eslint-enable no-magic-numbers, max-statements-per-line */ 21 | 22 | module.exports = defer; -------------------------------------------------------------------------------- /node_modules/folktale/annotated/helpers/define-adt-methods.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | //---------------------------------------------------------------------- 4 | // 5 | // This source file is part of the Folktale project. 6 | // 7 | // Licensed under MIT. See LICENCE for full licence information. 8 | // See CONTRIBUTORS for the list of contributors to the project. 9 | // 10 | //---------------------------------------------------------------------- 11 | 12 | var copyDocs = require('./copy-documentation'); 13 | 14 | var defineAdtMethod = function defineAdtMethod(adt, definitions) { 15 | Object.keys(definitions).forEach(function (name) { 16 | var methods = definitions[name]; 17 | adt.variants.forEach(function (variant) { 18 | var method = methods[variant.tag]; 19 | if (!method) { 20 | throw new TypeError('Method ' + name + ' not defined for ' + variant.tag); 21 | } 22 | copyDocs(methods, method); 23 | variant.prototype[name] = method; 24 | }); 25 | }); 26 | }; 27 | 28 | module.exports = defineAdtMethod; -------------------------------------------------------------------------------- /node_modules/folktale/annotated/helpers/define.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | 3 | //---------------------------------------------------------------------- 4 | // 5 | // This source file is part of the Folktale project. 6 | // 7 | // Licensed under MIT. See LICENCE for full licence information. 8 | // See CONTRIBUTORS for the list of contributors to the project. 9 | // 10 | //---------------------------------------------------------------------- 11 | 12 | var defineProperty = Object.defineProperty; 13 | 14 | function define(object, name, value) { 15 | defineProperty(object, name, { 16 | value: value, 17 | writable: true, 18 | enumerable: false, 19 | configurable: true 20 | }); 21 | } 22 | 23 | module.exports = define; -------------------------------------------------------------------------------- /node_modules/folktale/annotated/helpers/fantasy-land.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | //---------------------------------------------------------------------- 4 | // 5 | // This source file is part of the Folktale project. 6 | // 7 | // Licensed under MIT. See LICENCE for full licence information. 8 | // See CONTRIBUTORS for the list of contributors to the project. 9 | // 10 | //---------------------------------------------------------------------- 11 | 12 | module.exports = { 13 | equals: 'fantasy-land/equals', 14 | concat: 'fantasy-land/concat', 15 | empty: 'fantasy-land/empty', 16 | map: 'fantasy-land/map', 17 | ap: 'fantasy-land/ap', 18 | of: 'fantasy-land/of', 19 | alt: 'fantasy-land/alt', 20 | reduce: 'fantasy-land/reduce', 21 | traverse: 'fantasy-land/traverse', 22 | chain: 'fantasy-land/chain', 23 | chainRec: 'fantasy-land/chainRec', 24 | extend: 'fantasy-land/extend', 25 | extract: 'fantasy-land/extract', 26 | bimap: 'fantasy-land/bimap', 27 | promap: 'fantasy-land/promap' 28 | }; -------------------------------------------------------------------------------- /node_modules/folktale/annotated/helpers/thunk.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | 3 | //---------------------------------------------------------------------- 4 | // 5 | // This source file is part of the Folktale project. 6 | // 7 | // Licensed under MIT. See LICENCE for full licence information. 8 | // See CONTRIBUTORS for the list of contributors to the project. 9 | // 10 | //---------------------------------------------------------------------- 11 | 12 | function thunk(fn) { 13 | var value = void 0; 14 | var computed = false; 15 | 16 | return function () { 17 | if (computed) { 18 | return value; 19 | } else { 20 | computed = true; 21 | value = fn(); 22 | return value; 23 | } 24 | }; 25 | } 26 | 27 | module.exports = thunk; -------------------------------------------------------------------------------- /node_modules/folktale/annotated/helpers/unsupported-method.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | 3 | //---------------------------------------------------------------------- 4 | // 5 | // This source file is part of the Folktale project. 6 | // 7 | // Licensed under MIT. See LICENCE for full licence information. 8 | // See CONTRIBUTORS for the list of contributors to the project. 9 | // 10 | //---------------------------------------------------------------------- 11 | 12 | module.exports = function (methodName) { 13 | return function (object) { 14 | throw new TypeError(object + " does not have a method '" + methodName + "'."); 15 | }; 16 | }; -------------------------------------------------------------------------------- /node_modules/folktale/annotated/helpers/warn-deprecated-method.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | //---------------------------------------------------------------------- 4 | // 5 | // This source file is part of the Folktale project. 6 | // 7 | // Licensed under MIT. See LICENCE for full licence information. 8 | // See CONTRIBUTORS for the list of contributors to the project. 9 | // 10 | //---------------------------------------------------------------------- 11 | 12 | var deprecated = require('./warn-deprecation'); 13 | 14 | module.exports = function (methodName) { 15 | return function (result) { 16 | deprecated('Type.' + methodName + '() is being deprecated in favour of Type[\'fantasy-land/' + methodName + '\'](). \n Your data structure is using the old-style fantasy-land methods,\n and these won\'t be supported in Folktale 3'); 17 | return result; 18 | }; 19 | }; -------------------------------------------------------------------------------- /node_modules/folktale/annotated/helpers/warn-deprecation.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | //---------------------------------------------------------------------- 4 | // 5 | // This source file is part of the Folktale project. 6 | // 7 | // Licensed under MIT. See LICENCE for full licence information. 8 | // See CONTRIBUTORS for the list of contributors to the project. 9 | // 10 | //---------------------------------------------------------------------- 11 | 12 | var BLAME_FUNCTION_INDEX = 3; // [current, parent, *error*, caller to blame, …] 13 | 14 | function warnDeprecation(reason) { 15 | // eslint-disable-line max-statements 16 | if (process.env.FOLKTALE_ASSERTIONS !== 'none') { 17 | var stack = new Error('').stack; 18 | var offender = void 0; 19 | if (stack) { 20 | var lines = stack.split('\n'); 21 | offender = lines[BLAME_FUNCTION_INDEX]; 22 | } 23 | 24 | if (offender) { 25 | console.warn(reason + '\n Blame: ' + offender.trim()); 26 | } else { 27 | console.warn(reason); 28 | } 29 | } 30 | } 31 | 32 | module.exports = warnDeprecation; -------------------------------------------------------------------------------- /node_modules/folktale/concurrency/future/index.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | //---------------------------------------------------------------------- 4 | // 5 | // This source file is part of the Folktale project. 6 | // 7 | // Licensed under MIT. See LICENCE for full licence information. 8 | // See CONTRIBUTORS for the list of contributors to the project. 9 | // 10 | //---------------------------------------------------------------------- 11 | 12 | var Future = require('./_future'); 13 | 14 | /*~ 15 | * stability: experimental 16 | * name: module folktale/concurrency/future 17 | */ 18 | module.exports = { 19 | of: Future.of, 20 | rejected: Future.rejected, 21 | fromPromise: Future.fromPromise, 22 | _Deferred: require('./_deferred'), 23 | _ExecutionState: require('./_execution-state'), 24 | _Future: Future 25 | }; -------------------------------------------------------------------------------- /node_modules/folktale/concurrency/index.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | //---------------------------------------------------------------------- 4 | // 5 | // This source file is part of the Folktale project. 6 | // 7 | // Licensed under MIT. See LICENCE for full licence information. 8 | // See CONTRIBUTORS for the list of contributors to the project. 9 | // 10 | //---------------------------------------------------------------------- 11 | 12 | 13 | /*~ 14 | * stability: experimental 15 | * name: module folktale/concurrency 16 | */ 17 | module.exports = { 18 | future: require('./future'), 19 | task: require('./task') 20 | }; -------------------------------------------------------------------------------- /node_modules/folktale/concurrency/task/task.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | //---------------------------------------------------------------------- 4 | // 5 | // This source file is part of the Folktale project. 6 | // 7 | // Licensed under MIT. See LICENCE for full licence information. 8 | // See CONTRIBUTORS for the list of contributors to the project. 9 | // 10 | //---------------------------------------------------------------------- 11 | 12 | var Task = require('./_task'); 13 | 14 | var noop = function noop() {}; 15 | 16 | /*~ 17 | * stability: experimental 18 | * type: | 19 | * forall value, reason: 20 | * ( 21 | * ({ 22 | * resolve: (value) => Void, 23 | * reject: (reason) => Void, 24 | * cancel: () => Void, 25 | * cleanup: (() => Void) => Void, 26 | * onCancelled: (() => Void) => Void, 27 | * get isCancelled: Boolean 28 | * }) => Void 29 | * ) => Task reason value 30 | */ 31 | var task = function task(computation) { 32 | return new Task(computation); 33 | }; 34 | 35 | module.exports = task; -------------------------------------------------------------------------------- /node_modules/folktale/concurrency/task/wait-any.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | //---------------------------------------------------------------------- 4 | // 5 | // This source file is part of the Folktale project. 6 | // 7 | // Licensed under MIT. See LICENCE for full licence information. 8 | // See CONTRIBUTORS for the list of contributors to the project. 9 | // 10 | //---------------------------------------------------------------------- 11 | 12 | 13 | /*~ 14 | * stability: experimental 15 | * type: | 16 | * forall v, e: ([Task e v Any]) => Task e v Any 17 | */ 18 | var waitAny = function waitAny(tasks) { 19 | if (tasks.length === 0) { 20 | throw new Error('Task.waitAny() requires a non-empty array of tasks.'); 21 | } 22 | 23 | return tasks.reduce(function (a, b) { 24 | return a.or(b); 25 | }); 26 | }; 27 | 28 | module.exports = waitAny; -------------------------------------------------------------------------------- /node_modules/folktale/conversions/future-to-promise.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | //---------------------------------------------------------------------- 4 | // 5 | // This source file is part of the Folktale project. 6 | // 7 | // Licensed under MIT. See LICENCE for full licence information. 8 | // See CONTRIBUTORS for the list of contributors to the project. 9 | // 10 | //---------------------------------------------------------------------- 11 | 12 | var _require = require('../concurrency/future/_execution-state'), 13 | Cancelled = _require.Cancelled; 14 | 15 | /*~ 16 | * stability: stable 17 | * type: | 18 | * forall e, v: 19 | * (Future e v) => Promise v e 20 | */ 21 | 22 | 23 | var futureToPromise = function futureToPromise(aFuture) { 24 | return new Promise(function (resolve, reject) { 25 | aFuture.listen({ 26 | onResolved: function onResolved(value) { 27 | return resolve(value); 28 | }, 29 | onRejected: function onRejected(error) { 30 | return reject(error); 31 | }, 32 | onCancelled: function onCancelled() { 33 | return reject(Cancelled()); 34 | } 35 | }); 36 | }); 37 | }; 38 | 39 | module.exports = futureToPromise; -------------------------------------------------------------------------------- /node_modules/folktale/conversions/index.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | //---------------------------------------------------------------------- 4 | // 5 | // This source file is part of the Folktale project. 6 | // 7 | // Licensed under MIT. See LICENCE for full licence information. 8 | // See CONTRIBUTORS for the list of contributors to the project. 9 | // 10 | //---------------------------------------------------------------------- 11 | 12 | /*~ 13 | * stability: stable 14 | * name: module folktale/conversions 15 | */ 16 | module.exports = { 17 | resultToValidation: require('./result-to-validation'), 18 | resultToMaybe: require('./result-to-maybe'), 19 | validationToResult: require('./validation-to-result'), 20 | validationToMaybe: require('./validation-to-maybe'), 21 | maybeToValidation: require('./maybe-to-validation'), 22 | maybeToResult: require('./maybe-to-result'), 23 | nullableToValidation: require('./nullable-to-validation'), 24 | nullableToResult: require('./nullable-to-result'), 25 | nullableToMaybe: require('./nullable-to-maybe'), 26 | nodebackToTask: require('./nodeback-to-task'), 27 | futureToPromise: require('./future-to-promise'), 28 | promiseToFuture: require('./promise-to-future'), 29 | promisedToTask: require('./promised-to-task') 30 | }; -------------------------------------------------------------------------------- /node_modules/folktale/conversions/maybe-to-result.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | //---------------------------------------------------------------------- 4 | // 5 | // This source file is part of the Folktale project. 6 | // 7 | // Licensed under MIT. See LICENCE for full licence information. 8 | // See CONTRIBUTORS for the list of contributors to the project. 9 | // 10 | //---------------------------------------------------------------------- 11 | 12 | var _require = require('../result/result'), 13 | Error = _require.Error, 14 | Ok = _require.Ok; 15 | 16 | /*~ 17 | * stability: stable 18 | * authors: 19 | * - "@boris-marinov" 20 | * 21 | * type: | 22 | * forall a, b: 23 | * (Maybe a, b) => Result b a 24 | */ 25 | 26 | 27 | var maybeToResult = function maybeToResult(aMaybe, failureValue) { 28 | return aMaybe.matchWith({ 29 | Nothing: function Nothing() { 30 | return Error(failureValue); 31 | }, 32 | Just: function Just(_ref) { 33 | var value = _ref.value; 34 | return Ok(value); 35 | } 36 | }); 37 | }; 38 | 39 | module.exports = maybeToResult; -------------------------------------------------------------------------------- /node_modules/folktale/conversions/maybe-to-validation.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | //---------------------------------------------------------------------- 4 | // 5 | // This source file is part of the Folktale project. 6 | // 7 | // Licensed under MIT. See LICENCE for full licence information. 8 | // See CONTRIBUTORS for the list of contributors to the project. 9 | // 10 | //---------------------------------------------------------------------- 11 | 12 | var _require = require('../validation/validation'), 13 | Success = _require.Success, 14 | Failure = _require.Failure; 15 | 16 | /*~ 17 | * stability: stable 18 | * authors: 19 | * - "@boris-marinov" 20 | * 21 | * type: | 22 | * forall a, b: 23 | * (Maybe a, b) => Validation b a 24 | */ 25 | 26 | 27 | var maybeToValidation = function maybeToValidation(aMaybe, failureValue) { 28 | return aMaybe.matchWith({ 29 | Nothing: function Nothing() { 30 | return Failure(failureValue); 31 | }, 32 | Just: function Just(_ref) { 33 | var value = _ref.value; 34 | return Success(value); 35 | } 36 | }); 37 | }; 38 | 39 | module.exports = maybeToValidation; -------------------------------------------------------------------------------- /node_modules/folktale/conversions/nullable-to-maybe.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | //---------------------------------------------------------------------- 4 | // 5 | // This source file is part of the Folktale project. 6 | // 7 | // Licensed under MIT. See LICENCE for full licence information. 8 | // See CONTRIBUTORS for the list of contributors to the project. 9 | // 10 | //---------------------------------------------------------------------- 11 | 12 | var _require = require('../maybe/maybe'), 13 | Nothing = _require.Nothing, 14 | Just = _require.Just; 15 | 16 | /*~ 17 | * stability: stable 18 | * authors: 19 | * - Quildreen Motta 20 | * 21 | * type: | 22 | * forall a: 23 | * (a or None) => Maybe a 24 | */ 25 | 26 | 27 | var nullableToMaybe = function nullableToMaybe(a) { 28 | return a != null ? Just(a) : /*else*/Nothing(); 29 | }; 30 | 31 | module.exports = nullableToMaybe; -------------------------------------------------------------------------------- /node_modules/folktale/conversions/nullable-to-validation.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | //---------------------------------------------------------------------- 4 | // 5 | // This source file is part of the Folktale project. 6 | // 7 | // Licensed under MIT. See LICENCE for full licence information. 8 | // See CONTRIBUTORS for the list of contributors to the project. 9 | // 10 | //---------------------------------------------------------------------- 11 | 12 | var _require = require('../validation/validation'), 13 | Success = _require.Success, 14 | Failure = _require.Failure; 15 | 16 | /*~ 17 | * stability: stable 18 | * authors: 19 | * - "@boris-marinov" 20 | * 21 | * type: | 22 | * forall a, b: 23 | * (a or None, b) => Validation b a 24 | */ 25 | 26 | 27 | var nullableToValidation = function nullableToValidation(a, fallbackValue) { 28 | return a != null ? Success(a) : /*else*/Failure(fallbackValue); 29 | }; 30 | 31 | module.exports = nullableToValidation; -------------------------------------------------------------------------------- /node_modules/folktale/conversions/promise-to-future.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | //---------------------------------------------------------------------- 4 | // 5 | // This source file is part of the Folktale project. 6 | // 7 | // Licensed under MIT. See LICENCE for full licence information. 8 | // See CONTRIBUTORS for the list of contributors to the project. 9 | // 10 | //---------------------------------------------------------------------- 11 | 12 | var _require = require('../concurrency/future/_execution-state'), 13 | Cancelled = _require.Cancelled; 14 | 15 | var Deferred = require('../concurrency/future/_deferred'); 16 | 17 | /*~ 18 | * stability: stable 19 | * type: | 20 | * forall e, v: 21 | * (Promise v e) => Future e v 22 | */ 23 | var promiseToFuture = function promiseToFuture(aPromise) { 24 | var deferred = new Deferred(); 25 | aPromise.then(function (value) { 26 | return deferred.resolve(value); 27 | }, function (error) { 28 | if (Cancelled.hasInstance(error)) { 29 | deferred.cancel(); 30 | } else { 31 | deferred.reject(error); 32 | } 33 | }); 34 | return deferred.future(); 35 | }; 36 | 37 | module.exports = promiseToFuture; -------------------------------------------------------------------------------- /node_modules/folktale/conversions/result-to-maybe.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | //---------------------------------------------------------------------- 4 | // 5 | // This source file is part of the Folktale project. 6 | // 7 | // Licensed under MIT. See LICENCE for full licence information. 8 | // See CONTRIBUTORS for the list of contributors to the project. 9 | // 10 | //---------------------------------------------------------------------- 11 | 12 | var _require = require('../maybe/maybe'), 13 | Just = _require.Just, 14 | Nothing = _require.Nothing; 15 | 16 | /*~ 17 | * stability: stable 18 | * authors: 19 | * - "@boris-marinov" 20 | * 21 | * type: | 22 | * forall a, b: 23 | * (Result a b) => Maybe b 24 | */ 25 | 26 | 27 | var resultToMaybe = function resultToMaybe(aResult) { 28 | return aResult.matchWith({ 29 | Error: function Error(_ref) { 30 | var _ = _ref.value; 31 | return Nothing(); 32 | }, 33 | Ok: function Ok(_ref2) { 34 | var value = _ref2.value; 35 | return Just(value); 36 | } 37 | }); 38 | }; 39 | 40 | module.exports = resultToMaybe; -------------------------------------------------------------------------------- /node_modules/folktale/conversions/result-to-validation.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | //---------------------------------------------------------------------- 4 | // 5 | // This source file is part of the Folktale project. 6 | // 7 | // Licensed under MIT. See LICENCE for full licence information. 8 | // See CONTRIBUTORS for the list of contributors to the project. 9 | // 10 | //---------------------------------------------------------------------- 11 | 12 | var _require = require('../validation/validation'), 13 | Success = _require.Success, 14 | Failure = _require.Failure; 15 | 16 | /*~ 17 | * stability: stable 18 | * authors: 19 | * - "@boris-marinov" 20 | * 21 | * type: | 22 | * forall a, b: 23 | * (Result a b) => Validation a b 24 | */ 25 | 26 | 27 | var resultToValidation = function resultToValidation(aResult) { 28 | return aResult.matchWith({ 29 | Error: function Error(_ref) { 30 | var value = _ref.value; 31 | return Failure(value); 32 | }, 33 | Ok: function Ok(_ref2) { 34 | var value = _ref2.value; 35 | return Success(value); 36 | } 37 | }); 38 | }; 39 | 40 | module.exports = resultToValidation; -------------------------------------------------------------------------------- /node_modules/folktale/conversions/validation-to-maybe.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | //---------------------------------------------------------------------- 4 | // 5 | // This source file is part of the Folktale project. 6 | // 7 | // Licensed under MIT. See LICENCE for full licence information. 8 | // See CONTRIBUTORS for the list of contributors to the project. 9 | // 10 | //---------------------------------------------------------------------- 11 | 12 | var _require = require('../maybe/maybe'), 13 | Just = _require.Just, 14 | Nothing = _require.Nothing; 15 | 16 | /*~ 17 | * stability: stable 18 | * authors: 19 | * - "@boris-marinov" 20 | * 21 | * type: | 22 | * forall a, b: 23 | * (Validation a b) => Maybe b 24 | */ 25 | 26 | 27 | var validationToMaybe = function validationToMaybe(aValidation) { 28 | return aValidation.matchWith({ 29 | Failure: function Failure() { 30 | return Nothing(); 31 | }, 32 | Success: function Success(_ref) { 33 | var value = _ref.value; 34 | return Just(value); 35 | } 36 | }); 37 | }; 38 | 39 | module.exports = validationToMaybe; -------------------------------------------------------------------------------- /node_modules/folktale/conversions/validation-to-result.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | //---------------------------------------------------------------------- 4 | // 5 | // This source file is part of the Folktale project. 6 | // 7 | // Licensed under MIT. See LICENCE for full licence information. 8 | // See CONTRIBUTORS for the list of contributors to the project. 9 | // 10 | //---------------------------------------------------------------------- 11 | 12 | var _require = require('../result/result'), 13 | Error = _require.Error, 14 | Ok = _require.Ok; 15 | 16 | /*~ 17 | * stability: stable 18 | * authors: 19 | * - "@boris-marinov" 20 | * 21 | * type: | 22 | * forall a, b: 23 | * (Validation a b) => Result a b 24 | */ 25 | 26 | 27 | var validationToResult = function validationToResult(aValidation) { 28 | return aValidation.matchWith({ 29 | Failure: function Failure(_ref) { 30 | var value = _ref.value; 31 | return Error(value); 32 | }, 33 | Success: function Success(_ref2) { 34 | var value = _ref2.value; 35 | return Ok(value); 36 | } 37 | }); 38 | }; 39 | 40 | module.exports = validationToResult; -------------------------------------------------------------------------------- /node_modules/folktale/core/index.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | //---------------------------------------------------------------------- 4 | // 5 | // This source file is part of the Folktale project. 6 | // 7 | // Licensed under MIT. See LICENCE for full licence information. 8 | // See CONTRIBUTORS for the list of contributors to the project. 9 | // 10 | //---------------------------------------------------------------------- 11 | 12 | /*~ 13 | * stability: stable 14 | * name: module folktale/core 15 | */ 16 | module.exports = { 17 | lambda: require('./lambda'), 18 | object: require('./object') 19 | }; -------------------------------------------------------------------------------- /node_modules/folktale/core/lambda/constant.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | 3 | //---------------------------------------------------------------------- 4 | // 5 | // This source file is part of the Folktale project. 6 | // 7 | // Licensed under MIT. See LICENCE for full licence information. 8 | // See CONTRIBUTORS for the list of contributors to the project. 9 | // 10 | //---------------------------------------------------------------------- 11 | 12 | /*~ 13 | * stability: stable 14 | * authors: 15 | * - Quildreen Motta 16 | * 17 | * type: | 18 | * ('a) => ('b) => 'a 19 | */ 20 | var constant = function constant(value) { 21 | return function (_) { 22 | return value; 23 | }; 24 | }; 25 | 26 | // --[ Exports ]------------------------------------------------------- 27 | module.exports = constant; -------------------------------------------------------------------------------- /node_modules/folktale/core/lambda/identity.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | 3 | //---------------------------------------------------------------------- 4 | // 5 | // This source file is part of the Folktale project. 6 | // 7 | // Licensed under MIT. See LICENCE for full licence information. 8 | // See CONTRIBUTORS for the list of contributors to the project. 9 | // 10 | //---------------------------------------------------------------------- 11 | 12 | /*~ 13 | * stability: stable 14 | * authors: 15 | * - Quildreen Motta 16 | * 17 | * type: | 18 | * ('a) => 'a 19 | */ 20 | var identity = function identity(value) { 21 | return value; 22 | }; 23 | 24 | // --[ Exports ]------------------------------------------------------- 25 | module.exports = identity; -------------------------------------------------------------------------------- /node_modules/folktale/core/lambda/index.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | //---------------------------------------------------------------------- 4 | // 5 | // This source file is part of the Folktale project. 6 | // 7 | // Licensed under MIT. See LICENCE for full licence information. 8 | // See CONTRIBUTORS for the list of contributors to the project. 9 | // 10 | //---------------------------------------------------------------------- 11 | 12 | /*~ 13 | * stability: stable 14 | * name: module folktale/core/lambda 15 | */ 16 | module.exports = { 17 | identity: require('./identity'), 18 | constant: require('./constant'), 19 | curry: require('./curry'), 20 | compose: require('./compose'), 21 | partialize: require('./partialize') 22 | }; -------------------------------------------------------------------------------- /node_modules/folktale/core/object/index.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | //---------------------------------------------------------------------- 4 | // 5 | // This source file is part of the Folktale project. 6 | // 7 | // Licensed under MIT. See LICENCE for full licence information. 8 | // See CONTRIBUTORS for the list of contributors to the project. 9 | // 10 | //---------------------------------------------------------------------- 11 | 12 | /*~ 13 | * stability: stable 14 | * name: module folktale/core/object 15 | */ 16 | module.exports = { 17 | mapEntries: require('./map-entries'), 18 | mapValues: require('./map-values'), 19 | values: require('./values'), 20 | toPairs: require('./to-pairs'), 21 | fromPairs: require('./from-pairs') 22 | }; -------------------------------------------------------------------------------- /node_modules/folktale/core/object/to-pairs.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | 3 | //---------------------------------------------------------------------- 4 | // 5 | // This source file is part of the Folktale project. 6 | // 7 | // Licensed under MIT. See LICENCE for full licence information. 8 | // See CONTRIBUTORS for the list of contributors to the project. 9 | // 10 | //---------------------------------------------------------------------- 11 | 12 | 13 | /*~ 14 | * stability : stable 15 | * authors: 16 | * - Quildreen Motta 17 | * 18 | * complexity : O(n), n is the number of own enumerable properties 19 | * type: | 20 | * (Object 'a) => Array (String or Symbol, 'a) 21 | */ 22 | var toPairs = function toPairs(object) { 23 | return Object.keys(object).map(function (k) { 24 | return [k, object[k]]; 25 | }); 26 | }; 27 | 28 | // --[ Exports ]------------------------------------------------------- 29 | module.exports = toPairs; -------------------------------------------------------------------------------- /node_modules/folktale/core/object/values.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | 3 | //---------------------------------------------------------------------- 4 | // 5 | // This source file is part of the Folktale project. 6 | // 7 | // Licensed under MIT. See LICENCE for full licence information. 8 | // See CONTRIBUTORS for the list of contributors to the project. 9 | // 10 | //---------------------------------------------------------------------- 11 | 12 | /*~ 13 | * stability : stable 14 | * authors: 15 | * - Quildreen Motta 16 | * 17 | * complexity : O(n), n is the number of own enumerable properties. 18 | * type: | 19 | * (Object 'a) => Array 'a 20 | */ 21 | var values = function values(object) { 22 | return Object.keys(object).map(function (k) { 23 | return object[k]; 24 | }); 25 | }; 26 | 27 | // --[ Exports ]------------------------------------------------------- 28 | module.exports = values; -------------------------------------------------------------------------------- /node_modules/folktale/fantasy-land/curried.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | //---------------------------------------------------------------------- 4 | // 5 | // This source file is part of the Folktale project. 6 | // 7 | // Licensed under MIT. See LICENCE for full licence information. 8 | // See CONTRIBUTORS for the list of contributors to the project. 9 | // 10 | //---------------------------------------------------------------------- 11 | 12 | 13 | /*~ 14 | * stability: stable 15 | * name: module folktale/fantasy-land/curried 16 | */ 17 | module.exports = { 18 | apply: require('./apply').curried, 19 | bimap: require('./bimap').curried, 20 | chain: require('./chain').curried, 21 | concat: require('./concat').curried, 22 | empty: require('./empty').curried, 23 | equals: require('./equals').curried, 24 | map: require('./map').curried, 25 | of: require('./of').curried 26 | }; -------------------------------------------------------------------------------- /node_modules/folktale/fantasy-land/index.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | //---------------------------------------------------------------------- 4 | // 5 | // This source file is part of the Folktale project. 6 | // 7 | // Licensed under MIT. See LICENCE for full licence information. 8 | // See CONTRIBUTORS for the list of contributors to the project. 9 | // 10 | //---------------------------------------------------------------------- 11 | 12 | /*~ 13 | * stability: stable 14 | * name: module folktale/fantasy-land 15 | */ 16 | module.exports = { 17 | apply: require('./apply'), 18 | concat: require('./concat'), 19 | chain: require('./chain'), 20 | empty: require('./empty'), 21 | map: require('./map'), 22 | of: require('./of'), 23 | equals: require('./equals'), 24 | bimap: require('./bimap'), 25 | curried: require('./curried'), 26 | infix: require('./infix'), 27 | alt: require('./alt') 28 | }; -------------------------------------------------------------------------------- /node_modules/folktale/fantasy-land/infix.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | //---------------------------------------------------------------------- 4 | // 5 | // This source file is part of the Folktale project. 6 | // 7 | // Licensed under MIT. See LICENCE for full licence information. 8 | // See CONTRIBUTORS for the list of contributors to the project. 9 | // 10 | //---------------------------------------------------------------------- 11 | 12 | 13 | /*~ 14 | * stability: experimental 15 | * name: module folktale/fantasy-land/infix 16 | */ 17 | module.exports = { 18 | apply: require('./apply').infix, 19 | bimap: require('./bimap').infix, 20 | chain: require('./chain').infix, 21 | concat: require('./concat').infix, 22 | empty: require('./empty').infix, 23 | equals: require('./equals').infix, 24 | map: require('./map').infix, 25 | of: require('./of').infix 26 | }; -------------------------------------------------------------------------------- /node_modules/folktale/helpers/assert-function.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | //---------------------------------------------------------------------- 4 | // 5 | // This source file is part of the Folktale project. 6 | // 7 | // Licensed under MIT. See LICENCE for full licence information. 8 | // See CONTRIBUTORS for the list of contributors to the project. 9 | // 10 | //---------------------------------------------------------------------- 11 | 12 | module.exports = function (method, transformation) { 13 | if (typeof transformation !== 'function') { 14 | throw new TypeError(method + ' expects a function, but was given ' + transformation + '.'); 15 | } 16 | }; -------------------------------------------------------------------------------- /node_modules/folktale/helpers/assert-object.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; 4 | 5 | //---------------------------------------------------------------------- 6 | // 7 | // This source file is part of the Folktale project. 8 | // 9 | // Licensed under MIT. See LICENCE for full licence information. 10 | // See CONTRIBUTORS for the list of contributors to the project. 11 | // 12 | //---------------------------------------------------------------------- 13 | 14 | module.exports = function (method, maybeObject) { 15 | if ((typeof maybeObject === 'undefined' ? 'undefined' : _typeof(maybeObject)) !== 'object') { 16 | throw new TypeError(method + ' expects an Object, but was given ' + maybeObject + '.'); 17 | } 18 | }; -------------------------------------------------------------------------------- /node_modules/folktale/helpers/copy-documentation.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | //---------------------------------------------------------------------- 4 | // 5 | // This source file is part of the Folktale project. 6 | // 7 | // Licensed under MIT. See LICENCE for full licence information. 8 | // See CONTRIBUTORS for the list of contributors to the project. 9 | // 10 | //---------------------------------------------------------------------- 11 | 12 | var mm = Symbol.for('@@meta:magical'); 13 | 14 | var copyDocumentation = function copyDocumentation(source, target) { 15 | var extensions = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; 16 | 17 | if (process.env.FOLKTALE_DOCS !== 'false') { 18 | target[mm] = Object.assign({}, source[mm] || {}, extensions); 19 | } 20 | }; 21 | 22 | module.exports = copyDocumentation; -------------------------------------------------------------------------------- /node_modules/folktale/helpers/defer.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | //---------------------------------------------------------------------- 4 | // 5 | // This source file is part of the Folktale project. 6 | // 7 | // Licensed under MIT. See LICENCE for full licence information. 8 | // See CONTRIBUTORS for the list of contributors to the project. 9 | // 10 | //---------------------------------------------------------------------- 11 | 12 | /* eslint-disable no-magic-numbers, max-statements-per-line */ 13 | var defer = typeof setImmediate !== 'undefined' ? function (f) { 14 | return setImmediate(f); 15 | } : typeof process !== 'undefined' ? function (f) { 16 | return process.nextTick(f); 17 | } : /* otherwise */function (f) { 18 | return setTimeout(f, 0); 19 | }; 20 | /* eslint-enable no-magic-numbers, max-statements-per-line */ 21 | 22 | module.exports = defer; -------------------------------------------------------------------------------- /node_modules/folktale/helpers/define-adt-methods.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | //---------------------------------------------------------------------- 4 | // 5 | // This source file is part of the Folktale project. 6 | // 7 | // Licensed under MIT. See LICENCE for full licence information. 8 | // See CONTRIBUTORS for the list of contributors to the project. 9 | // 10 | //---------------------------------------------------------------------- 11 | 12 | var copyDocs = require('./copy-documentation'); 13 | 14 | var defineAdtMethod = function defineAdtMethod(adt, definitions) { 15 | Object.keys(definitions).forEach(function (name) { 16 | var methods = definitions[name]; 17 | adt.variants.forEach(function (variant) { 18 | var method = methods[variant.tag]; 19 | if (!method) { 20 | throw new TypeError('Method ' + name + ' not defined for ' + variant.tag); 21 | } 22 | copyDocs(methods, method); 23 | variant.prototype[name] = method; 24 | }); 25 | }); 26 | }; 27 | 28 | module.exports = defineAdtMethod; -------------------------------------------------------------------------------- /node_modules/folktale/helpers/define.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | 3 | //---------------------------------------------------------------------- 4 | // 5 | // This source file is part of the Folktale project. 6 | // 7 | // Licensed under MIT. See LICENCE for full licence information. 8 | // See CONTRIBUTORS for the list of contributors to the project. 9 | // 10 | //---------------------------------------------------------------------- 11 | 12 | var defineProperty = Object.defineProperty; 13 | 14 | function define(object, name, value) { 15 | defineProperty(object, name, { 16 | value: value, 17 | writable: true, 18 | enumerable: false, 19 | configurable: true 20 | }); 21 | } 22 | 23 | module.exports = define; -------------------------------------------------------------------------------- /node_modules/folktale/helpers/fantasy-land.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | //---------------------------------------------------------------------- 4 | // 5 | // This source file is part of the Folktale project. 6 | // 7 | // Licensed under MIT. See LICENCE for full licence information. 8 | // See CONTRIBUTORS for the list of contributors to the project. 9 | // 10 | //---------------------------------------------------------------------- 11 | 12 | module.exports = { 13 | equals: 'fantasy-land/equals', 14 | concat: 'fantasy-land/concat', 15 | empty: 'fantasy-land/empty', 16 | map: 'fantasy-land/map', 17 | ap: 'fantasy-land/ap', 18 | of: 'fantasy-land/of', 19 | alt: 'fantasy-land/alt', 20 | reduce: 'fantasy-land/reduce', 21 | traverse: 'fantasy-land/traverse', 22 | chain: 'fantasy-land/chain', 23 | chainRec: 'fantasy-land/chainRec', 24 | extend: 'fantasy-land/extend', 25 | extract: 'fantasy-land/extract', 26 | bimap: 'fantasy-land/bimap', 27 | promap: 'fantasy-land/promap' 28 | }; -------------------------------------------------------------------------------- /node_modules/folktale/helpers/thunk.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | 3 | //---------------------------------------------------------------------- 4 | // 5 | // This source file is part of the Folktale project. 6 | // 7 | // Licensed under MIT. See LICENCE for full licence information. 8 | // See CONTRIBUTORS for the list of contributors to the project. 9 | // 10 | //---------------------------------------------------------------------- 11 | 12 | function thunk(fn) { 13 | var value = void 0; 14 | var computed = false; 15 | 16 | return function () { 17 | if (computed) { 18 | return value; 19 | } else { 20 | computed = true; 21 | value = fn(); 22 | return value; 23 | } 24 | }; 25 | } 26 | 27 | module.exports = thunk; -------------------------------------------------------------------------------- /node_modules/folktale/helpers/unsupported-method.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | 3 | //---------------------------------------------------------------------- 4 | // 5 | // This source file is part of the Folktale project. 6 | // 7 | // Licensed under MIT. See LICENCE for full licence information. 8 | // See CONTRIBUTORS for the list of contributors to the project. 9 | // 10 | //---------------------------------------------------------------------- 11 | 12 | module.exports = function (methodName) { 13 | return function (object) { 14 | throw new TypeError(object + " does not have a method '" + methodName + "'."); 15 | }; 16 | }; -------------------------------------------------------------------------------- /node_modules/folktale/helpers/warn-deprecated-method.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | //---------------------------------------------------------------------- 4 | // 5 | // This source file is part of the Folktale project. 6 | // 7 | // Licensed under MIT. See LICENCE for full licence information. 8 | // See CONTRIBUTORS for the list of contributors to the project. 9 | // 10 | //---------------------------------------------------------------------- 11 | 12 | var deprecated = require('./warn-deprecation'); 13 | 14 | module.exports = function (methodName) { 15 | return function (result) { 16 | deprecated('Type.' + methodName + '() is being deprecated in favour of Type[\'fantasy-land/' + methodName + '\'](). \n Your data structure is using the old-style fantasy-land methods,\n and these won\'t be supported in Folktale 3'); 17 | return result; 18 | }; 19 | }; -------------------------------------------------------------------------------- /node_modules/folktale/helpers/warn-deprecation.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | //---------------------------------------------------------------------- 4 | // 5 | // This source file is part of the Folktale project. 6 | // 7 | // Licensed under MIT. See LICENCE for full licence information. 8 | // See CONTRIBUTORS for the list of contributors to the project. 9 | // 10 | //---------------------------------------------------------------------- 11 | 12 | var BLAME_FUNCTION_INDEX = 3; // [current, parent, *error*, caller to blame, …] 13 | 14 | function warnDeprecation(reason) { 15 | // eslint-disable-line max-statements 16 | if (process.env.FOLKTALE_ASSERTIONS !== 'none') { 17 | var stack = new Error('').stack; 18 | var offender = void 0; 19 | if (stack) { 20 | var lines = stack.split('\n'); 21 | offender = lines[BLAME_FUNCTION_INDEX]; 22 | } 23 | 24 | if (offender) { 25 | console.warn(reason + '\n Blame: ' + offender.trim()); 26 | } else { 27 | console.warn(reason); 28 | } 29 | } 30 | } 31 | 32 | module.exports = warnDeprecation; -------------------------------------------------------------------------------- /node_modules/folktale/index.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | //---------------------------------------------------------------------- 4 | // 5 | // This source file is part of the Folktale project. 6 | // 7 | // Licensed under MIT. See LICENCE for full licence information. 8 | // See CONTRIBUTORS for the list of contributors to the project. 9 | // 10 | //---------------------------------------------------------------------- 11 | 12 | /*~ 13 | * stability: stable 14 | * name: module folktale 15 | */ 16 | module.exports = { 17 | adt: require('./adt'), 18 | concurrency: require('./concurrency'), 19 | conversions: require('./conversions'), 20 | core: require('./core'), 21 | fantasyLand: require('./fantasy-land'), 22 | maybe: require('./maybe'), 23 | result: require('./result'), 24 | validation: require('./validation') 25 | }; -------------------------------------------------------------------------------- /node_modules/folktale/result/try.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | //---------------------------------------------------------------------- 4 | // 5 | // This source file is part of the Folktale project. 6 | // 7 | // Licensed under MIT. See LICENCE for full licence information. 8 | // See CONTRIBUTORS for the list of contributors to the project. 9 | // 10 | //---------------------------------------------------------------------- 11 | 12 | var _require = require('./result'), 13 | Error = _require.Error, 14 | Ok = _require.Ok; 15 | 16 | /*~ 17 | * stability: stable 18 | * authors: 19 | * - "@boris-marinov" 20 | * 21 | * type: | 22 | * forall a, b: (() => b :: throws a) => Result a b 23 | */ 24 | 25 | 26 | var _try = function _try(f) { 27 | try { 28 | return Ok(f()); 29 | } catch (e) { 30 | return Error(e); 31 | } 32 | }; 33 | 34 | module.exports = _try; -------------------------------------------------------------------------------- /node_modules/folktale/validation/chain.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | //---------------------------------------------------------------------- 4 | // 5 | // This source file is part of the Folktale project. 6 | // 7 | // Licensed under MIT. See LICENCE for full licence information. 8 | // See CONTRIBUTORS for the list of contributors to the project. 9 | // 10 | //---------------------------------------------------------------------- 11 | 12 | var _require = require('./validation'), 13 | _Failure = _require.Failure; 14 | 15 | /*~ 16 | * stability: stable 17 | * type: | 18 | * forall a, b, c: (Validation a b, (b) => Validation a c) => Validation a c 19 | */ 20 | 21 | 22 | var chain = function chain(validation, fn) { 23 | return validation.matchWith({ 24 | Success: function Success(_ref) { 25 | var value = _ref.value; 26 | return fn(value); 27 | }, 28 | Failure: function Failure(_ref2) { 29 | var value = _ref2.value; 30 | return _Failure(value); 31 | } 32 | }); 33 | }; 34 | 35 | module.exports = chain; -------------------------------------------------------------------------------- /node_modules/folktale/validation/collect.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | //---------------------------------------------------------------------- 4 | // 5 | // This source file is part of the Folktale project. 6 | // 7 | // Licensed under MIT. See LICENCE for full licence information. 8 | // See CONTRIBUTORS for the list of contributors to the project. 9 | // 10 | //---------------------------------------------------------------------- 11 | 12 | 13 | var _require = require('./validation'), 14 | Success = _require.Success; 15 | 16 | /*~ 17 | * stability: stable 18 | * type: | 19 | * forall a, b: (Array (Validation a b)) => Validation a b 20 | * where a is Semigroup 21 | */ 22 | 23 | 24 | var collect = function collect(validations) { 25 | return validations.reduce(function (a, b) { 26 | return a.concat(b); 27 | }, Success()); 28 | }; 29 | 30 | module.exports = collect; -------------------------------------------------------------------------------- /node_modules/fs.realpath/README.md: -------------------------------------------------------------------------------- 1 | # fs.realpath 2 | 3 | A backwards-compatible fs.realpath for Node v6 and above 4 | 5 | In Node v6, the JavaScript implementation of fs.realpath was replaced 6 | with a faster (but less resilient) native implementation. That raises 7 | new and platform-specific errors and cannot handle long or excessively 8 | symlink-looping paths. 9 | 10 | This module handles those cases by detecting the new errors and 11 | falling back to the JavaScript implementation. On versions of Node 12 | prior to v6, it has no effect. 13 | 14 | ## USAGE 15 | 16 | ```js 17 | var rp = require('fs.realpath') 18 | 19 | // async version 20 | rp.realpath(someLongAndLoopingPath, function (er, real) { 21 | // the ELOOP was handled, but it was a bit slower 22 | }) 23 | 24 | // sync version 25 | var real = rp.realpathSync(someLongAndLoopingPath) 26 | 27 | // monkeypatch at your own risk! 28 | // This replaces the fs.realpath/fs.realpathSync builtins 29 | rp.monkeypatch() 30 | 31 | // un-do the monkeypatching 32 | rp.unmonkeypatch() 33 | ``` 34 | -------------------------------------------------------------------------------- /node_modules/gitbook-plugin-expandable-chapters/.npmignore: -------------------------------------------------------------------------------- 1 | /npm-debug.log 2 | -------------------------------------------------------------------------------- /node_modules/gitbook-plugin-expandable-chapters/.project: -------------------------------------------------------------------------------- 1 | 2 | 3 | gitbook-plugin-expandable-chapters 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /node_modules/gitbook-plugin-expandable-chapters/README.md: -------------------------------------------------------------------------------- 1 | #Expandable chapters for GitBook 2 | ============== 3 | 4 | This plugin adds an icon to each chapter, that has a child and css states for the child list to collapse/expand ones. 5 | 6 | ### How to use it? 7 | 8 | Add it to your `book.json` configuration: 9 | 10 | ``` 11 | { 12 | plugins: ["expandable-chapters"] 13 | } 14 | ``` 15 | 16 | Install your plugins using: 17 | 18 | ``` 19 | $ gitbook install 20 | ``` 21 | 22 | ### Configuration 23 | 24 | There is no configuration needed at the moment, can be left empty. 25 | 26 | ``` 27 | { 28 | "pluginsConfig": { 29 | "expandable-chapters":{} 30 | } 31 | } 32 | ``` 33 | 34 | ### See also 35 | Maybe you will find https://github.com/poojan/gitbook-plugin-toggle-chapters also useful? 36 | -------------------------------------------------------------------------------- /node_modules/gitbook-plugin-expandable-chapters/book/expandable-chapters.css: -------------------------------------------------------------------------------- 1 | .book .book-summary .chapter > .articles { 2 | overflow: hidden; 3 | max-height: 0px; 4 | } 5 | 6 | .book .book-summary .chapter.expanded > .articles { 7 | max-height: 9999px; 8 | } 9 | 10 | .book .book-summary .exc-trigger { 11 | position: absolute; 12 | left: 12px; 13 | top: 12px; 14 | } 15 | 16 | .book .book-summary ul.summary li a, 17 | .book .book-summary ul.summary li span { 18 | padding-left: 30px; 19 | cursor: pointer; 20 | } 21 | 22 | .book .book-summary .exc-trigger:before { 23 | content: "\f054"; 24 | } 25 | 26 | .book .book-summary .expanded > a .exc-trigger:before, 27 | .book .book-summary .expanded > span .exc-trigger:before { 28 | content: "\f078"; 29 | } 30 | -------------------------------------------------------------------------------- /node_modules/gitbook-plugin-expandable-chapters/index.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | // Extend website resources and html 3 | website: { 4 | assets: "./book", 5 | js: [ 6 | "expandable-chapters.js" 7 | ], 8 | css: [ 9 | "expandable-chapters.css" 10 | ] 11 | } 12 | }; -------------------------------------------------------------------------------- /node_modules/gitbook-plugin-splitter/LICENSE.txt: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2015 yoshidax 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in 13 | all copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 21 | THE SOFTWARE. 22 | -------------------------------------------------------------------------------- /node_modules/gitbook-plugin-splitter/book/splitter.css: -------------------------------------------------------------------------------- 1 | .divider-content-summary { 2 | position: absolute; 3 | top: 0; 4 | right: 0; 5 | height: 100%; 6 | width: 5px; 7 | display: table; 8 | cursor: col-resize; 9 | color: #ccc; 10 | -webkit-transition: color 350ms ease; 11 | -moz-transition: color 350ms ease; 12 | -o-transition: color 350ms ease; 13 | transition: color 350ms ease 14 | } 15 | .divider-content-summary:hover { 16 | color: #444; 17 | } 18 | .divider-content-summary__icon { 19 | display: table-cell; 20 | vertical-align: middle; 21 | text-align: center; 22 | } 23 | -------------------------------------------------------------------------------- /node_modules/gitbook-plugin-splitter/gitbook-splitter-demo.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/truelovesdu/sosotest_docs/7cf5c4abc7f0775f9fa1f0fbc70335f35518b3aa/node_modules/gitbook-plugin-splitter/gitbook-splitter-demo.gif -------------------------------------------------------------------------------- /node_modules/gitbook-plugin-splitter/index.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | website: { 3 | assets: './book', 4 | js: [ 5 | 'splitter.js' 6 | ], 7 | css: [ 8 | 'splitter.css' 9 | ] 10 | } 11 | }; -------------------------------------------------------------------------------- /node_modules/gitbook-plugin-summary/LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2017 Julian Xhokaxhiu 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /node_modules/gitbook-plugin-summary/files.js: -------------------------------------------------------------------------------- 1 | const isADir = path => path.charAt(path.length - 1) === '/' 2 | 3 | const fromPath = path => 4 | isADir(path) ? Dir(path, path) : File(path, path) 5 | 6 | const File = (path, x) => { 7 | const apply = f => f([ path, x ]) 8 | 9 | const map = (f, _) => File(path, chain(f)) 10 | 11 | const mapFile = f => map(f, null) 12 | 13 | const mapDir = _ => File(path, x) 14 | 15 | const inspect = _ => `File(${path}, ${x})` 16 | 17 | const chain = (f, _) => apply(f) 18 | 19 | return { 20 | map, 21 | mapFile, 22 | mapDir, 23 | inspect, 24 | chain, 25 | fold: chain 26 | } 27 | } 28 | 29 | const Dir = (path, x) => { 30 | const apply = g => g([ path, x ]) 31 | 32 | const map = (_, g) => Dir(path, apply(g)) 33 | 34 | const mapFile = _ => Dir(path, x) 35 | 36 | const mapDir = g => map(null, g) 37 | 38 | const inspect = _ => `Dir(${path}, ${x})` 39 | 40 | const chain = (_, g) => apply(g) 41 | 42 | return { 43 | map, 44 | mapFile, 45 | mapDir, 46 | inspect, 47 | chain, 48 | fold: chain 49 | } 50 | } 51 | 52 | module.exports = { 53 | fromPath, 54 | File, 55 | Dir 56 | } 57 | -------------------------------------------------------------------------------- /node_modules/gitbook-plugin-summary/processor.js: -------------------------------------------------------------------------------- 1 | const Maybe = require('folktale/maybe') 2 | const Task = require('folktale/concurrency/task') 3 | const Parser = require('markdown-parser') 4 | 5 | const { File, Dir } = require('./files') 6 | 7 | const parseTask = Task.fromNodeback((content, cb) => new Parser().parse(content, cb)) 8 | 9 | // Config 10 | // -> List (FileType String Bool) 11 | // -> Task ( List ( FileType String Markdown ) ) 12 | module.exports = config => tree => 13 | tree.traverse(Task.of, 14 | file => { 15 | const fileResult = 16 | file.chain( 17 | file => parseMarkdown(file), 18 | ([ path, x ]) => Task.of(Dir(path, x)) 19 | ) 20 | return fileResult 21 | } 22 | ) 23 | 24 | // [ path, content ] -> Task File 25 | const parseMarkdown = ([ path, content ]) => { 26 | if (!content.length) { 27 | const file = File(path, Maybe.Nothing()) 28 | return Task.of(file) 29 | } 30 | 31 | return parseTask(content) 32 | .map(Maybe.Just) 33 | .map(parsed => File(path, parsed)) 34 | } 35 | -------------------------------------------------------------------------------- /node_modules/gitbook-plugin-theme-comscore/.npmignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | 5 | # Runtime data 6 | pids 7 | *.pid 8 | *.seed 9 | 10 | # Directory for instrumented libs generated by jscoverage/JSCover 11 | lib-cov 12 | 13 | # Coverage directory used by tools like istanbul 14 | coverage 15 | 16 | # Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) 17 | .grunt 18 | 19 | # Compiled binary addons (http://nodejs.org/api/addons.html) 20 | build/Release 21 | 22 | # Dependency directory 23 | # Deployed apps should consider commenting this line out: 24 | # see https://npmjs.org/doc/faq.html#Should-I-check-my-node_modules-folder-into-git 25 | node_modules 26 | 27 | # IntelliJ project files 28 | .idea 29 | *.iml 30 | out 31 | gen 32 | -------------------------------------------------------------------------------- /node_modules/gitbook-plugin-theme-comscore/book/test.css: -------------------------------------------------------------------------------- 1 | section { 2 | width:100%; 3 | } 4 | h1 { 5 | color: #2674BA; 6 | } 7 | h2 { 8 | color: #0099CC; 9 | } 10 | h3 { 11 | color: #F77A0B; 12 | } 13 | h4 { 14 | color: #662D91; 15 | } 16 | h5 { 17 | color: #444444; 18 | } 19 | th { 20 | background-color: #2674BA; 21 | color: white; 22 | } 23 | -------------------------------------------------------------------------------- /node_modules/gitbook-plugin-theme-comscore/book/test.js: -------------------------------------------------------------------------------- 1 | require(["gitbook"], function(gitbook) { 2 | gitbook.events.bind("page.change", function() { 3 | // do something 4 | }); 5 | 6 | gitbook.events.bind("exercise.submit", function() { 7 | // do something 8 | }); 9 | }); -------------------------------------------------------------------------------- /node_modules/gitbook-plugin-toggle-chapters/.npmignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | 5 | # Runtime data 6 | pids 7 | *.pid 8 | *.seed 9 | 10 | # Directory for instrumented libs generated by jscoverage/JSCover 11 | lib-cov 12 | 13 | # Coverage directory used by tools like istanbul 14 | coverage 15 | 16 | # Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) 17 | .grunt 18 | 19 | # Compiled binary addons (http://nodejs.org/api/addons.html) 20 | build/Release 21 | 22 | # Dependency directory 23 | # Deployed apps should consider commenting this line out: 24 | # see https://npmjs.org/doc/faq.html#Should-I-check-my-node_modules-folder-into-git 25 | node_modules 26 | -------------------------------------------------------------------------------- /node_modules/gitbook-plugin-toggle-chapters/README.md: -------------------------------------------------------------------------------- 1 | # Toggle Chapters on GitBook 2 | 3 | ## Install it using: 4 | 5 | ```$ npm install gitbook-plugin-toggle-chapters``` 6 | 7 | To use it in your book, add this to book.json: 8 | ``` 9 | { 10 | "plugins": ["toggle-chapters"] 11 | } 12 | ``` 13 | -------------------------------------------------------------------------------- /node_modules/gitbook-plugin-toggle-chapters/book/toggle.css: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/truelovesdu/sosotest_docs/7cf5c4abc7f0775f9fa1f0fbc70335f35518b3aa/node_modules/gitbook-plugin-toggle-chapters/book/toggle.css -------------------------------------------------------------------------------- /node_modules/gitbook-plugin-toggle-chapters/book/toggle.js: -------------------------------------------------------------------------------- 1 | require(["gitbook", "jQuery"], function(gitbook, $) { 2 | 3 | function expand(chapter) { 4 | chapter.show(); 5 | if (chapter.parent().attr('class') != 'summary' 6 | && chapter.parent().attr('class') != 'book-summary' 7 | && chapter.length != 0 8 | ) { 9 | expand(chapter.parent()); 10 | } 11 | } 12 | 13 | gitbook.events.bind("page.change", function() { 14 | $('li.chapter').children('ul.articles').hide(); 15 | $chapter = $('li.chapter.active'); 16 | $children = $chapter.children('ul.articles'); 17 | $parent = $chapter.parent(); 18 | $siblings = $chapter.siblings().children('ul.articles'); 19 | 20 | expand($chapter); 21 | 22 | if ($children.length > 0) { 23 | $children.show(); 24 | } 25 | }); 26 | 27 | }); 28 | -------------------------------------------------------------------------------- /node_modules/gitbook-plugin-toggle-chapters/index.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | website: { 3 | assets: "./book", 4 | js: [ 5 | "toggle.js" 6 | ], 7 | css: [ 8 | "toggle.css" 9 | ], 10 | html: { 11 | "html:start": function() { 12 | return "" 13 | }, 14 | "html:end": function() { 15 | return "" 16 | }, 17 | 18 | "head:start": "", 19 | "head:end": "", 20 | 21 | "body:start": "", 22 | "body:end": "" 23 | } 24 | }, 25 | hooks: { 26 | // For all the hooks, this represent the current generator 27 | 28 | // This is called before the book is generated 29 | "init": function() { 30 | //console.log("init!"); 31 | }, 32 | 33 | // This is called after the book generation 34 | "finish": function() { 35 | //console.log("finish!"); 36 | } 37 | 38 | } 39 | }; 40 | -------------------------------------------------------------------------------- /node_modules/glob/LICENSE: -------------------------------------------------------------------------------- 1 | The ISC License 2 | 3 | Copyright (c) Isaac Z. Schlueter and Contributors 4 | 5 | Permission to use, copy, modify, and/or distribute this software for any 6 | purpose with or without fee is hereby granted, provided that the above 7 | copyright notice and this permission notice appear in all copies. 8 | 9 | THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 10 | WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 11 | MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 12 | ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 13 | WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 14 | ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR 15 | IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 16 | 17 | ## Glob Logo 18 | 19 | Glob's logo created by Tanya Brassie , licensed 20 | under a Creative Commons Attribution-ShareAlike 4.0 International License 21 | https://creativecommons.org/licenses/by-sa/4.0/ 22 | -------------------------------------------------------------------------------- /node_modules/immutable-ext/.npmignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | 6 | # Runtime data 7 | pids 8 | *.pid 9 | *.seed 10 | 11 | # Directory for instrumented libs generated by jscoverage/JSCover 12 | lib-cov 13 | 14 | # Coverage directory used by tools like istanbul 15 | coverage 16 | 17 | # Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) 18 | .grunt 19 | 20 | # node-waf configuration 21 | .lock-wscript 22 | 23 | # Compiled binary addons (http://nodejs.org/api/addons.html) 24 | build/Release 25 | 26 | # Dependency directory 27 | node_modules 28 | 29 | # Optional npm cache directory 30 | .npm 31 | 32 | # Optional REPL history 33 | .node_repl_history 34 | 35 | # Remove dist folder 36 | dist 37 | -------------------------------------------------------------------------------- /node_modules/immutable-ext/LICENSE: -------------------------------------------------------------------------------- 1 | Copyright (c) 2016, Brian Lonsdorf 2 | 3 | Permission to use, copy, modify, and/or distribute this software for any 4 | purpose with or without fee is hereby granted, provided that the above 5 | copyright notice and this permission notice appear in all copies. 6 | 7 | THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 8 | WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 9 | MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 10 | ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 11 | WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 12 | ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 13 | OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 14 | -------------------------------------------------------------------------------- /node_modules/immutable/LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2014-present, Facebook, Inc. 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /node_modules/immutable/contrib/cursor/README.md: -------------------------------------------------------------------------------- 1 | Cursors 2 | ------- 3 | 4 | Cursors allow you to hold a reference to a path in a nested immutable data 5 | structure, allowing you to pass smaller sections of a larger nested 6 | collection to portions of your application while maintaining a central point 7 | aware of changes to the entire data structure: an `onChange` function which is 8 | called whenever a cursor or sub-cursor calls `update`. 9 | 10 | This is particularly useful when used in conjuction with component-based UI 11 | libraries like [React](http://facebook.github.io/react/) or to simulate 12 | "state" throughout an application while maintaining a single flow of logic. 13 | 14 | 15 | ```javascript 16 | var Immutable = require('immutable'); 17 | var Cursor = require('immutable/contrib/cursor'); 18 | 19 | var data = Immutable.fromJS({ a: { b: { c: 1 } } }); 20 | var cursor = Cursor.from(data, ['a', 'b'], newData => { 21 | data = newData; 22 | }); 23 | 24 | // ... elsewhere ... 25 | 26 | cursor.get('c'); // 1 27 | cursor = cursor.update('c', x => x + 1); 28 | cursor.get('c'); // 2 29 | 30 | // ... back to data ... 31 | 32 | data.getIn(['a', 'b', 'c']); // 2 33 | ``` 34 | -------------------------------------------------------------------------------- /node_modules/inflight/LICENSE: -------------------------------------------------------------------------------- 1 | The ISC License 2 | 3 | Copyright (c) Isaac Z. Schlueter 4 | 5 | Permission to use, copy, modify, and/or distribute this software for any 6 | purpose with or without fee is hereby granted, provided that the above 7 | copyright notice and this permission notice appear in all copies. 8 | 9 | THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 10 | WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 11 | MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 12 | ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 13 | WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 14 | ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR 15 | IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 16 | -------------------------------------------------------------------------------- /node_modules/inflight/README.md: -------------------------------------------------------------------------------- 1 | # inflight 2 | 3 | Add callbacks to requests in flight to avoid async duplication 4 | 5 | ## USAGE 6 | 7 | ```javascript 8 | var inflight = require('inflight') 9 | 10 | // some request that does some stuff 11 | function req(key, callback) { 12 | // key is any random string. like a url or filename or whatever. 13 | // 14 | // will return either a falsey value, indicating that the 15 | // request for this key is already in flight, or a new callback 16 | // which when called will call all callbacks passed to inflightk 17 | // with the same key 18 | callback = inflight(key, callback) 19 | 20 | // If we got a falsey value back, then there's already a req going 21 | if (!callback) return 22 | 23 | // this is where you'd fetch the url or whatever 24 | // callback is also once()-ified, so it can safely be assigned 25 | // to multiple events etc. First call wins. 26 | setTimeout(function() { 27 | callback(null, key) 28 | }, 100) 29 | } 30 | 31 | // only assigns a single setTimeout 32 | // when it dings, all cbs get called 33 | req('foo', cb1) 34 | req('foo', cb2) 35 | req('foo', cb3) 36 | req('foo', cb4) 37 | ``` 38 | -------------------------------------------------------------------------------- /node_modules/inherits/LICENSE: -------------------------------------------------------------------------------- 1 | The ISC License 2 | 3 | Copyright (c) Isaac Z. Schlueter 4 | 5 | Permission to use, copy, modify, and/or distribute this software for any 6 | purpose with or without fee is hereby granted, provided that the above 7 | copyright notice and this permission notice appear in all copies. 8 | 9 | THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH 10 | REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND 11 | FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, 12 | INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM 13 | LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR 14 | OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR 15 | PERFORMANCE OF THIS SOFTWARE. 16 | 17 | -------------------------------------------------------------------------------- /node_modules/inherits/inherits.js: -------------------------------------------------------------------------------- 1 | try { 2 | var util = require('util'); 3 | if (typeof util.inherits !== 'function') throw ''; 4 | module.exports = util.inherits; 5 | } catch (e) { 6 | module.exports = require('./inherits_browser.js'); 7 | } 8 | -------------------------------------------------------------------------------- /node_modules/inherits/inherits_browser.js: -------------------------------------------------------------------------------- 1 | if (typeof Object.create === 'function') { 2 | // implementation from standard node.js 'util' module 3 | module.exports = function inherits(ctor, superCtor) { 4 | ctor.super_ = superCtor 5 | ctor.prototype = Object.create(superCtor.prototype, { 6 | constructor: { 7 | value: ctor, 8 | enumerable: false, 9 | writable: true, 10 | configurable: true 11 | } 12 | }); 13 | }; 14 | } else { 15 | // old school shim for old browsers 16 | module.exports = function inherits(ctor, superCtor) { 17 | ctor.super_ = superCtor 18 | var TempCtor = function () {} 19 | TempCtor.prototype = superCtor.prototype 20 | ctor.prototype = new TempCtor() 21 | ctor.prototype.constructor = ctor 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /node_modules/markdown-parser/.npmignore: -------------------------------------------------------------------------------- 1 | # Created by http://www.gitignore.io 2 | 3 | ### Node ### 4 | lib-cov 5 | lcov.info 6 | *.seed 7 | *.log 8 | *.csv 9 | *.dat 10 | *.out 11 | *.pid 12 | *.gz 13 | 14 | pids 15 | logs 16 | results 17 | build 18 | .grunt 19 | 20 | node_modules 21 | bower_components 22 | -------------------------------------------------------------------------------- /node_modules/markdown-parser/.travis.yml: -------------------------------------------------------------------------------- 1 | language: node_js 2 | node_js: 3 | - "0.11" 4 | - "0.10" -------------------------------------------------------------------------------- /node_modules/markdown-parser/Gruntfile.js: -------------------------------------------------------------------------------- 1 | module.exports = function(grunt) { 2 | 'use strict'; 3 | 4 | // Project configuration. 5 | grunt.initConfig({ 6 | pkg: grunt.file.readJSON('package.json'), 7 | jshint: { 8 | files: ['src/**/*.js', 'test/**/*.js'] 9 | }, 10 | // UGLIFY TASK 11 | uglify: { 12 | task1: { 13 | options: { 14 | preserveComments: 'some', 15 | report: 'min', 16 | banner: '/*! \n* @license <%= pkg.name %> - v<%= pkg.version %>\n' + 17 | '* (c) 2013 Julien VALERY https://github.com/darul75/markdown-parser\n' + 18 | '* License: MIT \n*/\n' 19 | }, 20 | files: {'lib/markdown-parser.js': ['src/markdown-parser.js'] 21 | } 22 | } 23 | } 24 | }); 25 | 26 | // LOAD PLUGINS 27 | grunt.loadNpmTasks('grunt-contrib-jshint'); 28 | grunt.loadNpmTasks('grunt-contrib-uglify'); 29 | 30 | // TASK REGISTER 31 | //grunt.registerTask('default', ['jshint', 'uglify:task1']); 32 | grunt.registerTask('default', []); 33 | }; 34 | -------------------------------------------------------------------------------- /node_modules/markdown-parser/MIT-LICENSE.txt: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | Copyright (c) 2013 Julien Valéry 3 | 4 | Permission is hereby granted, free of charge, to any person obtaining a copy 5 | of this software and associated documentation files (the "Software"), to deal 6 | in the Software without restriction, including without limitation the rights 7 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 8 | copies of the Software, and to permit persons to whom the Software is 9 | furnished to do so, subject to the following conditions: 10 | 11 | The above copyright notice and this permission notice shall be included in all 12 | copies or substantial portions of the Software. 13 | 14 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 15 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 16 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 17 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 18 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 19 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 20 | SOFTWARE. -------------------------------------------------------------------------------- /node_modules/markdown-parser/src/markdown-parser.js: -------------------------------------------------------------------------------- 1 | // pegjs -e markdownparser markdown-grammar.pegjs parser-browser.js 2 | // pegjs markdown-grammar.pegjs parser.js 3 | var pegparser = require('./parser.js'); 4 | var pat = /^https?:\/\//i; 5 | 6 | 7 | function MarkdownParser(options) { 8 | Object.defineProperty(this, 'options', {writable: true, value: options || {}}); 9 | 10 | this.init(); 11 | } 12 | 13 | MarkdownParser.prototype.init = function() { 14 | return this; 15 | }; 16 | 17 | MarkdownParser.prototype.parse = function(markdown, next) { 18 | var result = pegparser.parse(markdown); 19 | 20 | // relative or absolute links 21 | if (result && this.options.html_url && result.references) { 22 | var prefix = this.options.html_url; 23 | result.references.forEach(function(elt) { 24 | if (!pat.test(elt.href)) { 25 | elt.href = prefix + '/blob/master/' + elt.href.replace('./', ''); 26 | } 27 | }); 28 | } 29 | 30 | return process.nextTick(function() { 31 | next(null, result); 32 | }); 33 | }; 34 | 35 | module.exports = MarkdownParser; -------------------------------------------------------------------------------- /node_modules/minimatch/LICENSE: -------------------------------------------------------------------------------- 1 | The ISC License 2 | 3 | Copyright (c) Isaac Z. Schlueter and Contributors 4 | 5 | Permission to use, copy, modify, and/or distribute this software for any 6 | purpose with or without fee is hereby granted, provided that the above 7 | copyright notice and this permission notice appear in all copies. 8 | 9 | THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 10 | WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 11 | MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 12 | ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 13 | WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 14 | ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR 15 | IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 16 | -------------------------------------------------------------------------------- /node_modules/once/LICENSE: -------------------------------------------------------------------------------- 1 | The ISC License 2 | 3 | Copyright (c) Isaac Z. Schlueter and Contributors 4 | 5 | Permission to use, copy, modify, and/or distribute this software for any 6 | purpose with or without fee is hereby granted, provided that the above 7 | copyright notice and this permission notice appear in all copies. 8 | 9 | THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 10 | WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 11 | MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 12 | ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 13 | WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 14 | ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR 15 | IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 16 | -------------------------------------------------------------------------------- /node_modules/once/once.js: -------------------------------------------------------------------------------- 1 | var wrappy = require('wrappy') 2 | module.exports = wrappy(once) 3 | module.exports.strict = wrappy(onceStrict) 4 | 5 | once.proto = once(function () { 6 | Object.defineProperty(Function.prototype, 'once', { 7 | value: function () { 8 | return once(this) 9 | }, 10 | configurable: true 11 | }) 12 | 13 | Object.defineProperty(Function.prototype, 'onceStrict', { 14 | value: function () { 15 | return onceStrict(this) 16 | }, 17 | configurable: true 18 | }) 19 | }) 20 | 21 | function once (fn) { 22 | var f = function () { 23 | if (f.called) return f.value 24 | f.called = true 25 | return f.value = fn.apply(this, arguments) 26 | } 27 | f.called = false 28 | return f 29 | } 30 | 31 | function onceStrict (fn) { 32 | var f = function () { 33 | if (f.called) 34 | throw new Error(f.onceError) 35 | f.called = true 36 | return f.value = fn.apply(this, arguments) 37 | } 38 | var name = fn.name || 'Function wrapped with `once`' 39 | f.onceError = name + " shouldn't be called more than once" 40 | f.called = false 41 | return f 42 | } 43 | -------------------------------------------------------------------------------- /node_modules/path-is-absolute/index.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | function posix(path) { 4 | return path.charAt(0) === '/'; 5 | } 6 | 7 | function win32(path) { 8 | // https://github.com/nodejs/node/blob/b3fcc245fb25539909ef1d5eaa01dbf92e168633/lib/path.js#L56 9 | var splitDeviceRe = /^([a-zA-Z]:|[\\\/]{2}[^\\\/]+[\\\/]+[^\\\/]+)?([\\\/])?([\s\S]*?)$/; 10 | var result = splitDeviceRe.exec(path); 11 | var device = result[1] || ''; 12 | var isUnc = Boolean(device && device.charAt(1) !== ':'); 13 | 14 | // UNC paths are always absolute 15 | return Boolean(result[2] || isUnc); 16 | } 17 | 18 | module.exports = process.platform === 'win32' ? win32 : posix; 19 | module.exports.posix = posix; 20 | module.exports.win32 = win32; 21 | -------------------------------------------------------------------------------- /node_modules/path-is-absolute/license: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) Sindre Sorhus (sindresorhus.com) 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in 13 | all copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 21 | THE SOFTWARE. 22 | -------------------------------------------------------------------------------- /node_modules/wrappy/LICENSE: -------------------------------------------------------------------------------- 1 | The ISC License 2 | 3 | Copyright (c) Isaac Z. Schlueter and Contributors 4 | 5 | Permission to use, copy, modify, and/or distribute this software for any 6 | purpose with or without fee is hereby granted, provided that the above 7 | copyright notice and this permission notice appear in all copies. 8 | 9 | THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 10 | WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 11 | MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 12 | ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 13 | WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 14 | ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR 15 | IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 16 | -------------------------------------------------------------------------------- /node_modules/wrappy/README.md: -------------------------------------------------------------------------------- 1 | # wrappy 2 | 3 | Callback wrapping utility 4 | 5 | ## USAGE 6 | 7 | ```javascript 8 | var wrappy = require("wrappy") 9 | 10 | // var wrapper = wrappy(wrapperFunction) 11 | 12 | // make sure a cb is called only once 13 | // See also: http://npm.im/once for this specific use case 14 | var once = wrappy(function (cb) { 15 | var called = false 16 | return function () { 17 | if (called) return 18 | called = true 19 | return cb.apply(this, arguments) 20 | } 21 | }) 22 | 23 | function printBoo () { 24 | console.log('boo') 25 | } 26 | // has some rando property 27 | printBoo.iAmBooPrinter = true 28 | 29 | var onlyPrintOnce = once(printBoo) 30 | 31 | onlyPrintOnce() // prints 'boo' 32 | onlyPrintOnce() // does nothing 33 | 34 | // random property is retained! 35 | assert.equal(onlyPrintOnce.iAmBooPrinter, true) 36 | ``` 37 | -------------------------------------------------------------------------------- /node_modules/wrappy/wrappy.js: -------------------------------------------------------------------------------- 1 | // Returns a wrapper function that returns a wrapped callback 2 | // The wrapper function should do some stuff, and return a 3 | // presumably different callback function. 4 | // This makes sure that own properties are retained, so that 5 | // decorations and such are not lost along the way. 6 | module.exports = wrappy 7 | function wrappy (fn, cb) { 8 | if (fn && cb) return wrappy(fn)(cb) 9 | 10 | if (typeof fn !== 'function') 11 | throw new TypeError('need wrapper function') 12 | 13 | Object.keys(fn).forEach(function (k) { 14 | wrapper[k] = fn[k] 15 | }) 16 | 17 | return wrapper 18 | 19 | function wrapper() { 20 | var args = new Array(arguments.length) 21 | for (var i = 0; i < args.length; i++) { 22 | args[i] = arguments[i] 23 | } 24 | var ret = fn.apply(this, args) 25 | var cb = args[args.length-1] 26 | if (typeof ret === 'function' && ret !== cb) { 27 | Object.keys(cb).forEach(function (k) { 28 | ret[k] = cb[k] 29 | }) 30 | } 31 | return ret 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /unnamed.patch: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/truelovesdu/sosotest_docs/7cf5c4abc7f0775f9fa1f0fbc70335f35518b3aa/unnamed.patch --------------------------------------------------------------------------------