expressir 0.2.27-x64-mingw32 → 1.0.0-x64-mingw32

Sign up to get free protection for your applications and to get access to all the features.
Files changed (90) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/rake.yml +3 -3
  3. data/.gitignore +2 -2
  4. data/demo.rb +5 -5
  5. data/exe/format +8 -8
  6. data/exe/format-test +11 -11
  7. data/expressir.gemspec +0 -1
  8. data/lib/expressir.rb +0 -1
  9. data/lib/expressir/cli.rb +0 -6
  10. data/lib/expressir/{express_exp → express}/2.4/express_parser.so +0 -0
  11. data/lib/expressir/{express_exp → express}/2.5/express_parser.so +0 -0
  12. data/lib/expressir/{express_exp → express}/2.6/express_parser.so +0 -0
  13. data/lib/expressir/{express_exp → express}/2.7/express_parser.so +0 -0
  14. data/lib/expressir/{express_exp → express}/3.0/express_parser.so +0 -0
  15. data/lib/expressir/{express_exp → express}/cache.rb +3 -6
  16. data/lib/expressir/{express_exp → express}/formatter.rb +72 -66
  17. data/lib/expressir/{express_exp → express}/hyperlink_formatter.rb +1 -1
  18. data/lib/expressir/{express_exp → express}/model_visitor.rb +1 -1
  19. data/lib/expressir/{express_exp → express}/parser.rb +3 -3
  20. data/lib/expressir/{express_exp → express}/resolve_references_model_visitor.rb +2 -2
  21. data/lib/expressir/{express_exp → express}/schema_head_formatter.rb +1 -1
  22. data/lib/expressir/{express_exp → express}/visitor.rb +21 -25
  23. data/lib/expressir/model.rb +2 -2
  24. data/lib/expressir/model/entity.rb +6 -6
  25. data/lib/expressir/model/model_element.rb +1 -1
  26. data/lib/expressir/model/rule.rb +3 -3
  27. data/lib/expressir/model/type.rb +6 -6
  28. data/lib/expressir/model/types/enumeration.rb +2 -4
  29. data/lib/expressir/model/types/select.rb +2 -4
  30. data/lib/expressir/model/{unique.rb → unique_rule.rb} +1 -1
  31. data/lib/expressir/model/{where.rb → where_rule.rb} +1 -1
  32. data/lib/expressir/version.rb +1 -1
  33. data/rakelib/cross-ruby.rake +1 -1
  34. data/spec/expressir/{express_exp → express}/cache_spec.rb +9 -9
  35. data/spec/expressir/express/formatter_spec.rb +127 -0
  36. data/spec/expressir/{express_exp → express}/parser_spec.rb +23 -23
  37. data/spec/expressir/model/model_element_spec.rb +45 -45
  38. data/{original/examples → spec}/syntax/multiple.exp +0 -0
  39. data/{original/examples → spec}/syntax/multiple.yaml +4 -4
  40. data/{original/examples → spec}/syntax/multiple_formatted.exp +0 -0
  41. data/{original/examples → spec}/syntax/multiple_hyperlink_formatted.exp +0 -0
  42. data/{original/examples → spec}/syntax/multiple_schema_head_hyperlink_formatted.exp +0 -0
  43. data/{original/examples → spec}/syntax/remark.exp +0 -0
  44. data/{original/examples → spec}/syntax/remark.yaml +13 -13
  45. data/{original/examples → spec}/syntax/remark_formatted.exp +0 -0
  46. data/{original/examples → spec}/syntax/single.exp +0 -0
  47. data/{original/examples → spec}/syntax/single.yaml +1 -1
  48. data/{original/examples → spec}/syntax/single_formatted.exp +0 -0
  49. data/{original/examples → spec}/syntax/single_formatted.yaml +1 -1
  50. data/{original/examples → spec}/syntax/syntax.exp +10 -10
  51. data/{original/examples → spec}/syntax/syntax.yaml +106 -106
  52. data/{original/examples → spec}/syntax/syntax_formatted.exp +10 -10
  53. data/{original/examples → spec}/syntax/syntax_hyperlink_formatted.exp +10 -10
  54. data/{original/examples → spec}/syntax/syntax_schema_head_formatted.exp +0 -0
  55. metadata +37 -85
  56. data/lib/expressir/express.rb +0 -11
  57. data/lib/expressir/express/aggregate_dimension.rb +0 -38
  58. data/lib/expressir/express/attribute.rb +0 -15
  59. data/lib/expressir/express/comment.rb +0 -7
  60. data/lib/expressir/express/defined_type.rb +0 -36
  61. data/lib/expressir/express/derived.rb +0 -65
  62. data/lib/expressir/express/derived_aggregate.rb +0 -43
  63. data/lib/expressir/express/entity.rb +0 -137
  64. data/lib/expressir/express/explicit.rb +0 -70
  65. data/lib/expressir/express/explicit_aggregate.rb +0 -46
  66. data/lib/expressir/express/explicit_or_derived.rb +0 -16
  67. data/lib/expressir/express/global_rule.rb +0 -44
  68. data/lib/expressir/express/interface_specification.rb +0 -51
  69. data/lib/expressir/express/interfaced_item.rb +0 -38
  70. data/lib/expressir/express/inverse.rb +0 -46
  71. data/lib/expressir/express/inverse_aggregate.rb +0 -37
  72. data/lib/expressir/express/model_element.rb +0 -7
  73. data/lib/expressir/express/named_type.rb +0 -19
  74. data/lib/expressir/express/remark.rb +0 -8
  75. data/lib/expressir/express/repository.rb +0 -306
  76. data/lib/expressir/express/schema_definition.rb +0 -96
  77. data/lib/expressir/express/subtype_constraint.rb +0 -14
  78. data/lib/expressir/express/type.rb +0 -26
  79. data/lib/expressir/express/type_aggregate.rb +0 -42
  80. data/lib/expressir/express/type_enum.rb +0 -29
  81. data/lib/expressir/express/type_parser.rb +0 -45
  82. data/lib/expressir/express/type_select.rb +0 -82
  83. data/lib/expressir/express/unique_rule.rb +0 -35
  84. data/lib/expressir/express/where_rule.rb +0 -32
  85. data/lib/expressir/express_parser.rb +0 -30
  86. data/lib/expressir/parser.rb +0 -6
  87. data/lib/expressir/parser/owl_parser.rb +0 -8
  88. data/spec/acceptance/express_to_owl_spec.rb +0 -18
  89. data/spec/expressir/express/repository_spec.rb +0 -25
  90. data/spec/expressir/express_exp/formatter_spec.rb +0 -127
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 88db9468c402096775bd62accb0f5fe8044da37e3fbcf87e1f36a5c1b4c4df58
4
- data.tar.gz: 1ae937f7d24a422d9adb5eef33c523485a67c38283f16bda6154e52b0cc1bb2b
3
+ metadata.gz: 524f9787ee132949519e6b56822b58eb0910ee495b72b3b1d69d86b4ca4a03fa
4
+ data.tar.gz: f5d17ab192c12b00ce3989cb3e99d4a28860a1a351378629f4b2c1a8b0c15f92
5
5
  SHA512:
6
- metadata.gz: fc0e1b1f5abab4c07f24cb7d47d6a707ba139496a7b553c22b96107776e37ec84f60edc46c9c05558b9388e682bdbbee126c08a5001a9ae1adabcbce51b7b773
7
- data.tar.gz: 8db9e5799d8bd2ab3533939220fc729ed00813379319beabbb1c629e8b53f598c649fe4246b295f16d9510e8d6d3a9344619f0a4925cf6a9c1aff0c0611d6ffb
6
+ metadata.gz: 596f14c10681fba0722411fa2e7faf6a05cc2672246966cab050555ac1c356d5ffb6da03b8f97db6b3f844a21a30771449fdeee1933df431698dd753d7cfc194
7
+ data.tar.gz: 8a400fb1f40afc39a884b7dd8d205a59d3e4fd771362c64c2d6bc0e46384568b7aa122a66ed13416b479fc8440f3d1ef8b0980a6ec3f5a9c1cf8e9db21467c8a
@@ -42,10 +42,10 @@ jobs:
42
42
 
43
43
  - uses: actions/cache@v2
44
44
  with:
45
- path: lib/expressir/express_exp/express_parser.*
46
- key: v3-${{ runner.os }}-${{ matrix.ruby }}-${{ hashFiles('ext/express-parser/extconf.rb', 'ext/express-parser/antlrgen/**', 'ext/express-parser/express_parser.cpp', '.git/modules/ext/express-parser/antlr4-upstream/HEAD') }}
45
+ path: lib/expressir/express/express_parser.*
46
+ key: v4-${{ runner.os }}-${{ matrix.ruby }}-${{ hashFiles('ext/express-parser/extconf.rb', 'ext/express-parser/antlrgen/**', 'ext/express-parser/express_parser.cpp', '.git/modules/ext/express-parser/antlr4-upstream/HEAD') }}
47
47
 
48
- - if: hashFiles('lib/expressir/express_exp/express_parser.*') == ''
48
+ - if: hashFiles('lib/expressir/express/express_parser.*') == ''
49
49
  run: bundle exec rake compile
50
50
 
51
51
  - run: bundle exec rake
data/.gitignore CHANGED
@@ -8,8 +8,8 @@
8
8
  /tmp/
9
9
  /Gemfile.lock
10
10
  /.idea
11
- /lib/expressir/express_exp/express_parser.bundle
12
- /original/examples/syntax/*-pretty.exp
11
+ /lib/expressir/express/express_parser.bundle
12
+ /spec/syntax/*-pretty.exp
13
13
 
14
14
  # rspec failure tracking
15
15
  .rspec_status
data/demo.rb CHANGED
@@ -1,18 +1,18 @@
1
1
  #!/usr/bin/env ruby
2
2
 
3
3
  require 'expressir'
4
- require 'expressir/express_exp/parser'
4
+ require 'expressir/express/parser'
5
5
 
6
6
  # This file is from:
7
7
  # https://github.com/metanorma/annotated-express/blob/master/data/resources/action_schema/action_schema.exp
8
8
  file = 'action_schema.exp'
9
9
 
10
- # repo = Expressir::ExpressExp::Parser.from_exp(file)
10
+ # repo = Expressir::Express::Parser.from_exp(file)
11
11
  # schema = repo.schemas.find{|schema| schema.id == "support_resource_schema"}
12
12
 
13
- repo = Expressir::ExpressExp::Parser.from_exp(file)
13
+ repo = Expressir::Express::Parser.from_exp(file)
14
14
  schema = repo.schemas.find{|schema| schema.id == "action_schema"}
15
15
  entity = schema.entities.find{|entity| entity.id == "action_directive_relationship"}
16
- where = entity.where.find{|where| where.id == "WR1"}
16
+ where_rule = entity.where_rules.find{|where_rule| where_rule.id == "WR1"}
17
17
 
18
- puts where.inspect
18
+ puts where_rule.inspect
data/exe/format CHANGED
@@ -1,17 +1,17 @@
1
1
  #!/usr/bin/env ruby
2
2
 
3
3
  require "yaml"
4
- require "expressir/express_exp/parser"
5
- require "expressir/express_exp/formatter"
6
- require "expressir/express_exp/schema_head_formatter"
7
- require "expressir/express_exp/hyperlink_formatter"
4
+ require "expressir/express/parser"
5
+ require "expressir/express/formatter"
6
+ require "expressir/express/schema_head_formatter"
7
+ require "expressir/express/hyperlink_formatter"
8
8
 
9
9
  exp_files = ARGV
10
10
 
11
- repository = Expressir::ExpressExp::Parser.from_files(exp_files)
12
- formatter = Class.new(Expressir::ExpressExp::Formatter) do
13
- include Expressir::ExpressExp::SchemaHeadFormatter
14
- include Expressir::ExpressExp::HyperlinkFormatter
11
+ repository = Expressir::Express::Parser.from_files(exp_files)
12
+ formatter = Class.new(Expressir::Express::Formatter) do
13
+ include Expressir::Express::SchemaHeadFormatter
14
+ include Expressir::Express::HyperlinkFormatter
15
15
  end
16
16
  result = repository.to_hash(formatter: formatter, skip_empty: true)
17
17
 
data/exe/format-test CHANGED
@@ -2,11 +2,11 @@
2
2
 
3
3
  require "yaml"
4
4
  require "tempfile"
5
- require "expressir/express_exp/parser"
6
- require "expressir/express_exp/formatter"
7
- require "expressir/express_exp/schema_head_formatter"
8
- require "expressir/express_exp/hyperlink_formatter"
9
- require "expressir/express_exp/cache"
5
+ require "expressir/express/parser"
6
+ require "expressir/express/formatter"
7
+ require "expressir/express/schema_head_formatter"
8
+ require "expressir/express/hyperlink_formatter"
9
+ require "expressir/express/cache"
10
10
 
11
11
  exp_files = [
12
12
  # basic test
@@ -53,17 +53,17 @@ exp_files = [
53
53
  ]
54
54
 
55
55
  start = Time.now
56
- repository = Expressir::ExpressExp::Parser.from_files(exp_files)
56
+ repository = Expressir::Express::Parser.from_files(exp_files)
57
57
  puts "Parser.from_files time: #{(Time.now - start).round(2)}s"
58
58
 
59
59
  temp_file = Tempfile.new
60
60
  begin
61
61
  start = Time.now
62
- Expressir::ExpressExp::Cache.to_file(temp_file, repository)
62
+ Expressir::Express::Cache.to_file(temp_file, repository)
63
63
  puts "Cache.to_file time: #{(Time.now - start).round(2)}s"
64
64
 
65
65
  start = Time.now
66
- repository = Expressir::ExpressExp::Cache.from_file(temp_file)
66
+ repository = Expressir::Express::Cache.from_file(temp_file)
67
67
  puts "Cache.from_file time: #{(Time.now - start).round(2)}s"
68
68
  ensure
69
69
  temp_file.close
@@ -71,9 +71,9 @@ ensure
71
71
  end
72
72
 
73
73
  start = Time.now
74
- formatter = Class.new(Expressir::ExpressExp::Formatter) do
75
- include Expressir::ExpressExp::SchemaHeadFormatter
76
- include Expressir::ExpressExp::HyperlinkFormatter
74
+ formatter = Class.new(Expressir::Express::Formatter) do
75
+ include Expressir::Express::SchemaHeadFormatter
76
+ include Expressir::Express::HyperlinkFormatter
77
77
  end
78
78
  result = repository.to_hash(formatter: formatter, skip_empty: true)
79
79
  puts "Repository.to_hash time: #{(Time.now - start).round(2)}s"
data/expressir.gemspec CHANGED
@@ -30,7 +30,6 @@ Gem::Specification.new do |spec|
30
30
 
31
31
  spec.extensions = File.join(*%w(ext express-parser extconf.rb))
32
32
 
33
- spec.add_runtime_dependency "nokogiri", "~> 1.10"
34
33
  spec.add_runtime_dependency "thor", "~> 1.0"
35
34
  spec.add_runtime_dependency "rice", "~> 3"
36
35
  spec.add_development_dependency "antlr4-native", "~> 1.1.0"
data/lib/expressir.rb CHANGED
@@ -2,7 +2,6 @@ require "expressir/version"
2
2
 
3
3
  require "expressir/cli"
4
4
  require "expressir/config"
5
- require "expressir/express"
6
5
 
7
6
  module Expressir
8
7
  class Error < StandardError; end
data/lib/expressir/cli.rb CHANGED
@@ -1,6 +1,5 @@
1
1
  require "thor"
2
2
  require "expressir/cli/ui"
3
- require "expressir/express_parser"
4
3
 
5
4
  module Expressir
6
5
  module Cli
@@ -17,11 +16,6 @@ module Expressir
17
16
  def version
18
17
  Cli.ui.say("Version #{Expressir::VERSION}")
19
18
  end
20
-
21
- desc "express-to-owl FILE", "Express to OWL conversion"
22
- def express_to_owl(file)
23
- Cli.ui.say(ExpressParser.to_owl(file))
24
- end
25
19
  end
26
20
  end
27
21
  end
@@ -3,7 +3,7 @@ require 'zlib'
3
3
  require 'expressir/model'
4
4
 
5
5
  module Expressir
6
- module ExpressExp
6
+ module Express
7
7
  class Cache
8
8
  def self.to_file(file, content, options = {})
9
9
  root_path = options[:root_path]
@@ -16,7 +16,7 @@ module Expressir
16
16
  content: content
17
17
  })
18
18
 
19
- hash = cache.to_hash(root_path: root_path, skip_empty: true)
19
+ hash = cache.to_hash(root_path: root_path)
20
20
  yaml = YAML.dump(hash)
21
21
  yaml_compressed = Zlib::Deflate.deflate(yaml)
22
22
 
@@ -35,14 +35,11 @@ module Expressir
35
35
  cache = Model::ModelElement.from_hash(hash, root_path: root_path)
36
36
 
37
37
  if cache.version != version
38
- raise CacheLoadError.new("Cache version mismatch, cache version is #{cache.version}, Expressir version is #{version}")
38
+ raise Error.new("Cache version mismatch, cache version is #{cache.version}, Expressir version is #{version}")
39
39
  end
40
40
 
41
41
  cache.content
42
42
  end
43
43
  end
44
-
45
- class CacheLoadError < StandardError
46
- end
47
44
  end
48
45
  end
@@ -1,7 +1,7 @@
1
1
  require 'expressir/model'
2
2
 
3
3
  module Expressir
4
- module ExpressExp
4
+ module Express
5
5
  class Formatter
6
6
  INDENT_CHAR = ' '
7
7
  INDENT_WIDTH = 2
@@ -68,12 +68,12 @@ module Expressir
68
68
  format_subtype_constraint(node)
69
69
  elsif node.is_a? Model::Type
70
70
  format_type(node)
71
- elsif node.is_a? Model::Unique
72
- format_unique(node)
71
+ elsif node.is_a? Model::UniqueRule
72
+ format_unique_rule(node)
73
73
  elsif node.is_a? Model::Variable
74
74
  format_variable(node)
75
- elsif node.is_a? Model::Where
76
- format_where(node)
75
+ elsif node.is_a? Model::WhereRule
76
+ format_where_rule(node)
77
77
  elsif node.is_a? Model::Expressions::AggregateInitializer
78
78
  format_expressions_aggregate_initializer(node)
79
79
  elsif node.is_a? Model::Expressions::AggregateItem
@@ -316,16 +316,16 @@ module Expressir
316
316
  indent(inverse_attributes.map{|x| format(x)}.join("\n")),
317
317
  ]
318
318
  end,
319
- *if node.unique.length > 0
319
+ *if node.unique_rules.length > 0
320
320
  [
321
321
  'UNIQUE',
322
- indent(node.unique.map{|x| format(x)}.join("\n"))
322
+ indent(node.unique_rules.map{|x| format(x)}.join("\n"))
323
323
  ]
324
324
  end,
325
- *if node.where.length > 0
325
+ *if node.where_rules.length > 0
326
326
  [
327
327
  'WHERE',
328
- indent(node.where.map{|x| format(x)}.join("\n")),
328
+ indent(node.where_rules.map{|x| format(x)}.join("\n")),
329
329
  ]
330
330
  end,
331
331
  [
@@ -576,10 +576,10 @@ module Expressir
576
576
  *if node.statements.length > 0
577
577
  indent(node.statements.map{|x| format(x)}.join("\n"))
578
578
  end,
579
- *if node.where.length > 0
579
+ *if node.where_rules.length > 0
580
580
  [
581
581
  'WHERE',
582
- indent(node.where.map{|x| format(x)}.join("\n"))
582
+ indent(node.where_rules.map{|x| format(x)}.join("\n"))
583
583
  ]
584
584
  end,
585
585
  [
@@ -720,13 +720,13 @@ module Expressir
720
720
  ' ',
721
721
  '=',
722
722
  ' ',
723
- format(node.type),
723
+ format(node.underlying_type),
724
724
  ';',
725
725
  ].join(''),
726
- *if node.where.length > 0
726
+ *if node.where_rules.length > 0
727
727
  [
728
728
  'WHERE',
729
- indent(node.where.map{|x| format(x)}.join("\n"))
729
+ indent(node.where_rules.map{|x| format(x)}.join("\n"))
730
730
  ]
731
731
  end,
732
732
  [
@@ -736,7 +736,7 @@ module Expressir
736
736
  ].join("\n")
737
737
  end
738
738
 
739
- def format_unique(node)
739
+ def format_unique_rule(node)
740
740
  [
741
741
  *if node.id
742
742
  [
@@ -769,7 +769,7 @@ module Expressir
769
769
  ].join('')
770
770
  end
771
771
 
772
- def format_where(node)
772
+ def format_where_rule(node)
773
773
  [
774
774
  *if node.id
775
775
  [
@@ -1299,38 +1299,41 @@ module Expressir
1299
1299
  ].join('')
1300
1300
  end,
1301
1301
  'ENUMERATION',
1302
- *if node.items.length > 0
1303
- item_indent = INDENT_CHAR * '('.length
1304
- [
1305
- ' ',
1306
- 'OF',
1307
- "\n",
1308
- indent([
1309
- '(',
1310
- node.items.map{|x| format(x)}.join(",\n#{item_indent}"),
1311
- ')'
1312
- ].join(''))
1313
- ].join('')
1314
- end,
1315
- *if node.extension_type
1302
+ *if node.based_on
1316
1303
  [
1317
1304
  ' ',
1318
1305
  'BASED_ON',
1319
1306
  ' ',
1320
- format(node.extension_type)
1307
+ format(node.based_on),
1308
+ *if node.items.length > 0
1309
+ item_indent = INDENT_CHAR * '('.length
1310
+ [
1311
+ ' ',
1312
+ 'WITH',
1313
+ "\n",
1314
+ indent([
1315
+ '(',
1316
+ node.items.map{|x| format(x)}.join(",\n#{item_indent}"),
1317
+ ')'
1318
+ ].join(''))
1319
+ ].join('')
1320
+ end
1321
1321
  ].join('')
1322
- end,
1323
- *if node.extension_items.length > 0
1324
- item_indent = INDENT_CHAR * '('.length
1322
+ else
1325
1323
  [
1326
- ' ',
1327
- 'WITH',
1328
- "\n",
1329
- indent([
1330
- '(',
1331
- node.extension_items.map{|x| format(x)}.join(",\n#{item_indent}"),
1332
- ')'
1333
- ].join(''))
1324
+ *if node.items.length > 0
1325
+ item_indent = INDENT_CHAR * '('.length
1326
+ [
1327
+ ' ',
1328
+ 'OF',
1329
+ "\n",
1330
+ indent([
1331
+ '(',
1332
+ node.items.map{|x| format(x)}.join(",\n#{item_indent}"),
1333
+ ')'
1334
+ ].join(''))
1335
+ ].join('')
1336
+ end
1334
1337
  ].join('')
1335
1338
  end
1336
1339
  ].join('')
@@ -1427,36 +1430,39 @@ module Expressir
1427
1430
  ].join('')
1428
1431
  end,
1429
1432
  'SELECT',
1430
- *if node.items.length > 0
1431
- item_indent = INDENT_CHAR * '('.length
1432
- [
1433
- "\n",
1434
- indent([
1435
- '(',
1436
- node.items.map{|x| format(x)}.join(",\n#{item_indent}"),
1437
- ')'
1438
- ].join(''))
1439
- ].join('')
1440
- end,
1441
- *if node.extension_type
1433
+ *if node.based_on
1442
1434
  [
1443
1435
  ' ',
1444
1436
  'BASED_ON',
1445
1437
  ' ',
1446
- format(node.extension_type)
1438
+ format(node.based_on),
1439
+ *if node.items.length > 0
1440
+ item_indent = INDENT_CHAR * '('.length
1441
+ [
1442
+ ' ',
1443
+ 'WITH',
1444
+ "\n",
1445
+ indent([
1446
+ '(',
1447
+ node.items.map{|x| format(x)}.join(",\n#{item_indent}"),
1448
+ ')'
1449
+ ].join(''))
1450
+ ].join('')
1451
+ end
1447
1452
  ].join('')
1448
- end,
1449
- *if node.extension_items.length > 0
1450
- item_indent = INDENT_CHAR * '('.length
1453
+ else
1451
1454
  [
1452
- ' ',
1453
- 'WITH',
1454
- "\n",
1455
- indent([
1456
- '(',
1457
- node.extension_items.map{|x| format(x)}.join(",\n#{item_indent}"),
1458
- ')'
1459
- ].join(''))
1455
+ *if node.items.length > 0
1456
+ item_indent = INDENT_CHAR * '('.length
1457
+ [
1458
+ "\n",
1459
+ indent([
1460
+ '(',
1461
+ node.items.map{|x| format(x)}.join(",\n#{item_indent}"),
1462
+ ')'
1463
+ ].join(''))
1464
+ ].join('')
1465
+ end
1460
1466
  ].join('')
1461
1467
  end
1462
1468
  ].join('')