BUILD 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872
  1. # Description:
  2. # A syntactic parser and part-of-speech tagger in TensorFlow.
  3. package(
  4. default_visibility = [
  5. "//visibility:public",
  6. ],
  7. features = ["-layering_check"],
  8. )
  9. licenses(["notice"]) # Apache 2.0
  10. load(
  11. "syntaxnet",
  12. "tf_proto_library",
  13. "tf_proto_library_py",
  14. "tf_gen_op_libs",
  15. "tf_gen_op_wrapper_py",
  16. )
  17. # proto libraries
  18. tf_proto_library(
  19. name = "feature_extractor_proto",
  20. srcs = ["feature_extractor.proto"],
  21. )
  22. tf_proto_library(
  23. name = "sentence_proto",
  24. srcs = ["sentence.proto"],
  25. )
  26. tf_proto_library_py(
  27. name = "sentence_py_pb2",
  28. srcs = ["sentence.proto"],
  29. )
  30. tf_proto_library(
  31. name = "dictionary_proto",
  32. srcs = ["dictionary.proto"],
  33. )
  34. tf_proto_library_py(
  35. name = "dictionary_py_pb2",
  36. srcs = ["dictionary.proto"],
  37. )
  38. tf_proto_library(
  39. name = "kbest_syntax_proto",
  40. srcs = ["kbest_syntax.proto"],
  41. deps = [":sentence_proto"],
  42. )
  43. tf_proto_library(
  44. name = "task_spec_proto",
  45. srcs = ["task_spec.proto"],
  46. )
  47. tf_proto_library_py(
  48. name = "task_spec_py_pb2",
  49. srcs = ["task_spec.proto"],
  50. )
  51. tf_proto_library(
  52. name = "sparse_proto",
  53. srcs = ["sparse.proto"],
  54. )
  55. tf_proto_library_py(
  56. name = "sparse_py_pb2",
  57. srcs = ["sparse.proto"],
  58. )
  59. # cc libraries for feature extraction and parsing
  60. cc_library(
  61. name = "base",
  62. hdrs = ["base.h"],
  63. visibility = ["//visibility:public"],
  64. deps = [
  65. "@com_googlesource_code_re2//:re2",
  66. "@protobuf//:protobuf",
  67. "@org_tensorflow//third_party/eigen3",
  68. ] + select({
  69. "//conditions:default": [
  70. "@org_tensorflow//tensorflow/core:framework",
  71. "@org_tensorflow//tensorflow/core:lib",
  72. ],
  73. "@org_tensorflow//tensorflow:darwin": [
  74. "@org_tensorflow//tensorflow/core:framework_headers_lib",
  75. ],
  76. }),
  77. )
  78. cc_library(
  79. name = "utils",
  80. srcs = ["utils.cc"],
  81. hdrs = [
  82. "utils.h",
  83. ],
  84. deps = [
  85. ":base",
  86. "//util/utf8:unicodetext",
  87. ],
  88. )
  89. cc_library(
  90. name = "test_main",
  91. testonly = 1,
  92. srcs = ["test_main.cc"],
  93. linkopts = ["-lm"],
  94. deps = [
  95. "//external:gtest",
  96. "@org_tensorflow//tensorflow/core:lib",
  97. "@org_tensorflow//tensorflow/core:test",
  98. "@org_tensorflow//tensorflow/core:testlib",
  99. ],
  100. )
  101. cc_library(
  102. name = "document_format",
  103. srcs = ["document_format.cc"],
  104. hdrs = ["document_format.h"],
  105. deps = [
  106. ":registry",
  107. ":sentence_proto",
  108. ":task_context",
  109. ],
  110. )
  111. cc_library(
  112. name = "text_formats",
  113. srcs = ["text_formats.cc"],
  114. deps = [
  115. ":base",
  116. ":document_format",
  117. ":segmenter_utils",
  118. ":sentence_proto",
  119. ],
  120. alwayslink = 1,
  121. )
  122. cc_library(
  123. name = "fml_parser",
  124. srcs = ["fml_parser.cc"],
  125. hdrs = ["fml_parser.h"],
  126. deps = [
  127. ":feature_extractor_proto",
  128. ":utils",
  129. ],
  130. )
  131. cc_library(
  132. name = "proto_io",
  133. hdrs = ["proto_io.h"],
  134. deps = [
  135. ":feature_extractor_proto",
  136. ":fml_parser",
  137. ":sentence_proto",
  138. ":task_context",
  139. ],
  140. )
  141. cc_library(
  142. name = "char_properties",
  143. srcs = ["char_properties.cc"],
  144. hdrs = ["char_properties.h"],
  145. deps = [
  146. ":registry",
  147. ":utils",
  148. "//util/utf8:unicodetext",
  149. ],
  150. alwayslink = 1,
  151. )
  152. cc_library(
  153. name = "char_ngram_string_extractor",
  154. srcs = ["char_ngram_string_extractor.cc"],
  155. hdrs = ["char_ngram_string_extractor.h"],
  156. deps = [
  157. ":base",
  158. ":segmenter_utils",
  159. ":task_context",
  160. ],
  161. )
  162. cc_library(
  163. name = "segmenter_utils",
  164. srcs = ["segmenter_utils.cc"],
  165. hdrs = ["segmenter_utils.h"],
  166. deps = [
  167. ":base",
  168. ":char_properties",
  169. ":sentence_proto",
  170. "//util/utf8:unicodetext",
  171. ],
  172. alwayslink = 1,
  173. )
  174. cc_library(
  175. name = "feature_extractor",
  176. srcs = ["feature_extractor.cc"],
  177. hdrs = [
  178. "feature_extractor.h",
  179. "feature_types.h",
  180. ],
  181. deps = [
  182. ":document_format",
  183. ":feature_extractor_proto",
  184. ":proto_io",
  185. ":sentence_proto",
  186. ":task_context",
  187. ":utils",
  188. ":workspace",
  189. ],
  190. )
  191. cc_library(
  192. name = "affix",
  193. srcs = ["affix.cc"],
  194. hdrs = ["affix.h"],
  195. deps = [
  196. ":dictionary_proto",
  197. ":feature_extractor",
  198. ":sentence_proto",
  199. ":shared_store",
  200. ":term_frequency_map",
  201. ":utils",
  202. ":workspace",
  203. ],
  204. )
  205. cc_library(
  206. name = "sentence_features",
  207. srcs = ["sentence_features.cc"],
  208. hdrs = ["sentence_features.h"],
  209. deps = [
  210. ":affix",
  211. ":char_ngram_string_extractor",
  212. ":char_properties",
  213. ":feature_extractor",
  214. ":registry",
  215. ":segmenter_utils",
  216. ":shared_store",
  217. ":task_context",
  218. ":workspace",
  219. "//util/utf8:unicodetext",
  220. ],
  221. alwayslink = 1,
  222. )
  223. cc_library(
  224. name = "whole_sentence_features",
  225. srcs = ["whole_sentence_features.cc"],
  226. hdrs = ["whole_sentence_features.h"],
  227. deps = [
  228. ":base",
  229. ":feature_extractor",
  230. ":registry",
  231. ":task_context",
  232. ":workspace",
  233. ],
  234. alwayslink = 1,
  235. )
  236. cc_library(
  237. name = "shared_store",
  238. srcs = ["shared_store.cc"],
  239. hdrs = ["shared_store.h"],
  240. deps = [
  241. ":utils",
  242. ],
  243. )
  244. cc_library(
  245. name = "registry",
  246. srcs = ["registry.cc"],
  247. hdrs = ["registry.h"],
  248. deps = [
  249. ":utils",
  250. ],
  251. )
  252. cc_library(
  253. name = "workspace",
  254. srcs = ["workspace.cc"],
  255. hdrs = ["workspace.h"],
  256. deps = [
  257. ":utils",
  258. ],
  259. )
  260. cc_library(
  261. name = "task_context",
  262. srcs = ["task_context.cc"],
  263. hdrs = ["task_context.h"],
  264. deps = [
  265. ":task_spec_proto",
  266. ":utils",
  267. ],
  268. )
  269. cc_library(
  270. name = "term_frequency_map",
  271. srcs = ["term_frequency_map.cc"],
  272. hdrs = ["term_frequency_map.h"],
  273. visibility = ["//visibility:public"],
  274. deps = [
  275. ":utils",
  276. ],
  277. alwayslink = 1,
  278. )
  279. cc_library(
  280. name = "morphology_label_set",
  281. srcs = ["morphology_label_set.cc"],
  282. hdrs = ["morphology_label_set.h"],
  283. deps = [
  284. ":document_format",
  285. ":feature_extractor",
  286. ":proto_io",
  287. ":registry",
  288. ":sentence_proto",
  289. ":utils",
  290. ],
  291. )
  292. cc_library(
  293. name = "parser_transitions",
  294. srcs = [
  295. "arc_standard_transitions.cc",
  296. "binary_segment_state.cc",
  297. "binary_segment_transitions.cc",
  298. "char_shift_transitions.cc",
  299. "head_transitions.cc",
  300. "head_transitions.h",
  301. "label_transitions.cc",
  302. "label_transitions.h",
  303. "morpher_transitions.cc",
  304. "once_transitions.cc",
  305. "parser_features.cc",
  306. "parser_state.cc",
  307. "parser_transitions.cc",
  308. "shift_transitions.cc",
  309. "tagger_transitions.cc",
  310. ],
  311. hdrs = [
  312. "binary_segment_state.h",
  313. "char_shift_transitions.h",
  314. "parser_features.h",
  315. "parser_state.h",
  316. "parser_transitions.h",
  317. ],
  318. deps = [
  319. ":base",
  320. ":feature_extractor",
  321. ":morphology_label_set",
  322. ":registry",
  323. ":segmenter_utils",
  324. ":sentence_features",
  325. ":sentence_proto",
  326. ":shared_store",
  327. ":task_context",
  328. ":term_frequency_map",
  329. ":utils",
  330. ":whole_sentence_features",
  331. ":workspace",
  332. ],
  333. alwayslink = 1,
  334. )
  335. cc_library(
  336. name = "populate_test_inputs",
  337. testonly = 1,
  338. srcs = ["populate_test_inputs.cc"],
  339. hdrs = ["populate_test_inputs.h"],
  340. deps = [
  341. ":dictionary_proto",
  342. ":sentence_proto",
  343. ":task_context",
  344. ":task_spec_proto",
  345. ":term_frequency_map",
  346. ":test_main",
  347. ],
  348. )
  349. cc_library(
  350. name = "embedding_feature_extractor",
  351. srcs = ["embedding_feature_extractor.cc"],
  352. hdrs = ["embedding_feature_extractor.h"],
  353. deps = [
  354. ":base",
  355. ":feature_extractor",
  356. ":parser_transitions",
  357. ":sentence_features",
  358. ":sparse_proto",
  359. ":task_context",
  360. ":utils",
  361. ":workspace",
  362. ],
  363. )
  364. cc_library(
  365. name = "sentence_batch",
  366. srcs = ["sentence_batch.cc"],
  367. hdrs = ["sentence_batch.h"],
  368. deps = [
  369. ":embedding_feature_extractor",
  370. ":feature_extractor",
  371. ":parser_transitions",
  372. ":sentence_proto",
  373. ":sparse_proto",
  374. ":task_context",
  375. ":task_spec_proto",
  376. ":term_frequency_map",
  377. ":workspace",
  378. ],
  379. )
  380. cc_library(
  381. name = "reader_ops",
  382. srcs = [
  383. "beam_reader_ops.cc",
  384. "reader_ops.cc",
  385. ],
  386. deps = [
  387. ":parser_transitions",
  388. ":sentence_batch",
  389. ":sentence_proto",
  390. ":sparse_proto",
  391. ":task_context",
  392. ":task_spec_proto",
  393. ],
  394. alwayslink = 1,
  395. )
  396. cc_library(
  397. name = "document_filters",
  398. srcs = ["document_filters.cc"],
  399. deps = [
  400. ":document_format",
  401. ":parser_transitions",
  402. ":segmenter_utils",
  403. ":sentence_batch",
  404. ":sentence_proto",
  405. ":task_context",
  406. ":text_formats",
  407. ],
  408. alwayslink = 1,
  409. )
  410. cc_library(
  411. name = "lexicon_builder",
  412. srcs = ["lexicon_builder.cc"],
  413. deps = [
  414. ":affix",
  415. ":base",
  416. ":char_ngram_string_extractor",
  417. ":feature_extractor",
  418. ":parser_transitions",
  419. ":segmenter_utils",
  420. ":sentence_batch",
  421. ":sentence_proto",
  422. ":term_frequency_map",
  423. ":text_formats",
  424. ":utils",
  425. ],
  426. alwayslink = 1,
  427. )
  428. cc_library(
  429. name = "unpack_sparse_features",
  430. srcs = ["unpack_sparse_features.cc"],
  431. deps = [
  432. ":sparse_proto",
  433. ":utils",
  434. ],
  435. alwayslink = 1,
  436. )
  437. cc_library(
  438. name = "parser_ops_cc",
  439. srcs = ["ops/parser_ops.cc"],
  440. deps = [
  441. ":base",
  442. ":document_filters",
  443. ":lexicon_builder",
  444. ":reader_ops",
  445. ":unpack_sparse_features",
  446. ],
  447. alwayslink = 1,
  448. )
  449. cc_binary(
  450. name = "parser_ops.so",
  451. linkopts = select({
  452. "//conditions:default": ["-lm"],
  453. "@org_tensorflow//tensorflow:darwin": [],
  454. }),
  455. linkshared = 1,
  456. linkstatic = 1,
  457. deps = [
  458. ":parser_ops_cc",
  459. ],
  460. )
  461. # cc tests
  462. filegroup(
  463. name = "testdata",
  464. srcs = [
  465. "testdata/context.pbtxt",
  466. "testdata/document",
  467. "testdata/mini-training-set",
  468. ],
  469. )
  470. filegroup(
  471. name = "parsey_data",
  472. srcs = glob(["models/parsey_mcparseface/*"]),
  473. )
  474. cc_test(
  475. name = "binary_segment_state_test",
  476. size = "small",
  477. srcs = ["binary_segment_state_test.cc"],
  478. deps = [
  479. ":base",
  480. ":parser_transitions",
  481. ":term_frequency_map",
  482. ":test_main",
  483. ],
  484. )
  485. cc_test(
  486. name = "shared_store_test",
  487. size = "small",
  488. srcs = ["shared_store_test.cc"],
  489. deps = [
  490. ":shared_store",
  491. ":test_main",
  492. ],
  493. )
  494. cc_test(
  495. name = "char_properties_test",
  496. srcs = ["char_properties_test.cc"],
  497. deps = [
  498. ":char_properties",
  499. ":test_main",
  500. ],
  501. )
  502. cc_test(
  503. name = "char_ngram_string_extractor_test",
  504. srcs = ["char_ngram_string_extractor_test.cc"],
  505. deps = [
  506. ":char_ngram_string_extractor",
  507. ":task_context",
  508. ":test_main",
  509. "@org_tensorflow//tensorflow/core:test",
  510. ],
  511. )
  512. cc_test(
  513. name = "segmenter_utils_test",
  514. srcs = ["segmenter_utils_test.cc"],
  515. deps = [
  516. ":base",
  517. ":segmenter_utils",
  518. ":sentence_proto",
  519. ":test_main",
  520. ],
  521. )
  522. cc_test(
  523. name = "sentence_features_test",
  524. size = "medium",
  525. srcs = ["sentence_features_test.cc"],
  526. deps = [
  527. ":feature_extractor",
  528. ":populate_test_inputs",
  529. ":sentence_features",
  530. ":sentence_proto",
  531. ":task_context",
  532. ":task_spec_proto",
  533. ":term_frequency_map",
  534. ":test_main",
  535. ":utils",
  536. ":workspace",
  537. ],
  538. )
  539. cc_test(
  540. name = "whole_sentence_features_test",
  541. size = "medium",
  542. srcs = ["whole_sentence_features_test.cc"],
  543. deps = [
  544. ":feature_extractor",
  545. ":parser_transitions",
  546. ":sentence_proto",
  547. ":task_context",
  548. ":term_frequency_map",
  549. ":test_main",
  550. ":whole_sentence_features",
  551. ":workspace",
  552. ],
  553. )
  554. cc_test(
  555. name = "morphology_label_set_test",
  556. srcs = ["morphology_label_set_test.cc"],
  557. deps = [
  558. ":morphology_label_set",
  559. ":test_main",
  560. ],
  561. )
  562. cc_test(
  563. name = "arc_standard_transitions_test",
  564. size = "small",
  565. srcs = ["arc_standard_transitions_test.cc"],
  566. data = [":testdata"],
  567. deps = [
  568. ":parser_transitions",
  569. ":populate_test_inputs",
  570. ":sentence_proto",
  571. ":task_spec_proto",
  572. ":test_main",
  573. ],
  574. )
  575. cc_test(
  576. name = "char_shift_transitions_test",
  577. size = "small",
  578. srcs = ["char_shift_transitions_test.cc"],
  579. data = [":testdata"],
  580. deps = [
  581. ":parser_transitions",
  582. ":populate_test_inputs",
  583. ":sentence_proto",
  584. ":task_spec_proto",
  585. ":test_main",
  586. ],
  587. )
  588. cc_test(
  589. name = "binary_segment_transitions_test",
  590. size = "small",
  591. srcs = ["binary_segment_transitions_test.cc"],
  592. deps = [
  593. ":parser_transitions",
  594. ":sentence_proto",
  595. ":task_context",
  596. ":test_main",
  597. ":workspace",
  598. ],
  599. )
  600. cc_test(
  601. name = "tagger_transitions_test",
  602. size = "small",
  603. srcs = ["tagger_transitions_test.cc"],
  604. data = [":testdata"],
  605. deps = [
  606. ":parser_transitions",
  607. ":populate_test_inputs",
  608. ":sentence_proto",
  609. ":task_spec_proto",
  610. ":test_main",
  611. ],
  612. )
  613. cc_test(
  614. name = "once_transitions_test",
  615. size = "small",
  616. srcs = ["once_transitions_test.cc"],
  617. deps = [
  618. ":base",
  619. ":parser_transitions",
  620. ":sentence_proto",
  621. ":task_context",
  622. ":term_frequency_map",
  623. ":test_main",
  624. ],
  625. )
  626. cc_test(
  627. name = "head_transitions_test",
  628. size = "small",
  629. srcs = ["head_transitions_test.cc"],
  630. deps = [
  631. ":base",
  632. ":parser_transitions",
  633. ":sentence_proto",
  634. ":task_context",
  635. ":term_frequency_map",
  636. ":test_main",
  637. ],
  638. )
  639. cc_test(
  640. name = "label_transitions_test",
  641. size = "small",
  642. srcs = ["label_transitions_test.cc"],
  643. deps = [
  644. ":base",
  645. ":parser_transitions",
  646. ":sentence_proto",
  647. ":task_context",
  648. ":term_frequency_map",
  649. ":test_main",
  650. ],
  651. )
  652. cc_test(
  653. name = "parser_features_test",
  654. size = "small",
  655. srcs = ["parser_features_test.cc"],
  656. deps = [
  657. ":feature_extractor",
  658. ":parser_transitions",
  659. ":populate_test_inputs",
  660. ":sentence_proto",
  661. ":task_context",
  662. ":task_spec_proto",
  663. ":term_frequency_map",
  664. ":test_main",
  665. ":workspace",
  666. ],
  667. )
  668. # py graph builder and trainer
  669. tf_gen_op_libs(
  670. op_lib_names = ["parser_ops"],
  671. )
  672. tf_gen_op_wrapper_py(
  673. name = "parser_ops",
  674. deps = [":parser_ops_op_lib"],
  675. )
  676. py_library(
  677. name = "load_parser_ops_py",
  678. srcs = ["load_parser_ops.py"],
  679. data = [":parser_ops.so"],
  680. )
  681. py_library(
  682. name = "graph_builder",
  683. srcs = ["graph_builder.py"],
  684. deps = [
  685. ":load_parser_ops_py",
  686. ":parser_ops",
  687. "@org_tensorflow//tensorflow:tensorflow_py",
  688. "@org_tensorflow//tensorflow/core:protos_all_py",
  689. ],
  690. )
  691. py_library(
  692. name = "structured_graph_builder",
  693. srcs = ["structured_graph_builder.py"],
  694. deps = [
  695. ":graph_builder",
  696. ],
  697. )
  698. py_binary(
  699. name = "parser_trainer",
  700. srcs = ["parser_trainer.py"],
  701. deps = [
  702. ":graph_builder",
  703. ":structured_graph_builder",
  704. ":task_spec_py_pb2",
  705. ],
  706. )
  707. py_binary(
  708. name = "parser_eval",
  709. srcs = ["parser_eval.py"],
  710. deps = [
  711. ":graph_builder",
  712. ":sentence_py_pb2",
  713. ":structured_graph_builder",
  714. ":task_spec_py_pb2",
  715. ],
  716. )
  717. py_binary(
  718. name = "conll2tree",
  719. srcs = ["conll2tree.py"],
  720. deps = [
  721. ":graph_builder",
  722. ":sentence_py_pb2",
  723. ],
  724. )
  725. # py tests
  726. py_test(
  727. name = "lexicon_builder_test",
  728. size = "small",
  729. srcs = ["lexicon_builder_test.py"],
  730. deps = [
  731. ":graph_builder",
  732. ":sentence_py_pb2",
  733. ":task_spec_py_pb2",
  734. ],
  735. )
  736. py_test(
  737. name = "text_formats_test",
  738. size = "small",
  739. srcs = ["text_formats_test.py"],
  740. deps = [
  741. ":graph_builder",
  742. ":sentence_py_pb2",
  743. ":task_spec_py_pb2",
  744. ],
  745. )
  746. py_test(
  747. name = "reader_ops_test",
  748. size = "medium",
  749. srcs = ["reader_ops_test.py"],
  750. data = [":testdata"],
  751. tags = ["notsan"],
  752. deps = [
  753. ":dictionary_py_pb2",
  754. ":graph_builder",
  755. ":sparse_py_pb2",
  756. ],
  757. )
  758. py_test(
  759. name = "beam_reader_ops_test",
  760. size = "medium",
  761. srcs = ["beam_reader_ops_test.py"],
  762. data = [":testdata"],
  763. tags = ["notsan"],
  764. deps = [
  765. ":structured_graph_builder",
  766. ],
  767. )
  768. py_test(
  769. name = "graph_builder_test",
  770. size = "medium",
  771. srcs = ["graph_builder_test.py"],
  772. data = [
  773. ":testdata",
  774. ],
  775. tags = ["notsan"],
  776. deps = [
  777. ":graph_builder",
  778. ":sparse_py_pb2",
  779. ],
  780. )
  781. sh_test(
  782. name = "parser_trainer_test",
  783. size = "large",
  784. srcs = ["parser_trainer_test.sh"],
  785. data = [
  786. ":parser_eval",
  787. ":parser_trainer",
  788. ":testdata",
  789. ],
  790. tags = ["slow"],
  791. )