terrimporter 0.6.0 → 0.6.4

Sign up to get free protection for your applications and to get access to all the features.
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- terrimporter (0.5.4)
4
+ terrimporter (0.6.4)
5
5
  kwalify (>= 0.7.2)
6
6
 
7
7
  GEM
data/README.rdoc CHANGED
@@ -18,10 +18,14 @@ terrimporter has the following features:
18
18
 
19
19
  === Gem Installation
20
20
 
21
+ You need sudo to install terrimporter if you're not using a ruby version manager like rvm for example.
22
+ It is strongly encouraged to use such a ruby version management tool in order to install the gem without sudo rights.
21
23
  Download and install terrimporter with the following.
22
24
 
23
25
  gem install terrimporter
24
26
 
27
+
28
+
25
29
  == Usage
26
30
 
27
31
  === Simple Example
data/Rakefile CHANGED
@@ -57,7 +57,7 @@ namespace :version do
57
57
  when :major
58
58
  version[:major] = version[:major].to_i + 1
59
59
  when :minor
60
- version[:minor] = version[:minor].to_1 + 1
60
+ version[:minor] = version[:minor].to_i + 1
61
61
  when :patch
62
62
  version[:patch] = version[:patch].to_i + 1
63
63
  end
@@ -91,8 +91,6 @@ end
91
91
  }
92
92
  File.open(version_file_path, 'w') { |f| f.write(version_rb) }
93
93
  end
94
-
95
-
96
94
  end
97
95
 
98
96
 
data/config/schema.yml CHANGED
@@ -1,30 +1,20 @@
1
1
  type: map
2
2
  mapping:
3
- "version":
4
- type: text
5
- required: yes
6
- "url":
7
- type: str
8
- required: yes
9
- pattern: /^(http|https):\/\/[a-z0-9]+([\-\.]{1}[a-z0-9]+)*\.[a-z]{2,5}(:[0-9]{1,5})?(\/.*)?$/
10
- "app_path":
11
- type: str
12
- required: yes
13
- pattern: /\/.*/
14
- "export_path":
3
+ "application_url":
15
4
  type: str
16
5
  required: yes
17
- pattern: /^\/terrific.*\%2\$s.*\%1\$s.*\%1\$s.*\.php$/
18
- "libraries_source_path":
6
+ pattern: /^(http|https):\/\/.*$/
7
+ "libraries_server_path":
19
8
  type: str
20
9
  required: yes
21
10
  pattern: /\/.*/
22
- "image_base_path":
11
+ "image_server_path":
23
12
  type: str
24
13
  required: yes
25
14
  pattern: /\/.*/
26
15
  "export_settings":
27
16
  type: map
17
+ required: yes
28
18
  mapping:
29
19
  "layout":
30
20
  type: str
@@ -37,15 +27,15 @@ mapping:
37
27
  default: false
38
28
  "stylesheets":
39
29
  type: map
30
+ required: yes
40
31
  mapping:
41
- "dest":
32
+ "relative_destination_path":
42
33
  type: str
43
34
  required: yes
44
35
  "styles":
45
36
  type: str
46
- name: css
47
37
  required: no
48
- "replace":
38
+ "replace_strings":
49
39
  type: seq
50
40
  required: no
51
41
  sequence:
@@ -59,28 +49,29 @@ mapping:
59
49
  required: yes
60
50
  "javascripts":
61
51
  type: map
52
+ required: yes
62
53
  mapping:
63
- "dest":
54
+ "relative_destination_path":
64
55
  type: str
65
56
  required: yes
66
57
  "dynamic_libraries":
67
58
  type: str
68
- name: js
69
59
  required: no
70
- "libraries_dest":
60
+ "libraries_relative_destination_path":
71
61
  type: str
72
- required: yes
62
+ required: no
73
63
  "images":
74
64
  type: seq
65
+ required: no
75
66
  sequence:
76
67
  - type: map
77
68
  mapping:
78
- "src":
69
+ "server_path":
79
70
  type: str
80
71
  required: yes
81
- "dest":
72
+ "relative_destination_path":
82
73
  type: str
83
74
  required: yes
84
- "types":
75
+ "file_types":
85
76
  type: str
86
77
  required: no
@@ -1,66 +1,47 @@
1
- ########################################################################################################################
2
- # Terrific import configuration file, adjust as needed.
3
- #
4
- # version: Define the terrific version in use
5
- # url: Terrific base url
6
- # app_path Terrific application path (must start with '/')
7
- # export_path You most probably won't have to change this
8
- # image_base_path: The Terrific image base path. You most probably won't have to change this
9
- # libraries_source_path: The library source path. You most probably won't have to change this
10
- #
11
- # export_settings: The settings below are added as query parameters for base.js and base.css
12
- # layout: You most probably won't have to change this
13
- # debug: False compacts the base.js and base.css files
14
- # cache: You most probably won't have to change this
15
- #
16
- # stylesheets: Define the stylesheets in the following form:
17
- # dest: The destination directory, relative from the current running directory
18
- # styles: Name of the stylesheets, space separated without the .css extension. ex: ie ie6 ie7 ie8
19
- # the main style base.css is included by default and MUST NOT BE SPECIFIED
20
- # replace: Define path replacements after the stylesheets have been downloaded
21
- # you can define multiple replacements by repeating the '-what: with:' statements
22
- # - what: What to replace, default is string. if you want to use regex, use the format r/[regex]/
23
- # for help on regular expressions see http://www.rubular.com/ (an online editor/tester)
24
- # with: Replace with this (string)
25
- #
26
- # javascripts: Define the javascript files in the following form
27
- # dest: Destination of the javascript base.js file
28
- # dynamic_libraries: Dynamic libraries definition, space separated without the .js extension. ex: warning pngfix
29
- # libraries_dest: Destination of the dynamic libraries relative to the 'dest' path. '/' means they're included in 'dest'
30
- #
31
- # images: Define the images to be downloaded, the terrific base path is always "img", so the src root is "img/"
32
- # each of the entries describes one path for images to be downloaded
33
- # -src: The source path, "/" means "img/"
34
- # dest: The destination directory, relative from the current running directory
35
- # types: The image endings to be downloaded, specified as a space separated string
36
- ########################################################################################################################
37
- version: 0.5
38
- url: http://terrific.url
39
- app_path: /terrific/webapp/path
40
- export_path: /terrific/base/%2$s/public/%1$s/base/base.%1$s.php
41
- libraries_source_path: /js/libraries/dynamic
42
- image_base_path: /img
43
- export_settings:
44
- layout: project
45
- debug: false
46
- cache: false
47
- stylesheets:
48
- dest: public/stylesheets/
49
- styles: ie
50
- replace:
51
- - what: /img/
52
- with: /images/
53
- javascripts:
54
- dest: public/javascripts/
55
- dynamic_libraries: dynlib
56
- libraries_dest: /
57
- images:
58
- - src: /
59
- dest: public/images/
60
- types: jpg png gif
61
- - src: /
62
- dest: public/
63
- types: ico
64
- - src: /backgrounds/
65
- dest: public/images/backgrounds/
66
- types: jpg
1
+ #-------------------------------------------------------------------------------
2
+ # terrimporter configuration, adjust as needed. Don't mess with indentation!
3
+ #-------------------------------------------------------------------------------
4
+ # url: Terrific base url
5
+ application_url: http://terrific.project.url
6
+
7
+ # STYLESHEETS
8
+ stylesheets:
9
+ # The destination directory, relative from the current running directory
10
+ relative_destination_path: public/stylesheets/
11
+ # Additional stylesheets, you can but don't have to add the .css extension
12
+ # styles: ie, ie6, ie7.css
13
+ # replace_strings: Define string replacements in css files
14
+ # (use multiple replacements by repeating the '-what: with:' statements)
15
+ replace_strings:
16
+ # - what: /img/ # What to replace, format: [string] or [r/regex/]
17
+ # with: /images/ # Replace with [string]
18
+
19
+ # JAVASCRIPTS
20
+ javascripts:
21
+ # Destination path of the javascript base.js file
22
+ relative_destination_path: public/javascripts/
23
+ # Dynamic libraries definition, you can but don't have to add the .js extension
24
+ # dynamic_libraries: foo_lib.js bar_lib.js
25
+ # Destination path of the dynamic libraries relative
26
+ # libraries_relative_destination_path: public/javascripts/libraries/
27
+
28
+ # IMAGES - multiple entries allowed
29
+ images:
30
+ # - server_path: / # The server path is appended to the image_server_path
31
+ # relative_destination_path: public/images/ # The relative destination path
32
+ # file_types: jpg, png, gif # Image file endings to be downloaded
33
+
34
+ #-------------------------------------------------------------------------------
35
+ # ADVANCED EDITING - Only edit the following if you know what you're doing...
36
+ # ------------------------------------------------------------------------------
37
+ # The settings below are added as query string parameters to the export path
38
+ export_settings:
39
+ debug: false # False compacts the base.js and base.css files
40
+ cache: false # You most probably won't have to change this
41
+ layout: project # You most probably won't have to change this
42
+
43
+ # The server side library source path for the dynamic libraries
44
+ libraries_server_path: /js/libraries/dynamic
45
+
46
+ # The server side image base path
47
+ image_server_path: /img
data/lib/terrimporter.rb CHANGED
@@ -4,9 +4,10 @@ require 'terrimporter/app_logger'
4
4
  require 'terrimporter/options'
5
5
  require 'terrimporter/importer'
6
6
  require 'terrimporter/config_helper'
7
- require 'terrimporter/config_validator'
8
7
  require 'terrimporter/configuration'
9
8
  require 'terrimporter/downloader'
9
+ require 'terrimporter/string_monkeypatch'
10
+ require 'terrimporter/array_monkeypatch'
10
11
  require 'etc'
11
12
  require 'kwalify'
12
13
  require 'fileutils'
@@ -23,11 +24,11 @@ module TerrImporter
23
24
  options = build_options(arguments)
24
25
 
25
26
  begin
26
- unless options[:init].nil?
27
+ if !options[:init].nil?
27
28
  if config_working_directory_exists? and options[:init] != :backup and options[:init] != :replace
28
29
  raise TerrImporter::ConfigurationError, "Configuration already exists, use the override or backup option"
29
30
  end
30
- create_config_file
31
+ create_config_file(options[:init], options[:application_url])
31
32
  return 0
32
33
  end
33
34
 
@@ -0,0 +1,11 @@
1
+ class Array
2
+ def add_if_missing!(ending)
3
+ self.collect! do |item|
4
+ unless item =~ /#{ending}$/
5
+ item + ending
6
+ else
7
+ item
8
+ end
9
+ end
10
+ end
11
+ end
@@ -1,4 +1,3 @@
1
-
2
1
  module ConfigHelper
3
2
 
4
3
  def config_default_name
@@ -25,7 +24,7 @@ module ConfigHelper
25
24
  File.join(base_config_path, schema_default_name)
26
25
  end
27
26
 
28
- def create_config_file(backup_or_replace = nil)
27
+ def create_config_file(backup_or_replace = nil, application_url = nil)
29
28
  puts "Creating configuration file..."
30
29
  case backup_or_replace
31
30
  when :backup
@@ -36,6 +35,13 @@ module ConfigHelper
36
35
  FileUtils.rm_f(config_working_directory_path) if File.exists? config_working_directory_path
37
36
  end
38
37
  FileUtils.cp(config_example_path, config_working_directory_path)
38
+
39
+ unless application_url.nil?
40
+ configuration = File.read(config_working_directory_path)
41
+ configuration.gsub!(/application_url:.*$/, "application_url: #{application_url}")
42
+ File.open(config_working_directory_path, 'w') { |f| f.write(configuration) }
43
+ end
44
+
39
45
  puts "done! You should take a look an edit it to your needs..."
40
46
  end
41
47
 
@@ -61,7 +61,54 @@ module TerrImporter
61
61
  def load_validator
62
62
  puts "Loading validator from #{schema_file_path}"
63
63
  schema = Kwalify::Yaml.load_file(schema_file_path)
64
- ConfigValidator.new(schema)
64
+ Kwalify::Validator.new(schema)
65
+ end
66
+
67
+ def required_present?
68
+ if self['export_path'].nil? or self['export_settings']['application'].nil? or self['application_url'].nil?
69
+ false
70
+ else
71
+ true
72
+ end
73
+ end
74
+
75
+ def stylesheets
76
+ stylesheets = ["base.css"]
77
+ if additional_stylesheets?
78
+ stylesheets = stylesheets + self['stylesheets']['styles'].to_s.robust_split
79
+ else
80
+ puts "No additional stylesheets defined."
81
+ end
82
+ stylesheets.add_if_missing!('.css')
83
+ end
84
+
85
+ def dynamic_libraries
86
+ libraries = self['javascripts']['dynamic_libraries'].robust_split
87
+ libraries.add_if_missing!('.js')
88
+ end
89
+
90
+ def replace_style_strings?
91
+ !self['stylesheets'].nil? and !self['stylesheets']['replace_strings'].nil?
92
+ end
93
+
94
+ def libraries_destination_path
95
+ if !self['javascripts']['libraries_relative_destination_path'].nil?
96
+ File.join(self['javascripts']['libraries_relative_destination_path'])
97
+ else
98
+ File.join(self['javascripts']['relative_destination_path'])
99
+ end
100
+ end
101
+
102
+ def additional_stylesheets?
103
+ !self['stylesheets'].nil? and !self['stylesheets']['styles'].nil?
104
+ end
105
+
106
+ def additional_dynamic_javascripts?
107
+ !self['javascripts'].nil? and !self['javascripts']['dynamic_libraries'].nil?
108
+ end
109
+
110
+ def images?
111
+ !self['images'].nil?
65
112
  end
66
113
 
67
114
  end
@@ -12,19 +12,23 @@ module TerrImporter
12
12
 
13
13
  def download(remote_path, local_path=nil)
14
14
  absolute_uri = absolute_path(remote_path)
15
- if local_path.nil? #download to buffer
16
- data = StringIO.new
17
-
18
- puts "Downloading #{absolute_uri} to buffer"
19
-
20
- absolute_uri.open { |io| data = io.read }
21
- data.to_s
22
- else
23
- puts "Downloading #{absolute_uri} to local path #{local_path}"
24
-
25
- open(local_path, "wb") { |file|
26
- file.write(absolute_uri.open.read)
27
- }
15
+ begin
16
+ if local_path.nil? #download to buffer
17
+ data = StringIO.new
18
+
19
+ puts "Downloading #{absolute_uri} to buffer"
20
+
21
+ absolute_uri.open { |io| data = io.read }
22
+ data.to_s
23
+ else
24
+ puts "Downloading #{absolute_uri} to local path #{local_path}"
25
+
26
+ open(local_path, "wb") { |file|
27
+ file.write(absolute_uri.open.read)
28
+ }
29
+ end
30
+ rescue SocketError => e
31
+ raise DefaultError, "Error opening url #{absolute_uri}: \n #{e.message}"
28
32
  end
29
33
  end
30
34
 
@@ -1,5 +1,3 @@
1
-
2
-
3
1
  module TerrImporter
4
2
 
5
3
  class DefaultError < StandardError
@@ -21,10 +19,12 @@ module TerrImporter
21
19
  self.options = options
22
20
  self.config = Configuration.new options[:config_file]
23
21
  self.config.load_configuration
24
- @downloader = Downloader.new config['url']
22
+ @downloader = Downloader.new config['application_url']
25
23
  end
26
24
 
27
25
  def run
26
+
27
+
28
28
  if options[:all] != nil and options[:all] == true
29
29
  puts "Import of everything started"
30
30
  import_js
@@ -40,65 +40,116 @@ module TerrImporter
40
40
  end
41
41
  end
42
42
 
43
+ def determine_configuration_values_from_uri
44
+ result = @downloader.download('')
45
+ #result =~ /\/terrific\/base\/(.*?)\/public\/.*application=(.*?)(&amp;|&)/
46
+ #result =~ /(\/terrific\/base\/(.*?)\/public\/.*base.(css|js).php).*application=(.*?)(&amp;|&)/
47
+
48
+ css_result, js_result = result.scan(/(\/terrific\/base\/(.*?)\/public\/.*base.(css|js).php)\?.*application=(.*?)(&amp;|&)/)
49
+
50
+
51
+ if css_result.nil? or css_result.size < 5
52
+ raise ConfigurationError, "Unable to extract css information from application url, content is: #{result}"
53
+ end
54
+ if js_result.nil? or js_result.size < 5
55
+ raise ConfigurationError, "Unable to extract javascript information from application url, content is: #{result}"
56
+ end
57
+
58
+ css_export_path = css_result[0]
59
+ js_export_path = js_result[0]
60
+ terrific_version = css_result[1]
61
+ application = css_result[3]
62
+
63
+ raise ConfigurationError, "Unable to determine css export path from application url" if css_export_path.nil?
64
+ raise ConfigurationError, "Unable to determine js export path from application url" if js_export_path.nil?
65
+
66
+ puts "Determined the following configuration values from #{config['application_url']}:\n" +
67
+ "terrific version: #{terrific_version} \n" +
68
+ "application path: #{application}"
69
+
70
+ config['version'] = terrific_version
71
+ config['export_settings']['application'] = application
72
+ config['export_path'] = {'css' => css_export_path, 'js' => js_export_path}
73
+ end
74
+
43
75
  def import_css
76
+ check_and_complete_config!
44
77
  unclean_suffix = "_unclean"
45
78
 
46
- check_and_create_dir config['stylesheets']['dest']
79
+ check_and_create_dir config['stylesheets']['relative_destination_path']
47
80
 
48
- #create stylesheet array and add base.css
49
- styles = config['stylesheets']['styles'].split(" ")
50
- styles << "base"
81
+ styles = config.stylesheets
51
82
 
52
83
  styles.each do |css|
53
- destination_path = File.join(config['stylesheets']['dest'], css + ".css")
84
+ relative_destination_path = File.join(config['stylesheets']['relative_destination_path'], css)
54
85
  options = {}
55
- options[:suffix] = css if css.include?('ie') #add ie option if in array
86
+ options[:suffix] = $1 if css =~ /(ie.*).css$/ #add ie option if in array
56
87
 
57
88
  source_url = construct_export_path(:css, options)
58
89
 
59
- @downloader.download(source_url, destination_path + unclean_suffix)
90
+ @downloader.download(source_url, relative_destination_path + unclean_suffix)
60
91
 
61
- #do line replacement
62
- puts "Start css line replacements"
63
- File.open(destination_path, 'w') do |d|
64
- File.open(destination_path + unclean_suffix, 'r') do |s|
65
- lines = s.readlines
66
- lines.each do |line|
67
- d.print stylesheet_replace_strings!(line)
92
+ if config.replace_style_strings?
93
+ puts "Start css line replacements..."
94
+ File.open(relative_destination_path, 'w') do |d|
95
+ File.open(relative_destination_path + unclean_suffix, 'r') do |s|
96
+ lines = s.readlines
97
+ lines.each do |line|
98
+ d.print stylesheet_replace_strings!(line)
99
+ end
68
100
  end
69
101
  end
102
+ else
103
+ puts "No css line replacements defined; skipping..."
70
104
  end
71
105
  puts "Deleting unclean css files"
72
- FileUtils.remove destination_path + unclean_suffix
106
+ FileUtils.remove relative_destination_path + unclean_suffix
73
107
  end
74
108
  end
75
109
 
76
110
  def import_js
77
- check_and_create_dir config['javascripts']['dest']
78
- destination_path = File.join(config['javascripts']['dest'], "base.js")
111
+ check_and_complete_config!
112
+ check_and_create_dir config['javascripts']['relative_destination_path']
113
+ relative_destination_path = File.join(config['javascripts']['relative_destination_path'], "base.js")
79
114
  js_source_url = construct_export_path :js
80
115
 
81
- puts "Importing base.js from #{js_source_url} to #{destination_path}"
116
+ puts "Importing base.js from #{js_source_url} to #{relative_destination_path}"
117
+
118
+ @downloader.download(js_source_url, relative_destination_path)
119
+
82
120
 
83
- @downloader.download(js_source_url, destination_path)
121
+ if config.additional_dynamic_javascripts?
84
122
 
123
+ libraries_destination_path = config.libraries_destination_path
124
+ check_and_create_dir libraries_destination_path
125
+ js_libraries = config.dynamic_libraries
85
126
 
86
- libraries_destination_path = File.join(config['javascripts']['dest'], config['javascripts']['libraries_dest'])
87
- check_and_create_dir libraries_destination_path
88
- js_libraries = config['javascripts']['dynamic_libraries'].split(" ")
127
+ puts "Importing libraries from #{config['libraries_server_path']} to #{libraries_destination_path}"
89
128
 
90
- puts "Importing libraries from #{config['libraries_source_path']} to #{libraries_destination_path}"
129
+ if config['libraries_server_path'].nil?
130
+ puts "Please define 'libraries_server_path' in configuration file"
131
+ else
132
+ js_libraries.each do |lib|
133
+ @downloader.download(File.join(config['libraries_server_path'], lib), File.join(libraries_destination_path, lib))
134
+ end
135
+
136
+ end
91
137
 
92
- js_libraries.each do |lib|
93
- @downloader.download(File.join(config['libraries_source_path'], lib+ ".js"), File.join(libraries_destination_path, lib + ".js"))
94
138
  end
95
139
  end
96
140
 
97
141
  def import_images
98
- config['images'].each do |image|
99
- check_and_create_dir image['dest']
100
- image_source_path = File.join(config['image_base_path'], image['src'])
101
- batch_download(image_source_path, image['dest'], image['types'])
142
+ check_and_complete_config!
143
+ if config.images?
144
+ puts "Start importing images..."
145
+
146
+ config['images'].each do |image|
147
+ check_and_create_dir image['relative_destination_path']
148
+ image_source_path = File.join(config['image_server_path'], image['server_path'])
149
+ batch_download(image_source_path, image['relative_destination_path'], image['file_types'])
150
+ end
151
+ else
152
+ puts "No image configuration found, skipping image import..."
102
153
  end
103
154
  end
104
155
 
@@ -107,19 +158,19 @@ module TerrImporter
107
158
  def batch_download(relative_source_path, relative_dest_path, type_filter = "")
108
159
  source_path = relative_source_path
109
160
 
110
- puts "Downloading multiple files from #{config['url']}#{source_path} to #{relative_dest_path} #{"allowed extensions: " + type_filter unless type_filter.empty?}"
161
+ puts "Downloading multiple files from #{config['application_url']}#{source_path} to #{relative_dest_path} #{"allowed extensions: " + type_filter unless type_filter.empty?}"
111
162
 
112
163
  files = html_directory_content_list(source_path)
113
164
 
114
165
  unless type_filter.empty?
115
166
  puts "Appling type filter: #{type_filter}"
116
- files = files.find_all { |file| file =~ Regexp.new(".*" + type_filter.strip.gsub(" ", "|") + "$") }
167
+ files = files.find_all { |file| file =~ Regexp.new(".*" + type_filter.robust_split.join("|") + "$") }
117
168
  end
118
169
 
119
170
  puts "Downloading #{files.size} files..."
120
171
  files.each do |file|
121
- destination_path = File.join(relative_dest_path, file)
122
- @downloader.download(File.join(source_path,file), destination_path)
172
+ relative_destination_path = File.join(relative_dest_path, file)
173
+ @downloader.download(File.join(source_path, file), relative_destination_path)
123
174
  end
124
175
  end
125
176
 
@@ -139,15 +190,10 @@ module TerrImporter
139
190
  raise DefaultError, "Specify js or css url" unless for_what == :js or for_what == :css
140
191
  export_settings = config['export_settings'].clone
141
192
 
142
- export_settings['application'] = config['app_path']
143
193
  export_settings.merge!(options)
144
194
  export_settings['appbaseurl'] = "" if for_what == :css
145
195
 
146
- #glue everything together
147
- export_path = config['export_path']
148
- export_path.insert(0, "/") unless export_path.match(/^\//)
149
-
150
- export_path = export_path % [for_what.to_s, config['version']] #replace placeholders
196
+ export_path = config['export_path'][for_what.to_s].clone
151
197
  export_path << '?' << export_settings.map { |k, v| "#{URI.escape(k.to_s)}=#{URI.escape(v.to_s)}" }.join("&")
152
198
  export_path
153
199
  end
@@ -166,8 +212,9 @@ module TerrImporter
166
212
  created_or_exists
167
213
  end
168
214
 
215
+ #todo refactor config access away
169
216
  def stylesheet_replace_strings!(line)
170
- config['stylesheets']['replace'].each do |replace|
217
+ config['stylesheets']['replace_strings'].each do |replace|
171
218
  what = replace['what']
172
219
  with = replace['with']
173
220
  what = Regexp.new "#{$1}" if what.match(/^r\/(.*)\//)
@@ -178,6 +225,12 @@ module TerrImporter
178
225
  end
179
226
  line
180
227
  end
228
+
229
+ def check_and_complete_config!
230
+ unless config.required_present?
231
+ determine_configuration_values_from_uri
232
+ end
233
+ end
181
234
  end
182
235
  end
183
236
  end