testability-driver 0.9.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (214) hide show
  1. data/README +1 -0
  2. data/bin/start_app_perf +199 -0
  3. data/bin/tdriver-devtools +3 -0
  4. data/config/sut_parameters.rb +39 -0
  5. data/ext/extconf.rb +67 -0
  6. data/ext/native_extensions.c +70 -0
  7. data/lib/matti.rb +30 -0
  8. data/lib/tdriver-devtools/behaviour/old/xml/example/flick-example.rb +223 -0
  9. data/lib/tdriver-devtools/behaviour/old/xml/example/impl.rb_invalid +194 -0
  10. data/lib/tdriver-devtools/behaviour/old/xml/generate_behaviour_xml.rb +95 -0
  11. data/lib/tdriver-devtools/behaviour/old/xml/lib/tdriver_generator.rb +722 -0
  12. data/lib/tdriver-devtools/behaviour/old/xml/qdoc_generator.rb +321 -0
  13. data/lib/tdriver-devtools/behaviour/old/xml/templates/behaviour.method.template +43 -0
  14. data/lib/tdriver-devtools/behaviour/old/xml/templates/behaviour.module.template +54 -0
  15. data/lib/tdriver-devtools/behaviour/old/xml/templates/behaviour.xml.argument.template +7 -0
  16. data/lib/tdriver-devtools/behaviour/old/xml/templates/behaviour.xml.argument_type.template +7 -0
  17. data/lib/tdriver-devtools/behaviour/old/xml/templates/behaviour.xml.exception.template +5 -0
  18. data/lib/tdriver-devtools/behaviour/old/xml/templates/behaviour.xml.howto.line.template +2 -0
  19. data/lib/tdriver-devtools/behaviour/old/xml/templates/behaviour.xml.howto.template +5 -0
  20. data/lib/tdriver-devtools/behaviour/old/xml/templates/behaviour.xml.method.template +23 -0
  21. data/lib/tdriver-devtools/behaviour/old/xml/templates/behaviour.xml.template +14 -0
  22. data/lib/tdriver-devtools/behaviour/old/xml/update +3 -0
  23. data/lib/tdriver-devtools/behaviour/xml/generate.rb +88 -0
  24. data/lib/tdriver-devtools/behaviour/xml/rdoc_behaviour_xml_generator.rb +1924 -0
  25. data/lib/tdriver-devtools/behaviour/xml/templates/behaviour.xml.argument.default.template +1 -0
  26. data/lib/tdriver-devtools/behaviour/xml/templates/behaviour.xml.argument.template +3 -0
  27. data/lib/tdriver-devtools/behaviour/xml/templates/behaviour.xml.argument_type.template +4 -0
  28. data/lib/tdriver-devtools/behaviour/xml/templates/behaviour.xml.exception.template +4 -0
  29. data/lib/tdriver-devtools/behaviour/xml/templates/behaviour.xml.method.arguments.template +4 -0
  30. data/lib/tdriver-devtools/behaviour/xml/templates/behaviour.xml.method.deprecated.template +3 -0
  31. data/lib/tdriver-devtools/behaviour/xml/templates/behaviour.xml.method.exceptions.template +3 -0
  32. data/lib/tdriver-devtools/behaviour/xml/templates/behaviour.xml.method.info.template +1 -0
  33. data/lib/tdriver-devtools/behaviour/xml/templates/behaviour.xml.method.returns.template +3 -0
  34. data/lib/tdriver-devtools/behaviour/xml/templates/behaviour.xml.method.tables.template +3 -0
  35. data/lib/tdriver-devtools/behaviour/xml/templates/behaviour.xml.method.template +12 -0
  36. data/lib/tdriver-devtools/behaviour/xml/templates/behaviour.xml.returns.template +5 -0
  37. data/lib/tdriver-devtools/behaviour/xml/templates/behaviour.xml.table.item.template +1 -0
  38. data/lib/tdriver-devtools/behaviour/xml/templates/behaviour.xml.table.row.template +2 -0
  39. data/lib/tdriver-devtools/behaviour/xml/templates/behaviour.xml.table.template +8 -0
  40. data/lib/tdriver-devtools/behaviour/xml/templates/behaviour.xml.template +14 -0
  41. data/lib/tdriver-devtools/behaviour/xml_generator/example/flick-example.rb +245 -0
  42. data/lib/tdriver-devtools/behaviour/xml_generator/example/sut.rb +964 -0
  43. data/lib/tdriver-devtools/behaviour/xml_generator/generate.rb +68 -0
  44. data/lib/tdriver-devtools/behaviour/xml_generator/lib/custom_rdoc_generator.rb +1865 -0
  45. data/lib/tdriver-devtools/behaviour/xml_generator/templates/behaviour.xml.argument.default.template +1 -0
  46. data/lib/tdriver-devtools/behaviour/xml_generator/templates/behaviour.xml.argument.template +3 -0
  47. data/lib/tdriver-devtools/behaviour/xml_generator/templates/behaviour.xml.argument_type.template +4 -0
  48. data/lib/tdriver-devtools/behaviour/xml_generator/templates/behaviour.xml.exception.template +4 -0
  49. data/lib/tdriver-devtools/behaviour/xml_generator/templates/behaviour.xml.method.arguments.template +4 -0
  50. data/lib/tdriver-devtools/behaviour/xml_generator/templates/behaviour.xml.method.deprecated.template +3 -0
  51. data/lib/tdriver-devtools/behaviour/xml_generator/templates/behaviour.xml.method.exceptions.template +3 -0
  52. data/lib/tdriver-devtools/behaviour/xml_generator/templates/behaviour.xml.method.info.template +1 -0
  53. data/lib/tdriver-devtools/behaviour/xml_generator/templates/behaviour.xml.method.returns.template +3 -0
  54. data/lib/tdriver-devtools/behaviour/xml_generator/templates/behaviour.xml.method.tables.template +3 -0
  55. data/lib/tdriver-devtools/behaviour/xml_generator/templates/behaviour.xml.method.template +12 -0
  56. data/lib/tdriver-devtools/behaviour/xml_generator/templates/behaviour.xml.returns.template +5 -0
  57. data/lib/tdriver-devtools/behaviour/xml_generator/templates/behaviour.xml.table.item.template +1 -0
  58. data/lib/tdriver-devtools/behaviour/xml_generator/templates/behaviour.xml.table.row.template +2 -0
  59. data/lib/tdriver-devtools/behaviour/xml_generator/templates/behaviour.xml.table.template +7 -0
  60. data/lib/tdriver-devtools/behaviour/xml_generator/templates/behaviour.xml.template +14 -0
  61. data/lib/tdriver-devtools/behaviour/xml_generator/update +3 -0
  62. data/lib/tdriver-devtools/doc/behaviour_xml/QtExampleGestureBehaviour.xml +138 -0
  63. data/lib/tdriver-devtools/doc/behaviour_xml/created.rid +1 -0
  64. data/lib/tdriver-devtools/doc/behaviour_xml/tdriver.hash +1 -0
  65. data/lib/tdriver-devtools/doc/feature_xml/qt_widget_hold.feature.xml +9 -0
  66. data/lib/tdriver-devtools/doc/feature_xml/qt_widget_tap.feature.xml +9 -0
  67. data/lib/tdriver-devtools/doc/generate.rb +892 -0
  68. data/lib/tdriver-devtools/doc/update +1 -0
  69. data/lib/tdriver-devtools/doc/xslt/html.rb +7 -0
  70. data/lib/tdriver-devtools/doc/xslt/template.xsl +1861 -0
  71. data/lib/tdriver-devtools/doc/xslt/update +3 -0
  72. data/lib/tdriver-devtools/plugin/placeholder.txt +1 -0
  73. data/lib/tdriver-devtools/tdriver-devtools.rb +404 -0
  74. data/lib/tdriver-devtools/tests/feature_tests/example/flick-example.rb +233 -0
  75. data/lib/tdriver-devtools/tests/feature_tests/example/impl.rb +194 -0
  76. data/lib/tdriver-devtools/tests/feature_tests/generate.rb +82 -0
  77. data/lib/tdriver-devtools/tests/feature_tests/lib/custom_rdoc_generator.rb +468 -0
  78. data/lib/tdriver-devtools/tests/feature_tests/templates/feature_attribute.template +5 -0
  79. data/lib/tdriver-devtools/tests/feature_tests/templates/feature_method.template +5 -0
  80. data/lib/tdriver-devtools/tests/feature_tests/templates/scenario_attribute.template +5 -0
  81. data/lib/tdriver-devtools/tests/feature_tests/templates/scenario_method.template +5 -0
  82. data/lib/tdriver-devtools/tests/feature_tests/update +3 -0
  83. data/lib/tdriver.rb +26 -0
  84. data/lib/tdriver/base/behaviour/behaviour.rb +32 -0
  85. data/lib/tdriver/base/behaviour/behaviours/object_behaviour_composition.rb +94 -0
  86. data/lib/tdriver/base/behaviour/behaviours/object_behaviour_description.rb +262 -0
  87. data/lib/tdriver/base/behaviour/behaviours/object_composition.rb +111 -0
  88. data/lib/tdriver/base/behaviour/factory.rb +380 -0
  89. data/lib/tdriver/base/behaviour/loader.rb +28 -0
  90. data/lib/tdriver/base/command_data/command_data.rb +51 -0
  91. data/lib/tdriver/base/command_data/loader.rb +25 -0
  92. data/lib/tdriver/base/errors.rb +131 -0
  93. data/lib/tdriver/base/loader.rb +38 -0
  94. data/lib/tdriver/base/state_object.rb +270 -0
  95. data/lib/tdriver/base/sut/adapter.rb +28 -0
  96. data/lib/tdriver/base/sut/controller.rb +119 -0
  97. data/lib/tdriver/base/sut/factory.rb +287 -0
  98. data/lib/tdriver/base/sut/generic/behaviours/application.rb +243 -0
  99. data/lib/tdriver/base/sut/generic/behaviours/controller.rb +67 -0
  100. data/lib/tdriver/base/sut/generic/behaviours/find.rb +96 -0
  101. data/lib/tdriver/base/sut/generic/behaviours/flash_behaviour.rb +346 -0
  102. data/lib/tdriver/base/sut/generic/behaviours/sut.rb +1268 -0
  103. data/lib/tdriver/base/sut/generic/behaviours/switchbox_behaviour.rb +182 -0
  104. data/lib/tdriver/base/sut/generic/behaviours/verification.rb +119 -0
  105. data/lib/tdriver/base/sut/generic/commands/application.rb +219 -0
  106. data/lib/tdriver/base/sut/generic/commands/key_sequence.rb +82 -0
  107. data/lib/tdriver/base/sut/generic/commands/screen_capture.rb +58 -0
  108. data/lib/tdriver/base/sut/generic/plugin.rb +96 -0
  109. data/lib/tdriver/base/sut/loader.rb +35 -0
  110. data/lib/tdriver/base/sut/sut.rb +67 -0
  111. data/lib/tdriver/base/test_object/abstract.rb +179 -0
  112. data/lib/tdriver/base/test_object/behaviours/syncronization.rb +94 -0
  113. data/lib/tdriver/base/test_object/behaviours/test_object.rb +787 -0
  114. data/lib/tdriver/base/test_object/factory.rb +618 -0
  115. data/lib/tdriver/base/test_object/identificator.rb +511 -0
  116. data/lib/tdriver/base/test_object/loader.rb +37 -0
  117. data/lib/tdriver/env.rb +21 -0
  118. data/lib/tdriver/loader.rb +36 -0
  119. data/lib/tdriver/matti.rb +35 -0
  120. data/lib/tdriver/report/error_recovery/tdriver_custom_error_recovery.rb +83 -0
  121. data/lib/tdriver/report/error_recovery/tdriver_error_recovery.rb +158 -0
  122. data/lib/tdriver/report/error_recovery/tdriver_error_recovery_settings.rb +98 -0
  123. data/lib/tdriver/report/report.rb +47 -0
  124. data/lib/tdriver/report/report_api.rb +207 -0
  125. data/lib/tdriver/report/report_combine.rb +86 -0
  126. data/lib/tdriver/report/report_crash_file_capture.rb +167 -0
  127. data/lib/tdriver/report/report_creator.rb +571 -0
  128. data/lib/tdriver/report/report_cucumber.rb +158 -0
  129. data/lib/tdriver/report/report_cucumber_listener.rb +337 -0
  130. data/lib/tdriver/report/report_cucumber_reporter.rb +335 -0
  131. data/lib/tdriver/report/report_data_presentation.rb +152 -0
  132. data/lib/tdriver/report/report_data_table.rb +64 -0
  133. data/lib/tdriver/report/report_execution_statistics.rb +284 -0
  134. data/lib/tdriver/report/report_file_capture.rb +159 -0
  135. data/lib/tdriver/report/report_grouping.rb +539 -0
  136. data/lib/tdriver/report/report_junit_xml.rb +147 -0
  137. data/lib/tdriver/report/report_rspec.rb +108 -0
  138. data/lib/tdriver/report/report_test_case_run.rb +621 -0
  139. data/lib/tdriver/report/report_test_run.rb +1286 -0
  140. data/lib/tdriver/report/report_test_unit.rb +175 -0
  141. data/lib/tdriver/report/report_writer.rb +1405 -0
  142. data/lib/tdriver/tdriver.rb +158 -0
  143. data/lib/tdriver/util/common.rb +24 -0
  144. data/lib/tdriver/util/common/array.rb +39 -0
  145. data/lib/tdriver/util/common/crc16.rb +100 -0
  146. data/lib/tdriver/util/common/environment.rb +153 -0
  147. data/lib/tdriver/util/common/error.rb +39 -0
  148. data/lib/tdriver/util/common/file.rb +315 -0
  149. data/lib/tdriver/util/common/gem.rb +108 -0
  150. data/lib/tdriver/util/common/kernel.rb +189 -0
  151. data/lib/tdriver/util/common/loader.rb +39 -0
  152. data/lib/tdriver/util/common/retryable.rb +98 -0
  153. data/lib/tdriver/util/common/string.rb +77 -0
  154. data/lib/tdriver/util/dbaccess/dbaccess.rb +188 -0
  155. data/lib/tdriver/util/dbaccess/dbconnection.rb +41 -0
  156. data/lib/tdriver/util/dbaccess/error.rb +35 -0
  157. data/lib/tdriver/util/dbaccess/loader.rb +29 -0
  158. data/lib/tdriver/util/dynamic_attribute_filter.rb +182 -0
  159. data/lib/tdriver/util/hooking.rb +434 -0
  160. data/lib/tdriver/util/loader.rb +65 -0
  161. data/lib/tdriver/util/localisation.rb +24 -0
  162. data/lib/tdriver/util/localisation/error.rb +32 -0
  163. data/lib/tdriver/util/localisation/loader.rb +28 -0
  164. data/lib/tdriver/util/localisation/localisation.rb +479 -0
  165. data/lib/tdriver/util/logger.rb +377 -0
  166. data/lib/tdriver/util/operator_data/error.rb +29 -0
  167. data/lib/tdriver/util/operator_data/loader.rb +26 -0
  168. data/lib/tdriver/util/operator_data/operator_data.rb +93 -0
  169. data/lib/tdriver/util/other/config.rb +221 -0
  170. data/lib/tdriver/util/parameter.rb +24 -0
  171. data/lib/tdriver/util/parameter/error.rb +45 -0
  172. data/lib/tdriver/util/parameter/loader.rb +37 -0
  173. data/lib/tdriver/util/parameter/parameter.rb +285 -0
  174. data/lib/tdriver/util/parameter/parameter_hash.rb +101 -0
  175. data/lib/tdriver/util/parameter/parameter_template.rb +120 -0
  176. data/lib/tdriver/util/parameter/parameter_user_api.rb +84 -0
  177. data/lib/tdriver/util/parameter/parameter_xml.rb +247 -0
  178. data/lib/tdriver/util/plugin/abstract.rb +60 -0
  179. data/lib/tdriver/util/plugin/error.rb +25 -0
  180. data/lib/tdriver/util/plugin/loader.rb +28 -0
  181. data/lib/tdriver/util/plugin/service.rb +200 -0
  182. data/lib/tdriver/util/recorder.rb +292 -0
  183. data/lib/tdriver/util/stats.rb +90 -0
  184. data/lib/tdriver/util/user_data/error.rb +29 -0
  185. data/lib/tdriver/util/user_data/loader.rb +26 -0
  186. data/lib/tdriver/util/user_data/user_data.rb +103 -0
  187. data/lib/tdriver/util/video_rec.rb +264 -0
  188. data/lib/tdriver/util/xml/abstraction.rb +47 -0
  189. data/lib/tdriver/util/xml/builder.rb +54 -0
  190. data/lib/tdriver/util/xml/document.rb +32 -0
  191. data/lib/tdriver/util/xml/element.rb +32 -0
  192. data/lib/tdriver/util/xml/error.rb +46 -0
  193. data/lib/tdriver/util/xml/loader.rb +46 -0
  194. data/lib/tdriver/util/xml/nil_element.rb +89 -0
  195. data/lib/tdriver/util/xml/nodeset.rb +32 -0
  196. data/lib/tdriver/util/xml/parsers/libxml/libxml.rb +140 -0
  197. data/lib/tdriver/util/xml/parsers/loader.rb +22 -0
  198. data/lib/tdriver/util/xml/parsers/nokogiri/abstraction.rb +111 -0
  199. data/lib/tdriver/util/xml/parsers/nokogiri/attribute.rb +54 -0
  200. data/lib/tdriver/util/xml/parsers/nokogiri/builder.rb +58 -0
  201. data/lib/tdriver/util/xml/parsers/nokogiri/document.rb +58 -0
  202. data/lib/tdriver/util/xml/parsers/nokogiri/element.rb +147 -0
  203. data/lib/tdriver/util/xml/parsers/nokogiri/loader.rb +42 -0
  204. data/lib/tdriver/util/xml/parsers/nokogiri/nodeset.rb +187 -0
  205. data/lib/tdriver/util/xml/xml.rb +170 -0
  206. data/lib/tdriver/verify/verify.rb +687 -0
  207. data/lib/tdriver/verify/verify.rb_org +630 -0
  208. data/lib/tdriver/version.rb +21 -0
  209. data/xml/behaviours/generic.xml +495 -0
  210. data/xml/defaults/generic.xml +97 -0
  211. data/xml/defaults/sut_generic.xml +36 -0
  212. data/xml/parameters/tdriver_parameters.xml +23 -0
  213. data/xml/templates/generic.xml +227 -0
  214. metadata +327 -0
@@ -0,0 +1,65 @@
1
+ ############################################################################
2
+ ##
3
+ ## Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
4
+ ## All rights reserved.
5
+ ## Contact: Nokia Corporation (testabilitydriver@nokia.com)
6
+ ##
7
+ ## This file is part of Testability Driver.
8
+ ##
9
+ ## If you have questions regarding the use of this file, please contact
10
+ ## Nokia at testabilitydriver@nokia.com .
11
+ ##
12
+ ## This library is free software; you can redistribute it and/or
13
+ ## modify it under the terms of the GNU Lesser General Public
14
+ ## License version 2.1 as published by the Free Software Foundation
15
+ ## and appearing in the file LICENSE.LGPL included in the packaging
16
+ ## of this file.
17
+ ##
18
+ ############################################################################
19
+
20
+
21
+ require 'singleton'
22
+ require 'rubygems'
23
+
24
+ # Hooking module - should be loaded first due to above modules uses its functions
25
+ require File.expand_path( File.join( File.dirname( __FILE__ ), 'hooking.rb' ) )
26
+
27
+ # generic/common utility modules
28
+ require File.expand_path( File.join( File.dirname( __FILE__ ), 'common/loader.rb' ) )
29
+
30
+ # Logger module
31
+ require File.expand_path( File.join( File.dirname( __FILE__ ), 'logger.rb' ) )
32
+
33
+ # Parameter modules
34
+ require File.expand_path( File.join( File.dirname( __FILE__ ), 'xml/loader.rb' ) )
35
+
36
+ # Statistics module
37
+ require File.expand_path( File.join( File.dirname( __FILE__ ), 'stats.rb' ) )
38
+
39
+ # Dynamic attribute filter module
40
+ require File.expand_path( File.join( File.dirname( __FILE__ ), 'dynamic_attribute_filter' ) )
41
+
42
+ # Plugin service & abstract class
43
+ require File.expand_path( File.join( File.dirname( __FILE__ ), 'plugin/loader.rb' ) )
44
+
45
+ # Parameter modules
46
+ require File.expand_path( File.join( File.dirname( __FILE__ ), 'parameter/loader.rb' ) )
47
+
48
+ # DBAccess module
49
+ require File.expand_path( File.join( File.dirname( __FILE__ ), 'dbaccess/loader.rb' ) )
50
+
51
+ # Localisation module
52
+ require File.expand_path( File.join( File.dirname( __FILE__ ), 'localisation/loader.rb' ) )
53
+
54
+ # User Data module
55
+ require File.expand_path( File.join( File.dirname( __FILE__ ), 'user_data/loader.rb' ) )
56
+
57
+ # Operator Data module
58
+ require File.expand_path( File.join( File.dirname( __FILE__ ), 'operator_data/loader.rb' ) )
59
+
60
+ # Recorder module
61
+ require File.expand_path( File.join( File.dirname( __FILE__ ), 'recorder.rb' ) )
62
+
63
+ # Video rec module
64
+ require File.expand_path( File.join( File.dirname( __FILE__ ), 'video_rec.rb' ) )
65
+
@@ -0,0 +1,24 @@
1
+ ############################################################################
2
+ ##
3
+ ## Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
4
+ ## All rights reserved.
5
+ ## Contact: Nokia Corporation (testabilitydriver@nokia.com)
6
+ ##
7
+ ## This file is part of Testability Driver.
8
+ ##
9
+ ## If you have questions regarding the use of this file, please contact
10
+ ## Nokia at testabilitydriver@nokia.com .
11
+ ##
12
+ ## This library is free software; you can redistribute it and/or
13
+ ## modify it under the terms of the GNU Lesser General Public
14
+ ## License version 2.1 as published by the Free Software Foundation
15
+ ## and appearing in the file LICENSE.LGPL included in the packaging
16
+ ## of this file.
17
+ ##
18
+ ############################################################################
19
+
20
+
21
+ STDOUT.puts "Please require 'util/localisation/loader.rb' instead of 'util/localisation.rb'"
22
+
23
+ require File.expand_path( File.join( File.dirname( __FILE__ ), 'localisation/loader.rb' ) )
24
+
@@ -0,0 +1,32 @@
1
+ ############################################################################
2
+ ##
3
+ ## Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
4
+ ## All rights reserved.
5
+ ## Contact: Nokia Corporation (testabilitydriver@nokia.com)
6
+ ##
7
+ ## This file is part of Testability Driver.
8
+ ##
9
+ ## If you have questions regarding the use of this file, please contact
10
+ ## Nokia at testabilitydriver@nokia.com .
11
+ ##
12
+ ## This library is free software; you can redistribute it and/or
13
+ ## modify it under the terms of the GNU Lesser General Public
14
+ ## License version 2.1 as published by the Free Software Foundation
15
+ ## and appearing in the file LICENSE.LGPL included in the packaging
16
+ ## of this file.
17
+ ##
18
+ ############################################################################
19
+
20
+
21
+ module MobyUtil
22
+
23
+ # This error should be raised when referred language is not found
24
+ class LanguageNotFoundError < CustomError; end;
25
+
26
+ # This error should be raised when referred table is not found
27
+ class TableNotFoundError < CustomError; end;
28
+
29
+ # This error should be raised when referred logical name is not found for specified language
30
+ class LogicalNameNotFoundError < CustomError; end;
31
+
32
+ end
@@ -0,0 +1,28 @@
1
+ ############################################################################
2
+ ##
3
+ ## Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
4
+ ## All rights reserved.
5
+ ## Contact: Nokia Corporation (testabilitydriver@nokia.com)
6
+ ##
7
+ ## This file is part of Testability Driver.
8
+ ##
9
+ ## If you have questions regarding the use of this file, please contact
10
+ ## Nokia at testabilitydriver@nokia.com .
11
+ ##
12
+ ## This library is free software; you can redistribute it and/or
13
+ ## modify it under the terms of the GNU Lesser General Public
14
+ ## License version 2.1 as published by the Free Software Foundation
15
+ ## and appearing in the file LICENSE.LGPL included in the packaging
16
+ ## of this file.
17
+ ##
18
+ ############################################################################
19
+
20
+
21
+
22
+
23
+ # localisation related errors
24
+ require File.expand_path( File.join( File.dirname( __FILE__ ), 'error.rb' ) )
25
+
26
+ # localisation module implementation
27
+ require File.expand_path( File.join( File.dirname( __FILE__ ), 'localisation.rb' ) )
28
+
@@ -0,0 +1,479 @@
1
+ ############################################################################
2
+ ##
3
+ ## Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
4
+ ## All rights reserved.
5
+ ## Contact: Nokia Corporation (testabilitydriver@nokia.com)
6
+ ##
7
+ ## This file is part of Testability Driver.
8
+ ##
9
+ ## If you have questions regarding the use of this file, please contact
10
+ ## Nokia at testabilitydriver@nokia.com .
11
+ ##
12
+ ## This library is free software; you can redistribute it and/or
13
+ ## modify it under the terms of the GNU Lesser General Public
14
+ ## License version 2.1 as published by the Free Software Foundation
15
+ ## and appearing in the file LICENSE.LGPL included in the packaging
16
+ ## of this file.
17
+ ##
18
+ ############################################################################
19
+
20
+ require 'nokogiri'
21
+
22
+ # Utility for handling localisation database
23
+
24
+ module MobyUtil
25
+
26
+ class Localisation
27
+
28
+ # == description
29
+ # Function to fetch a translation for a given logical name from the localisation DB
30
+ #
31
+ # == arguments
32
+ # logical_name
33
+ # String
34
+ # description: Logical name (LNAME) of the item to be translated. If prefix for User Information or Operator Data are used then the appropiate retrieve methods will be called
35
+ # example: "txt_button_ok"
36
+ # Symbol
37
+ # description: Symbol form of the logical name (LNAME) of the item to be translated.
38
+ # example: :txt_button_ok
39
+ #
40
+ # language
41
+ # String
42
+ # description: Name of the language column to be used. This is normally the language code found on the .ts or .qm translation files
43
+ # example: "en"
44
+ #
45
+ # table_name
46
+ # String
47
+ # description: Name of the translation table to use from the localisation DB
48
+ # example: "B10_1_week201042_loc"
49
+ #
50
+ # file_name
51
+ # String
52
+ # description: Optional FNAME search argument for the translation. The FNAME column stores the application name that the translation belongs to
53
+ # example: "calendar"
54
+ #
55
+ # plurality
56
+ # String
57
+ # description: Optional PLURALITY search argument for the translation
58
+ # example: "a" or "singular"
59
+ #
60
+ # lengthvariant
61
+ # String
62
+ # description: Optional LENGTHVAR search argument for the translation (1-9)
63
+ # example: "1"
64
+ #
65
+ # == returns
66
+ # String
67
+ # description: Translation matching the logical_name
68
+ # example: "Ok"
69
+ # Array
70
+ # description: If multiple translations have been found for the search conditions an Array with all Strings be returned
71
+ # example: ["Ok", "OK"]
72
+ #
73
+ # == exceptions
74
+ # LanguageNotFoundError
75
+ # description: In case language is not found
76
+ #
77
+ # LogicalNameNotFoundError
78
+ # description: In case no logical name is not found for current language
79
+ #
80
+ # TableNotFoundError
81
+ # description: If the table name argument is not valid
82
+ #
83
+ # SqlError
84
+ # description: In case there are problems with the database connectivity
85
+ #
86
+ def self.translation( logical_name, language, table_name, file_name = nil , plurality = nil, lengthvariant = nil )
87
+
88
+ Kernel::raise LogicalNameNotFoundError.new( "Logical name cannot be nil" ) if logical_name == nil
89
+ Kernel::raise LanguageNotFoundError.new( "Language cannot be nil" ) if language == nil
90
+ Kernel::raise TableNotFoundError.new( "Table name cannot be nil" ) if table_name == nil
91
+
92
+ # Avoid system column names for language columns and user only downcase
93
+ language = language.to_s.downcase
94
+ if language.eql? "id" or language.eql? "fname" or language.eql? "lname" or language.eql? "plurality" or language.eql? "lengthvar"
95
+ language += "_"
96
+ end
97
+
98
+ db_type = MobyUtil::Parameter[ :localisation_db_type, nil ]
99
+ host = MobyUtil::Parameter[ :localisation_server_ip ]
100
+ username = MobyUtil::Parameter[ :localisation_server_username ]
101
+ password = MobyUtil::Parameter[ :localisation_server_password ]
102
+ database_name = MobyUtil::Parameter[ :localisation_server_database_name ]
103
+
104
+ db_connection = DBConnection.new( db_type, host, database_name, username, password )
105
+
106
+ query_string = "select `#{ language }` from #{ table_name } where lname = '#{ logical_name }'"
107
+ query_string += " and `FNAME` = '#{ file_name }'" unless file_name.nil?
108
+ query_string += " and `PLURALITY` = '#{ plurality }'" unless plurality.nil?
109
+ query_string += " and `LENGTHVAR` = '#{ lengthvariant }'" unless lengthvariant.nil?
110
+ query_string += " and `#{ language }` <> \'#MISSING\'"
111
+
112
+ begin
113
+ # Returns a uniform set of results as an array of rows, rows beeing an array of values ( Array<Array<String>> )
114
+ result = MobyUtil::DBAccess.query( db_connection, query_string )
115
+ rescue
116
+ # if column referring to language is not found then Kernel::raise error for language not found
117
+ Kernel::raise LanguageNotFoundError.new( "No language '#{ language }' found" ) unless $!.message.index( "Unknown column" ) == nil
118
+ Kernel::raise SqlError.new( $!.message )
119
+ end
120
+
121
+ # Return only the first column of the row or and array of the values of the first column if multiple rows have been found
122
+ Kernel::raise LogicalNameNotFoundError.new( "No translation found for logical name '#{ logical_name }' in language '#{ language }' with given plurality and lengthvariant." ) if ( result.empty?)
123
+ if result.length > 1
124
+ # Result is an Array of rows (Array<String>)! We want the first column of each row.
125
+ result_array = Array.new
126
+ result.each do |row|
127
+ result_array << row[0]
128
+ end
129
+ return result_array
130
+ else
131
+ # Result is an Array of rows (Array<String>)! We want the first column of the first row.
132
+ return result[0][0]
133
+ end
134
+
135
+ end
136
+
137
+ # == description
138
+ # Function upload translations in a given Qt Linguist translation file to the localisation DB
139
+ #
140
+ # == arguments
141
+ # file
142
+ # String
143
+ # description: Path to Qt Linguist translation file to upload. Both .ts and .qm files are allowed.
144
+ # example: "accessories_ar.ts"
145
+ #
146
+ # table_name
147
+ # String
148
+ # description: Name of the translation table to use form the localisation DB
149
+ # example: "B10_1_week201042_loc"
150
+ #
151
+ # db_connection
152
+ # MobyUtil::DBConnection
153
+ # description: A DBConnection object contains all the connection details required to connect to a SQL DB (mysql or sqlite)
154
+ # example: "MobyUtil::DBConnection.new('mysql', '192.168.0.1', 'tdriver_locale', 'username', 'password')"
155
+ #
156
+ # column_names_map
157
+ # Hash
158
+ # description: Hash with the language codes from the translation files as keys and the desired column names as values
159
+ # example: {"en" => "en_GB"}
160
+ #
161
+ # record_sql
162
+ # Bool
163
+ # description: When this flag is set to true then
164
+ # example: true
165
+ #
166
+ # == returns
167
+ #
168
+ # == throws
169
+ # ArgumentError
170
+ # description: When arguments provided are not valid
171
+ #
172
+ # Exception
173
+ # description: When its not possible to parse the file provided
174
+ #
175
+ def self.upload_translation_file( file, table_name, db_connection = nil, column_names_map = {}, record_sql = false)
176
+ Kernel::raise ArgumentError.new("") if file.nil? or file.empty?
177
+ Kernel::raise ArgumentError.new("") if table_name.nil? or table_name.empty?
178
+
179
+ # Get a connection to the DB
180
+ if db_connection.nil? or !db_connection.kind_of? MobyUtil::DBConnection
181
+ db_type = MobyUtil::Parameter[ :localisation_db_type ]
182
+ host = MobyUtil::Parameter[ :localisation_server_ip ]
183
+ database_name = MobyUtil::Parameter[ :localisation_server_database_name ]
184
+ username = MobyUtil::Parameter[ :localisation_server_username ]
185
+ password = MobyUtil::Parameter[ :localisation_server_password ]
186
+
187
+ db_connection = DBConnection.new( db_type, host, database_name, username, password )
188
+ end
189
+ # Check File and convert to TS File if needed
190
+ tsFile = MobyUtil::Localisation.convert_to_ts( file )
191
+ Kernel::raise Exception.new("Failed to convert #{file} to .ts") if tsFile == nil
192
+ # Collect data for INSERT query from TS File
193
+ language, data = MobyUtil::Localisation.parse_ts_file( tsFile, column_names_map )
194
+ Kernel::raise Exception.new("Error while parsing #{file}.") if language == nil or data == ""
195
+ # Upload language data to DB for current language file
196
+ MobyUtil::Localisation.upload_ts_data( language, data, table_name, db_connection, record_sql )
197
+ end
198
+
199
+
200
+
201
+ private
202
+
203
+
204
+ # == description
205
+ # Checks Qt Linguist translation file for validity and converts to TS if needed
206
+ #
207
+ # == arguments
208
+ # file
209
+ # String
210
+ # description: Name (and path) of the Qt Linguist translation file (.ts or .qm)
211
+ # example: "calendar.qm"
212
+ #
213
+ # == returns
214
+ # String
215
+ # description: Name (and path) of the checked and maybe converted .ts Qt Linguist translation file
216
+ #
217
+ # == throws
218
+ #
219
+ def self.convert_to_ts(file)
220
+ if !File.exists?(file)
221
+ puts "[WARNING] File '" + file + "' not found. Skiping."
222
+ file = nil
223
+ elsif (nil == file.match(/.*\.ts/) and nil == file.match(/.*\.qm/) )
224
+ puts "[WARNING] Unknown file extension. Skiping. \n\n" + file
225
+ file = nil
226
+ elsif ( match = file.match(/(.*)\.qm/) )
227
+ if(! system "lconvert -o " + match[1] + ".ts " + file )
228
+ puts "[ERROR] lconvert can't convert .qm file to .ts. Skiping. \n\n" + match[0]
229
+ return nil
230
+ end
231
+ file = match[1] + ".ts"
232
+ end
233
+ file
234
+ end
235
+
236
+
237
+ # == description
238
+ # Extracts translation data from TS file
239
+ #
240
+ # == arguments
241
+ # file
242
+ # String
243
+ # description: Name (and path) of the Qt Linguist translation file (.ts or .qm)
244
+ # example: "calendar.qm"
245
+ #
246
+ # column_names_map
247
+ # Hash
248
+ # description: Hash with the language codes from the translation files as keys and the desired column names as values
249
+ # example: {"en" => "en_GB"}
250
+ #
251
+ # == returns
252
+ # String
253
+ # description: Name (and path) of the checked and maybe converted .ts Qt Linguist translation file
254
+ #
255
+ # Array
256
+ # description: Two dimentional Array with columns [ FNAME, Source, Translation, Plurality, Lengthvariant Priority ]
257
+ #
258
+ # == throws
259
+ #
260
+ def self.parse_ts_file(file, column_names_map = {} )
261
+ # Read TS file
262
+ open_file = File.new( file )
263
+ doc = Nokogiri.XML( open_file )
264
+ language = doc.xpath('.//TS').attribute("language")
265
+ # IF filename-to-columnname mapping is provided update language
266
+ fname = parseFName(file)
267
+ if (!column_names_map.empty?)
268
+ language_code = file.split('/').last.gsub(fname + "_" ){|s| ""}.gsub(".ts"){|s| ""}
269
+ language = column_names_map[ language_code ] if column_names_map.key?( language_code )
270
+ end
271
+ if (language == nil)
272
+ puts "[WARNING] The input file is missing the language attribute on it's <TS> element. Skiping. \n\n"
273
+ return nil, nil
274
+ end
275
+ # Collect data for INSERT query
276
+ data = []
277
+ doc.xpath('.//message').each do |node|
278
+ begin
279
+ nodeId = ""
280
+ nodeTranslation = ""
281
+ nodePlurality = ""
282
+ nodeLengthVar = ""
283
+ # set nodeId
284
+ #raise Exception if node.xpath('@id').inner_text() == ""
285
+ if node.xpath('@id').inner_text() != ""
286
+ nodeId = node.xpath('@id').inner_text()
287
+ else
288
+ nodeId = node.xpath('.//source').inner_text()
289
+ end
290
+ # Parse Numerus(LengthVar), or Numerus or LengthVar or translation direclty
291
+ if ! node.xpath('.//translation/numerusform').empty?
292
+ # puts ">>> Numerusform"
293
+ node.xpath('.//translation/numerusform').each do |numerus|
294
+ nodePlurality = numerus.xpath('@plurality').inner_text()
295
+ if ! numerus.xpath('.//lengthvariant').empty?
296
+ # puts " >>> Lengthvar"
297
+ numerus.xpath('.//lengthvariant').each do |lenghtvar|
298
+ nodeLengthVar = lenghtvar.xpath('@priority').inner_text()
299
+ nodeTranslation = lenghtvar.inner_text()
300
+ data << [ fname, nodeId, nodeTranslation, nodePlurality, nodeLengthVar ]
301
+ end
302
+ else
303
+ nodeTranslation = numerus.inner_text()
304
+ data << [ fname, nodeId, nodeTranslation, nodePlurality, nodeLengthVar ]
305
+ end
306
+ end
307
+ elsif ! node.xpath('.//translation/lengthvariant').empty?
308
+ # puts ">>> Lengthvar"
309
+ priority = 1
310
+ node.xpath('.//translation/lengthvariant').each do |lenghtvar|
311
+ nodeLengthVar = lenghtvar.xpath('@priority').inner_text()
312
+ nodeLengthVar = priority.to_s if nodeLengthVar.empty?
313
+ nodeTranslation = lenghtvar.inner_text()
314
+ data << [ fname, nodeId, nodeTranslation, nodePlurality, nodeLengthVar ]
315
+ priority += 1
316
+ end
317
+ else
318
+ # puts ">>> Translation"
319
+ nodeTranslation = node.xpath('.//translation').inner_text()
320
+ data << [ fname, nodeId, nodeTranslation, nodePlurality, nodeLengthVar ]
321
+ end
322
+ rescue Exception # ignores bad elements or elements with empty translations for now
323
+ end
324
+ end
325
+ open_file.close
326
+ return language, data
327
+ end
328
+
329
+
330
+ # == description
331
+ # Uploads language data to Localisation DB and optionally records the sql queries on a file
332
+ #
333
+ def self.upload_ts_data( language, data, table_name, db_connection, record_sql = false )
334
+
335
+ raise Exception.new("Language not provided.") if language.nil? or language.to_s.empty?
336
+ raise Exception.new("No data povided. Please make sure the source of your data is valid.") if data.nil? or data.empty?
337
+ raise Exception.new("No table name provided.") if table_name.nil? or table_name.empty?
338
+ raise Exception.new("Invalid connection object provided.") if db_connection.nil? or !db_connection.kind_of? MobyUtil::DBConnection
339
+
340
+ # Avoid system column names for language columns and user only downcase
341
+ language = language.to_s.downcase
342
+ if language.eql? "id" or language.eql? "fname" or language.eql? "lname" or language.eql? "plurality" or language.eql? "lengthvar"
343
+ language += "_"
344
+ end
345
+
346
+ sql_file = File.open(table_name + ".#{db_connection.db_type}.sql", 'a') if record_sql
347
+
348
+ # CREATE TABLE if doesn't exist (language columns to be created as needed)
349
+ case db_connection.db_type
350
+ when "mysql"
351
+ query_string = "CREATE TABLE IF NOT EXISTS " + table_name + " (
352
+ `ID` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
353
+ `FNAME` VARCHAR(150) NOT NULL COLLATE latin1_general_ci,
354
+ `LNAME` VARCHAR(150) NOT NULL COLLATE latin1_general_ci,
355
+ `PLURALITY` VARCHAR(50) COLLATE latin1_general_ci,
356
+ `LENGTHVAR` INT(10),
357
+ PRIMARY KEY (`ID`),
358
+ UNIQUE INDEX `FileLogicNameIndex` (`FNAME`,`LNAME`, `PLURALITY`, `LENGTHVAR`),
359
+ INDEX `LNameIndex` (`LNAME`)
360
+ ) COLLATE=utf8_general_ci;"
361
+ MobyUtil::DBAccess.query( db_connection, query_string )
362
+ sql_file.write( query_string + "\n" ) if record_sql
363
+ when "sqlite"
364
+ query_string = "CREATE TABLE IF NOT EXISTS " + table_name + " (
365
+ `ID` INTEGER PRIMARY KEY AUTOINCREMENT,
366
+ `FNAME` VARCHAR(150) NOT NULL,
367
+ `LNAME` VARCHAR(150) NOT NULL,
368
+ `PLURALITY` VARCHAR(50),
369
+ `LENGTHVAR` INT(10));"
370
+ MobyUtil::DBAccess.query( db_connection, query_string )
371
+ sql_file.write( query_string + "\n" ) if record_sql
372
+
373
+ query_string = "CREATE UNIQUE INDEX IF NOT EXISTS 'FileLogicNameIndex' ON " + table_name + " (`FNAME`,`LNAME`, `PLURALITY`, `LENGTHVAR`);"
374
+ MobyUtil::DBAccess.query( db_connection, query_string )
375
+ sql_file.write( query_string + "\n" ) if record_sql
376
+
377
+ query_string = "CREATE INDEX IF NOT EXISTS 'FileLogicIndex' ON " + table_name + " (`LNAME`);"
378
+ MobyUtil::DBAccess.query( db_connection, query_string )
379
+ sql_file.write( query_string + "\n" ) if record_sql
380
+ end
381
+
382
+ # ADD NEW COLUMNS for new language if needed
383
+ case db_connection.db_type
384
+ when "mysql"
385
+ begin
386
+ query_string = "ALTER TABLE `" + table_name + "` ADD `" + language + "` VARCHAR(350) NULL DEFAULT NULL COLLATE utf8_general_ci;"
387
+ MobyUtil::DBAccess.query( db_connection, query_string )
388
+ sql_file.write( query_string + "\n" ) if record_sql
389
+ rescue Mysql::Error # catch if language column already exists
390
+ end
391
+ when "sqlite"
392
+ begin
393
+ query_string = "ALTER TABLE `" + table_name + "` ADD `" + language + "` TEXT;"
394
+ MobyUtil::DBAccess.query( db_connection, query_string )
395
+ sql_file.write( query_string + "\n" ) if record_sql
396
+ rescue SQLite3::SQLException # catch if language column already exists
397
+ end
398
+ end
399
+ # INSERT new data
400
+ case db_connection.db_type
401
+ when "mysql"
402
+ begin
403
+ # Formatting (seems like there is no length limit for the insert string)
404
+ insert_values = ""
405
+ data.each do |fname, source, translation, plurality, lengthvar|
406
+ # Escape ` and ' and " and other restricted characters in SQL (prevent SQL injections
407
+ source = source.gsub(/([\'\"\`\;\&])/){|s| "\\" + s}
408
+ translation = (translation != nil) ? translation.gsub(/([\'\"\`\;\&])/){|s| "\\" + s} : ""
409
+ insert_values += "('" + fname + "', '" + source + "', '" + translation + "', '" + plurality + "', '" + lengthvar + "'), "
410
+ end
411
+ insert_values[-2] = ' ' unless insert_values == "" # replace last ',' with ';'
412
+ # INSERT Query
413
+ query_string = "INSERT INTO `" + table_name + "` (FNAME, LNAME, `" + language + "`, `PLURALITY`, `LENGTHVAR`) VALUES " + insert_values +
414
+ "ON DUPLICATE KEY UPDATE fname = VALUES(fname), lname = VALUES(lname), `" + language + "` = VALUES(`" + language + "`) ;"
415
+ MobyUtil::DBAccess.query( db_connection, query_string )
416
+ sql_file.write( query_string + "\n" ) if record_sql
417
+ rescue Exception => e
418
+ puts e.inspect
419
+ puts e.backtrace.join("\n")
420
+ end
421
+ when "sqlite"
422
+ begin
423
+ # Formatting (limit on the length of the Insert String! So multiple Insets
424
+ counter = 0
425
+ cumulated = 0
426
+ union_all = ""
427
+ MobyUtil::DBAccess.query( db_connection, "BEGIN TRANSACTION")
428
+ sql_file.write( "BEGIN TRANSACTION\n" ) if record_sql
429
+ data.each do |fname, source, translation, plurality, lengthvar|
430
+ counter += 1
431
+ cumulated += 1
432
+ # we MAYBE fucked if the texts have ";" or "`" or """ but for now only "'" seems to be problematic
433
+ source = source.strip.gsub(/([\'])/){|s| s + s}
434
+ translation = (translation != nil ) ? translation.strip.gsub(/([\'])/){|s| s + s} : ""
435
+ ### UPDATE OR INSERT IF NO ROWS AFFECTED
436
+ query_string = "UPDATE `" + table_name + "` SET `#{language}`='#{translation}' WHERE FNAME='#{fname}' AND " +
437
+ "LNAME='#{source}' AND `PLURALITY`='#{plurality}' AND `LENGTHVAR`='#{lengthvar}';"
438
+ MobyUtil::DBAccess.query( db_connection, query_string )
439
+ sql_file.write( query_string + "\n" ) if record_sql
440
+ if MobyUtil::DBAccess.affected_rows( db_connection ) == 0
441
+ query_string = "INSERT INTO `" + table_name + "` (FNAME, LNAME, `" + language + "`, `PLURALITY`, `LENGTHVAR`) " +
442
+ "VALUES ('#{fname}' ,'#{source}','#{translation}', '#{plurality}', '#{lengthvar}');"
443
+ MobyUtil::DBAccess.query( db_connection, query_string )
444
+ sql_file.write( query_string + "\n" ) if record_sql
445
+ end
446
+ end
447
+ MobyUtil::DBAccess.query( db_connection, "COMMIT TRANSACTION")
448
+ sql_file.write( "COMMIT TRANSACTION\n" ) if record_sql
449
+ rescue Exception => e
450
+ puts e.inspect
451
+ puts e.backtrace.join("\n")
452
+ MobyUtil::DBAccess.query( db_connection, "ROLLBACK TRANSACTION")
453
+ sql_file.write( "ROLLBACK TRANSACTION\n" ) if record_sql
454
+ end
455
+ end
456
+ end
457
+
458
+
459
+ # == description
460
+ # Extracs application name used for FNAME from a given filename (removes language tags and file extension)
461
+ #
462
+ def self.parseFName(file)
463
+ fname = file.split('/').last
464
+ #(wordlist matching)
465
+ words = ["ar", "bg", "ca", "cs", "da", "de", "el", "en", "english-gb", "(apac)", "(apaccn)", "(apachk)", "(apactw)", "japanese", "thai", "us", "es", "419", "et", "eu", "fa", "fi", "fr", "gl", "he", "hi", "hr", "hu", "id", "is", "it", "ja", "ko", "lt", "lv", "mr", "ms", "nb", "nl", "pl", "pt", "br", "ro", "ru", "sk", "sl", "sr", "sv", "th", "tl", "tr", "uk", "ur", "us", "vi", "zh", "hk", "tw", "no"]
466
+ match = fname.scan(/_([a-zA-Z1-9\-\(\)]*)/)
467
+ if match
468
+ match.each do |m|
469
+ fname.gsub!("_#{m[0]}"){|s| ""} if words.include?( m[0].downcase )
470
+ end
471
+ end
472
+ fname.gsub!(".ts"){|s| ""}
473
+ return fname #gsub! will return nil if now subs are performed
474
+ end
475
+
476
+ end # class
477
+
478
+ end # module
479
+