soaspec 0.2.33 → 0.3.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (86) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +15 -15
  3. data/.gitlab-ci.yml +62 -62
  4. data/.rspec +3 -3
  5. data/.rubocop.yml +2 -2
  6. data/CODE_OF_CONDUCT.md +74 -74
  7. data/ChangeLog +643 -632
  8. data/Dockerfile +7 -7
  9. data/Gemfile +8 -8
  10. data/LICENSE.txt +21 -21
  11. data/README.md +253 -231
  12. data/Rakefile +52 -52
  13. data/Todo.md +16 -16
  14. data/exe/soaspec +140 -138
  15. data/exe/xml_to_yaml_file +43 -43
  16. data/lib/soaspec.rb +118 -106
  17. data/lib/soaspec/baseline.rb +82 -22
  18. data/lib/soaspec/core_ext/hash.rb +44 -44
  19. data/lib/soaspec/cucumber/generic_steps.rb +94 -94
  20. data/lib/soaspec/demo.rb +6 -6
  21. data/lib/soaspec/errors.rb +24 -24
  22. data/lib/soaspec/exchange/exchange.rb +131 -129
  23. data/lib/soaspec/exchange/exchange_extractor.rb +105 -90
  24. data/lib/soaspec/exchange/exchange_properties.rb +28 -28
  25. data/lib/soaspec/exchange/exchange_repeater.rb +21 -21
  26. data/lib/soaspec/exchange/request_builder.rb +108 -70
  27. data/lib/soaspec/exchange/variable_storer.rb +24 -24
  28. data/lib/soaspec/exchange_handlers/exchange_handler.rb +98 -98
  29. data/lib/soaspec/exchange_handlers/exchange_handler_defaults.rb +61 -61
  30. data/lib/soaspec/exchange_handlers/handler_accessors.rb +132 -132
  31. data/lib/soaspec/exchange_handlers/request/rest_request.rb +77 -59
  32. data/lib/soaspec/exchange_handlers/request/soap_request.rb +41 -41
  33. data/lib/soaspec/exchange_handlers/response_extractor.rb +84 -84
  34. data/lib/soaspec/exchange_handlers/rest_exchanger_factory.rb +111 -111
  35. data/lib/soaspec/exchange_handlers/rest_handler.rb +307 -307
  36. data/lib/soaspec/exchange_handlers/rest_methods.rb +65 -65
  37. data/lib/soaspec/exchange_handlers/rest_parameters.rb +112 -112
  38. data/lib/soaspec/exchange_handlers/rest_parameters_defaults.rb +42 -42
  39. data/lib/soaspec/exchange_handlers/soap_handler.rb +241 -241
  40. data/lib/soaspec/exe_helpers.rb +94 -94
  41. data/lib/soaspec/generate_server.rb +48 -48
  42. data/lib/soaspec/generator/.rspec.erb +5 -5
  43. data/lib/soaspec/generator/.travis.yml.erb +5 -5
  44. data/lib/soaspec/generator/Gemfile.erb +8 -8
  45. data/lib/soaspec/generator/README.md.erb +29 -29
  46. data/lib/soaspec/generator/Rakefile.erb +20 -19
  47. data/lib/soaspec/generator/config/data/default.yml.erb +2 -2
  48. data/lib/soaspec/generator/css/bootstrap.css +6833 -6833
  49. data/lib/soaspec/generator/features/support/env.rb.erb +3 -3
  50. data/lib/soaspec/generator/generate_exchange.html.erb +47 -47
  51. data/lib/soaspec/generator/lib/blz_service.rb.erb +26 -26
  52. data/lib/soaspec/generator/lib/dynamic_class_content.rb.erb +12 -12
  53. data/lib/soaspec/generator/lib/new_rest_service.rb.erb +56 -56
  54. data/lib/soaspec/generator/lib/new_soap_service.rb.erb +29 -29
  55. data/lib/soaspec/generator/lib/package_service.rb.erb +2 -2
  56. data/lib/soaspec/generator/lib/shared_example.rb.erb +8 -8
  57. data/lib/soaspec/generator/spec/dynamic_soap_spec.rb.erb +12 -12
  58. data/lib/soaspec/generator/spec/rest_spec.rb.erb +9 -9
  59. data/lib/soaspec/generator/spec/soap_spec.rb.erb +51 -51
  60. data/lib/soaspec/generator/spec/spec_helper.rb.erb +23 -23
  61. data/lib/soaspec/generator/template/soap_template.xml +6 -6
  62. data/lib/soaspec/indifferent_hash.rb +9 -9
  63. data/lib/soaspec/interpreter.rb +70 -70
  64. data/lib/soaspec/matchers.rb +136 -140
  65. data/lib/soaspec/o_auth2.rb +142 -142
  66. data/lib/soaspec/soaspec_shared_examples.rb +26 -26
  67. data/lib/soaspec/spec_logger.rb +143 -143
  68. data/lib/soaspec/template_reader.rb +30 -30
  69. data/lib/soaspec/test_server/bank.wsdl +90 -90
  70. data/lib/soaspec/test_server/get_bank.rb +166 -166
  71. data/lib/soaspec/test_server/id_manager.rb +41 -41
  72. data/lib/soaspec/test_server/invoices.rb +29 -29
  73. data/lib/soaspec/test_server/namespace.xml +14 -14
  74. data/lib/soaspec/test_server/note.xml +5 -5
  75. data/lib/soaspec/test_server/puppy_service.rb +21 -21
  76. data/lib/soaspec/test_server/test_attribute.rb +14 -14
  77. data/lib/soaspec/test_server/test_namespace.rb +14 -14
  78. data/lib/soaspec/version.rb +6 -6
  79. data/lib/soaspec/virtual_server.rb +193 -190
  80. data/lib/soaspec/wait.rb +43 -43
  81. data/lib/soaspec/wsdl_generator.rb +215 -215
  82. data/soaspec.gemspec +58 -58
  83. data/test.wsdl +116 -116
  84. data/test.xml +10 -10
  85. data/test_wsdl.rb +43 -43
  86. metadata +3 -3
data/Rakefile CHANGED
@@ -1,52 +1,52 @@
1
- # frozen_string_literal: true
2
-
3
- require 'bundler/gem_tasks'
4
- require 'rspec/core/rake_task'
5
- require 'rake/clean'
6
- require 'yard'
7
- require 'yard/doctest/rake'
8
-
9
- ENV['folder'] ||= ''
10
- ENV['test'] ||= ''
11
-
12
- desc 'Run tests'
13
- RSpec::Core::RakeTask.new(spec: %i[clean clobber start_test_server]) do |t|
14
- t.pattern = "spec/**/#{ENV['folder']}*/#{ENV['test']}*_spec.rb"
15
- end
16
-
17
- task parallel: %i[clean clobber start_test_server] do
18
- puts `parallel_rspec spec`
19
- end
20
-
21
- task default: :spec
22
-
23
- CLEAN.include 'tmp/*'
24
- CLOBBER.include 'logs/*'
25
-
26
- desc 'Start virtual web service'
27
- task :start_test_server do
28
- ENV['leave_server_running'] = 'true' # This will stop created suites from killing this service
29
- mkdir_p 'logs'
30
- ENV['test_server_pid'] = Process.spawn('ruby', 'exe/soaspec', 'virtual_server', err: %w[logs/test_server.log w]).to_s
31
- sleep 2 # Wait a little for virtual server to start up
32
- puts 'Running test server at pid ' + ENV['test_server_pid']
33
- end
34
-
35
- YARD::Rake::YardocTask.new do |t|
36
- t.files = %w[features/**/*.feature features/**/*.rb lib/soaspec/cucumber/*.rb] # lib/soaspec/cucumber/*.rb]
37
- end
38
-
39
- desc 'Ensure system has all docs'
40
- task :must_have_docs do
41
- yard = `yard`
42
- puts yard
43
- percentage = yard.lines.last.strip.split('%').first.to_f
44
- raise 'Must be fully documented' unless percentage == 100.00
45
- end
46
-
47
- desc 'Test examples shown in documentation'
48
- YARD::Doctest::RakeTask.new do |task|
49
- task.doctest_opts = %w[-v]
50
- # task.pattern = 'lib/**/*.rb'
51
- task.pattern = 'lib/soaspec/core_ext/hash.rb'
52
- end
1
+ # frozen_string_literal: true
2
+
3
+ require 'bundler/gem_tasks'
4
+ require 'rspec/core/rake_task'
5
+ require 'rake/clean'
6
+ require 'yard'
7
+ require 'yard/doctest/rake'
8
+
9
+ ENV['folder'] ||= ''
10
+ ENV['test'] ||= ''
11
+
12
+ desc 'Run tests'
13
+ RSpec::Core::RakeTask.new(spec: %i[clean clobber start_test_server]) do |t|
14
+ t.pattern = "spec/**/#{ENV['folder']}*/#{ENV['test']}*_spec.rb"
15
+ end
16
+
17
+ task parallel: %i[clean clobber start_test_server] do
18
+ puts `parallel_rspec spec`
19
+ end
20
+
21
+ task default: :spec
22
+
23
+ CLEAN.include 'tmp/*'
24
+ CLOBBER.include 'logs/*'
25
+
26
+ desc 'Start virtual web service'
27
+ task :start_test_server do
28
+ ENV['leave_server_running'] = 'true' # This will stop created suites from killing this service
29
+ mkdir_p 'logs'
30
+ ENV['test_server_pid'] = Process.spawn('ruby', 'exe/soaspec', 'virtual_server', err: %w[logs/test_server.log w]).to_s
31
+ sleep 2 # Wait a little for virtual server to start up
32
+ puts 'Running test server at pid ' + ENV['test_server_pid']
33
+ end
34
+
35
+ YARD::Rake::YardocTask.new do |t|
36
+ t.files = %w[features/**/*.feature features/**/*.rb lib/soaspec/cucumber/*.rb] # lib/soaspec/cucumber/*.rb]
37
+ end
38
+
39
+ desc 'Ensure system has all docs'
40
+ task :must_have_docs do
41
+ yard = `yard`
42
+ puts yard
43
+ percentage = yard.lines.last.strip.split('%').first.to_f
44
+ raise 'Must be fully documented' unless percentage == 100.00
45
+ end
46
+
47
+ desc 'Test examples shown in documentation'
48
+ YARD::Doctest::RakeTask.new do |task|
49
+ task.doctest_opts = %w[-v]
50
+ # task.pattern = 'lib/**/*.rb'
51
+ task.pattern = 'lib/soaspec/core_ext/hash.rb'
52
+ end
data/Todo.md CHANGED
@@ -1,16 +1,16 @@
1
- * Exception in setting a value results in 'headers' being called on Nil Class
2
- * `yard` should show everything documented
3
- * Rubocop should have 0 offenses
4
- * Unit tests
5
- * OAuth class, etc
6
- * Get initial `soaspec new` working with TODOs as placeholders for how to get started
7
- * Request method from within exchange
8
- * Use this in tests
9
- * Basic service generator
10
- * Give examples and convenience methods for building classes for each SOAP or REST operation
11
- * Potentially have in built use of 'vcr' and 'http_stub' gems
12
- * Handle proxies to record traffic for MiddleWare testing
13
- * soaspec generate
14
- * Get wsdl generator working for non complex gems (Put on hold til new Savon version)
15
- * Generate from a RAML
16
- * Much more - please raise an issue for suggestion
1
+ * Exception in setting a value results in 'headers' being called on Nil Class
2
+ * `yard` should show everything documented
3
+ * Rubocop should have 0 offenses
4
+ * Unit tests
5
+ * OAuth class, etc
6
+ * Get initial `soaspec new` working with TODOs as placeholders for how to get started
7
+ * Request method from within exchange
8
+ * Use this in tests
9
+ * Basic service generator
10
+ * Give examples and convenience methods for building classes for each SOAP or REST operation
11
+ * Potentially have in built use of 'vcr' and 'http_stub' gems
12
+ * Handle proxies to record traffic for MiddleWare testing
13
+ * soaspec generate
14
+ * Get wsdl generator working for non complex gems (Put on hold til new Savon version)
15
+ * Generate from a RAML
16
+ * Much more - please raise an issue for suggestion
@@ -1,138 +1,140 @@
1
- #!/usr/bin/env ruby
2
- # frozen_string_literal: true
3
-
4
- require 'thor'
5
- $LOAD_PATH.unshift File.join(File.dirname(__FILE__), '..', 'lib')
6
- require 'savon'
7
- require 'soaspec'
8
- require 'soaspec/virtual_server'
9
- require 'soaspec/wsdl_generator'
10
-
11
- module Soaspec
12
- # Common executable for Soaspec
13
- class Exe < Thor
14
- include Soaspec::ExeHelpers
15
- include Soaspec::WsdlGenerator
16
-
17
- long_desc <<-LONGDESC
18
- `soaspec new` will generate the initial files and folders for starting a testing project using soaspec
19
- \x5
20
-
21
- `soaspec new soap` will create example files testing against a SOAP service
22
- \x5
23
-
24
- `soaspec new rest` will create example files testing against a REST service
25
- LONGDESC
26
- desc 'new [type]', 'Initialize soaspec repository'
27
- option :ci, default: 'jenkins', banner: 'What Continuous Integration is used'
28
- option :virtual, type: :boolean, default: true, banner: 'Whether to set things up for a virtual server'
29
- def new(type = 'initial')
30
- @virtual = options[:virtual]
31
- @type = type
32
- puts "Creating files for soaspec. options are #{options}"
33
- create_file(filename: 'Gemfile')
34
- create_file(filename: 'Rakefile')
35
- create_file(filename: '.rspec')
36
- create_file(filename: 'README.md')
37
- create_file(filename: '.travis.yml') if options[:ci] == 'travis'
38
- create_folder 'lib'
39
- create_files_for type
40
- create_file(filename: 'config/data/default.yml') # Example of data file
41
- create_file(filename: 'spec/spec_helper.rb')
42
- puts "Run 'bundle install' to install necessary gems"
43
- puts "Run 'rake spec' to run the tests"
44
- end
45
-
46
- long_desc <<-LONGDESC
47
- `soaspec add rest` will generate the initial files and folders for starting a testing project using soaspec
48
- \x5
49
-
50
- `soaspec add soap` will create example files testing against a virtual SOAP service
51
- \x5
52
-
53
- LONGDESC
54
- desc 'add [type] [name]', 'Add new ExchangeHandler'
55
- def add(type = 'rest', name = 'TestService')
56
- raise "Type '#{type}' is not available" unless %w[rest soap].include? type
57
-
58
- @name = name # Use instance variable for ERB
59
- create_file filename: File.join('lib', "#{name.snakecase}.rb"),
60
- content: retrieve_contents(File.join('lib', "new_#{type}_service.rb"))
61
- end
62
-
63
- long_desc <<-LONGDESC
64
- `soaspec cucumber` will add generic steps file within step definitions folder. It will also
65
- add Gemfile, and other Cucumber setup files if not already added
66
- \x5
67
-
68
- LONGDESC
69
- desc 'cucumber', 'Add cucumber generic steps template within step_definitions folder'
70
- def cucumber
71
- @cucumber = true
72
- create_file(filename: 'Gemfile', ignore_if_present: true)
73
- create_file(filename: 'features/support/env.rb', ignore_if_present: true)
74
- create_file filename: File.join('features', 'step_definitions', 'generic_steps.rb'),
75
- content: retrieve_contents(File.join('../cucumber', 'generic_steps.rb'), false)
76
- end
77
-
78
- desc 'generate', 'Generate initial test code from wsdl'
79
- long_desc <<-LONGDESC
80
- If no wsdl is given a server will be started from which code to generate Exchanges
81
-
82
- `soaspec generate wsdl=wsdl name=ServiceName ` will generate the initial files and folders to test each operation in a wsdl
83
- \x5
84
- Additionally the auth parameter can be used to use basic authentication to retrieve the WSDL.
85
- To do use the following `soaspec generate --auth=basic`
86
- Note: This is still a work in progress and will only work for a very simple wsdl
87
- LONGDESC
88
- option :wsdl, default: nil, aliases: :w
89
- option :name, default: 'Service', aliases: :n
90
- option :ci, default: 'jenkins', banner: 'What Continuous Integration is used'
91
- option :auth
92
- option :open_browser, default: 'true'
93
- option :string_default, default: 'test string'
94
- option :port, default: nil, banner: 'What port to run generate server. Default is random'
95
- def generate
96
- if options[:wsdl]
97
- generate_from_wsdl(options)
98
- else
99
- require 'launchy'
100
- require 'soaspec/generate_server'
101
- require 'random-port'
102
- port = options[:port] || RandomPort::Pool.new.acquire.to_s
103
- puts "Using random port '#{port}' for hosting generate server"
104
-
105
- Soaspec::GenerateServer.run!(port: port) do
106
- Launchy.open "http://localhost:#{port}" if options[:open_browser] == 'true'
107
- end
108
- end
109
- end
110
-
111
- long_desc <<-LONGDESC
112
- Run virtual web services on localhost. See root for documentation of web services provided.
113
- LONGDESC
114
- desc 'virtual_server [port]', 'Run virtual web service on localhost'
115
- def virtual_server(port = '4999')
116
- ENV['port'] = port
117
- require 'soaspec/virtual_server'
118
- Soaspec::VirtualServer.run!(port: port)
119
- end
120
-
121
- long_desc <<-LONGDESC
122
- Run pry with Soaspec and other relevant libraries loaded. Pass either the relative path to files desired with a
123
- '.rb' extension or the path to the folder to be loaded with 'require_all'
124
- LONGDESC
125
- desc 'pry [required_files]', 'Run pry with Soaspec and other relevant libraries loaded'
126
- def pry(required_files = nil)
127
- require 'soaspec'
128
-
129
- require 'require_all'
130
- require_all required_files if required_files
131
-
132
- require 'pry'
133
- Pry.start
134
- end
135
- end
136
- end
137
-
138
- Soaspec::Exe.start(ARGV)
1
+ #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
3
+
4
+ require 'thor'
5
+ $LOAD_PATH.unshift File.join(File.dirname(__FILE__), '..', 'lib')
6
+ require 'savon'
7
+ require 'soaspec'
8
+ require 'soaspec/virtual_server'
9
+ require 'soaspec/wsdl_generator'
10
+
11
+ module Soaspec
12
+ # Common executable for Soaspec
13
+ class Exe < Thor
14
+ include Soaspec::ExeHelpers
15
+ include Soaspec::WsdlGenerator
16
+
17
+ long_desc <<-LONGDESC
18
+ `soaspec new` will generate the initial files and folders for starting a testing project using soaspec
19
+ \x5
20
+
21
+ `soaspec new soap` will create example files testing against a SOAP service
22
+ \x5
23
+
24
+ `soaspec new rest` will create example files testing against a REST service
25
+ LONGDESC
26
+ desc 'new [type]', 'Initialize soaspec repository'
27
+ option :ci, default: 'jenkins', banner: 'What Continuous Integration is used'
28
+ option :virtual, type: :boolean, default: true, banner: 'Whether to set things up for a virtual server'
29
+ def new(type = 'initial')
30
+ @virtual = options[:virtual]
31
+ @type = type
32
+ puts "Creating files for soaspec. options are #{options}"
33
+ create_file(filename: 'Gemfile')
34
+ create_file(filename: 'Rakefile')
35
+ create_file(filename: '.rspec')
36
+ create_file(filename: 'README.md')
37
+ create_file(filename: '.travis.yml') if options[:ci] == 'travis'
38
+ create_folder 'lib'
39
+ create_files_for type
40
+ create_file(filename: 'config/data/default.yml') # Example of data file
41
+ create_file(filename: 'spec/spec_helper.rb')
42
+ puts "Run 'bundle install' to install necessary gems"
43
+ puts "Run 'rake spec' to run the tests"
44
+ end
45
+
46
+ long_desc <<-LONGDESC
47
+ `soaspec add rest` will generate the initial files and folders for starting a testing project using soaspec
48
+ \x5
49
+
50
+ `soaspec add soap` will create example files testing against a virtual SOAP service
51
+ \x5
52
+
53
+ After type a 'name' can be given in PascalCase to specify the class name
54
+
55
+ LONGDESC
56
+ desc 'add [type] [name]', 'Add new ExchangeHandler'
57
+ def add(type = 'rest', name = 'TestService')
58
+ raise "Type '#{type}' is not available" unless %w[rest soap].include? type
59
+
60
+ @name = name # Use instance variable for ERB
61
+ create_file filename: File.join('lib', "#{name.snakecase}.rb"),
62
+ content: retrieve_contents(File.join('lib', "new_#{type}_service.rb"))
63
+ end
64
+
65
+ long_desc <<-LONGDESC
66
+ `soaspec cucumber` will add generic steps file within step definitions folder. It will also
67
+ add Gemfile, and other Cucumber setup files if not already added
68
+ \x5
69
+
70
+ LONGDESC
71
+ desc 'cucumber', 'Add cucumber generic steps template within step_definitions folder'
72
+ def cucumber
73
+ @cucumber = true
74
+ create_file(filename: 'Gemfile', ignore_if_present: true)
75
+ create_file(filename: 'features/support/env.rb', ignore_if_present: true)
76
+ create_file filename: File.join('features', 'step_definitions', 'generic_steps.rb'),
77
+ content: retrieve_contents(File.join('../cucumber', 'generic_steps.rb'), false)
78
+ end
79
+
80
+ desc 'generate', 'Generate initial test code from wsdl'
81
+ long_desc <<-LONGDESC
82
+ If no wsdl is given a server will be started from which code to generate Exchanges
83
+
84
+ `soaspec generate wsdl=wsdl name=ServiceName ` will generate the initial files and folders to test each operation in a wsdl
85
+ \x5
86
+ Additionally the auth parameter can be used to use basic authentication to retrieve the WSDL.
87
+ To do use the following `soaspec generate --auth=basic`
88
+ Note: This is still a work in progress and will only work for a very simple wsdl
89
+ LONGDESC
90
+ option :wsdl, default: nil, aliases: :w
91
+ option :name, default: 'Service', aliases: :n
92
+ option :ci, default: 'jenkins', banner: 'What Continuous Integration is used'
93
+ option :auth
94
+ option :open_browser, default: 'true'
95
+ option :string_default, default: 'test string'
96
+ option :port, default: nil, banner: 'What port to run generate server. Default is random'
97
+ def generate
98
+ if options[:wsdl]
99
+ generate_from_wsdl(options)
100
+ else
101
+ require 'launchy'
102
+ require 'soaspec/generate_server'
103
+ require 'random-port'
104
+ port = options[:port] || RandomPort::Pool.new.acquire.to_s
105
+ puts "Using random port '#{port}' for hosting generate server"
106
+
107
+ Soaspec::GenerateServer.run!(port: port) do
108
+ Launchy.open "http://localhost:#{port}" if options[:open_browser] == 'true'
109
+ end
110
+ end
111
+ end
112
+
113
+ long_desc <<-LONGDESC
114
+ Run virtual web services on localhost. See root for documentation of web services provided.
115
+ LONGDESC
116
+ desc 'virtual_server [port]', 'Run virtual web service on localhost'
117
+ def virtual_server(port = '4999')
118
+ ENV['port'] = port
119
+ require 'soaspec/virtual_server'
120
+ Soaspec::VirtualServer.run!(port: port)
121
+ end
122
+
123
+ long_desc <<-LONGDESC
124
+ Run pry with Soaspec and other relevant libraries loaded. Pass either the relative path to files desired with a
125
+ '.rb' extension or the path to the folder to be loaded with 'require_all'
126
+ LONGDESC
127
+ desc 'pry [required_files]', 'Run pry with Soaspec and other relevant libraries loaded'
128
+ def pry(required_files = nil)
129
+ require 'soaspec'
130
+
131
+ require 'require_all'
132
+ require_all required_files if required_files
133
+
134
+ require 'pry'
135
+ Pry.start
136
+ end
137
+ end
138
+ end
139
+
140
+ Soaspec::Exe.start(ARGV)
@@ -1,43 +1,43 @@
1
- #!/usr/bin/env ruby
2
- # frozen_string_literal: true
3
-
4
- require 'xmlsimple'
5
- require 'yaml'
6
- require 'fileutils'
7
-
8
- $LOAD_PATH.unshift File.join(File.dirname(__FILE__), '..', 'lib')
9
-
10
- require 'soaspec'
11
-
12
- include Soaspec::ExeHelpers
13
-
14
- default_output_file = 'output.yml'
15
-
16
- # For all keys in a Hash, convert Camelcase to underscore separated
17
- def convert_hash_keys(value)
18
- case value
19
- when Array
20
- value.map { |v| convert_hash_keys(v) }
21
- when Hash
22
- Hash[value.map { |k, v| [k.snakecase, convert_hash_keys(v)] }]
23
- else
24
- value
25
- end
26
- end
27
-
28
- # Remove arrays created as another string
29
- def clean_up_yaml(yaml_string)
30
- yaml_string = yaml_string.gsub(/\R+(\s*)-/, '').gsub(/{}/, "''") # Remove arrays, {} -> ''
31
- # Insert new line where there are 2 ':' on 1 line. Issue from first gsub
32
- yaml_string.gsub(/:(\s)(\w*):/) { |s| s.insert(1, "\n") }
33
- end
34
-
35
- if ARGV[0]
36
- warn "Using '#{default_output_file}' as default output file since no 2nd argument passed" unless ARGV[1]
37
- hash = XmlSimple.xml_in(ARGV[0])
38
- converted = convert_hash_keys hash
39
- yaml_file = clean_up_yaml(converted.to_yaml)
40
- create_file(filename: ARGV[1] || default_output_file, content: yaml_file)
41
- else
42
- puts 'usage: xml_to_yaml_file [input.xml] [output.yml] '
43
- end
1
+ #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
3
+
4
+ require 'xmlsimple'
5
+ require 'yaml'
6
+ require 'fileutils'
7
+
8
+ $LOAD_PATH.unshift File.join(File.dirname(__FILE__), '..', 'lib')
9
+
10
+ require 'soaspec'
11
+
12
+ include Soaspec::ExeHelpers
13
+
14
+ default_output_file = 'output.yml'
15
+
16
+ # For all keys in a Hash, convert Camelcase to underscore separated
17
+ def convert_hash_keys(value)
18
+ case value
19
+ when Array
20
+ value.map { |v| convert_hash_keys(v) }
21
+ when Hash
22
+ Hash[value.map { |k, v| [k.snakecase, convert_hash_keys(v)] }]
23
+ else
24
+ value
25
+ end
26
+ end
27
+
28
+ # Remove arrays created as another string
29
+ def clean_up_yaml(yaml_string)
30
+ yaml_string = yaml_string.gsub(/\R+(\s*)-/, '').gsub(/{}/, "''") # Remove arrays, {} -> ''
31
+ # Insert new line where there are 2 ':' on 1 line. Issue from first gsub
32
+ yaml_string.gsub(/:(\s)(\w*):/) { |s| s.insert(1, "\n") }
33
+ end
34
+
35
+ if ARGV[0]
36
+ warn "Using '#{default_output_file}' as default output file since no 2nd argument passed" unless ARGV[1]
37
+ hash = XmlSimple.xml_in(ARGV[0])
38
+ converted = convert_hash_keys hash
39
+ yaml_file = clean_up_yaml(converted.to_yaml)
40
+ create_file(filename: ARGV[1] || default_output_file, content: yaml_file)
41
+ else
42
+ puts 'usage: xml_to_yaml_file [input.xml] [output.yml] '
43
+ end