terrimporter 0.3.0 → 0.4.0

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.
data/.gitignore CHANGED
@@ -1,3 +1,7 @@
1
+ coverage
2
+ rdoc
3
+ doc
4
+ .yardoc
1
5
  *.gem
2
6
  .bundle
3
7
  Gemfile.lock
data/Gemfile.lock CHANGED
@@ -1,7 +1,8 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- terrimporter (0.3.0)
4
+ terrimporter (0.4.0)
5
+ kwalify
5
6
 
6
7
  GEM
7
8
  remote: http://rubygems.org/
@@ -11,6 +12,7 @@ GEM
11
12
  bundler (~> 1.0)
12
13
  git (>= 1.2.5)
13
14
  rake
15
+ kwalify (0.7.2)
14
16
  rake (0.9.2)
15
17
  rcov (0.9.9)
16
18
  shoulda (2.11.3)
data/Rakefile CHANGED
@@ -1,2 +1,29 @@
1
1
  require 'bundler'
2
2
  Bundler::GemHelper.install_tasks
3
+
4
+ require 'rake/testtask'
5
+ Rake::TestTask.new(:test) do |test|
6
+ test.libs << 'lib' << 'test'
7
+ test.pattern = 'test/**/test_*.rb'
8
+ test.verbose = true
9
+ end
10
+
11
+ require 'rcov/rcovtask'
12
+ Rcov::RcovTask.new do |test|
13
+ test.libs << 'test'
14
+ test.pattern = 'test/**/test_*.rb'
15
+ test.verbose = true
16
+ test.rcov_opts << '--exclude "gems/*"'
17
+ end
18
+
19
+ task :default => :test
20
+
21
+ require 'rake/rdoctask'
22
+ Rake::RDocTask.new do |rdoc|
23
+ version = File.exist?('VERSION') ? File.read('VERSION') : ""
24
+
25
+ rdoc.rdoc_dir = 'rdoc'
26
+ rdoc.title = "terrimporter #{version}"
27
+ rdoc.rdoc_files.include('README*')
28
+ rdoc.rdoc_files.include('lib/**/*.rb')
29
+ end
data/config/schema.yml ADDED
@@ -0,0 +1,89 @@
1
+ type: map
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":
15
+ type: str
16
+ required: yes
17
+ pattern: /^\/terrific.*\%2\$s.*\%1\$s.*\%1\$s.*\.php$/
18
+ "libraries_source_path":
19
+ type: str
20
+ required: yes
21
+ pattern: /\/.*/
22
+ "image_base_path":
23
+ type: str
24
+ required: yes
25
+ pattern: /\/.*/
26
+ "downloader":
27
+ type: str
28
+ enum: [curl, wget]
29
+ "export_settings":
30
+ type: map
31
+ mapping:
32
+ "layout":
33
+ type: str
34
+ required: yes
35
+ "debug":
36
+ type: bool
37
+ default: false
38
+ "cache":
39
+ type: bool
40
+ default: false
41
+ "stylesheets":
42
+ type: map
43
+ mapping:
44
+ "dest":
45
+ type: str
46
+ required: yes
47
+ "styles":
48
+ type: str
49
+ name: css
50
+ required: no
51
+ "replace":
52
+ type: seq
53
+ required: no
54
+ sequence:
55
+ - type: map
56
+ mapping:
57
+ "what":
58
+ type: str
59
+ required: yes
60
+ "with":
61
+ type: str
62
+ required: yes
63
+ "javascripts":
64
+ type: map
65
+ mapping:
66
+ "dest":
67
+ type: str
68
+ required: yes
69
+ "dynamic_libraries":
70
+ type: str
71
+ name: js
72
+ required: no
73
+ "libraries_dest":
74
+ type: str
75
+ required: yes
76
+ "images":
77
+ type: seq
78
+ sequence:
79
+ - type: map
80
+ mapping:
81
+ "src":
82
+ type: str
83
+ required: yes
84
+ "dest":
85
+ type: str
86
+ required: yes
87
+ "types":
88
+ type: str
89
+ required: no
@@ -35,24 +35,24 @@
35
35
  # dest: The destination directory, relative from the current running directory
36
36
  # types: The image endings to be downloaded, specified as a space separated string
37
37
  ########################################################################################################################
38
- terrific:
39
38
  version: 0.5
40
- url: http://terrific.abochecker
39
+ url: http://terrific.url
41
40
  app_path: /Users/danielkummer/_NAMICS/projekte/mobilezone/mobilezone-abo_optimizer/public/terrific
42
41
  export_path: /terrific/base/%2$s/public/%1$s/base/base.%1$s.php
43
42
  libraries_source_path: /js/libraries/dynamic/
43
+ #todo remove backslash
44
44
  image_base_path: /img
45
45
  downloader: curl
46
46
  export_settings:
47
47
  layout: project
48
48
  debug: false
49
- case: false
49
+ cache: false
50
50
  stylesheets:
51
51
  dest: public/stylesheets/
52
52
  styles: ie
53
53
  replace:
54
- - what: /img/
55
- with: /images/
54
+ - what: /img/
55
+ with: /images/
56
56
  javascripts:
57
57
  dest: public/javascripts/
58
58
  dynamic_libraries: warning pngfix
@@ -0,0 +1,21 @@
1
+ require 'kwalify'
2
+
3
+ class ConfigValidator < Kwalify::Validator
4
+ ## hook method called by Validator#validate()
5
+ def validate_hook(value, rule, path, errors)
6
+ case rule.name
7
+ when 'css'
8
+ #todo split space separated values and check for .css
9
+ if value =~ /\.css/
10
+ msg = "no .css extension allowed, use filename only."
11
+ errors << Kwalify::ValidationError.new(msg, path)
12
+ end
13
+ when 'js'
14
+ if value =~ /\.js/
15
+ msg = "no .js extension allowed, use filename only."
16
+ errors << Kwalify::ValidationError.new(msg, path)
17
+ end
18
+ end
19
+ end
20
+
21
+ end
@@ -0,0 +1,93 @@
1
+ require 'etc'
2
+ require 'kwalify'
3
+ require 'config_validator'
4
+
5
+ module TerrImporter
6
+ class Application
7
+ class Configuration < Hash
8
+
9
+ CONFIG_DEFAULT_NAME = 'terrimporter.config.yml'
10
+ SCHEMA_DEFAULT_NAME = 'schema.yml'
11
+
12
+ attr_accessor :validations, :config_file
13
+
14
+ def initialize(config_file = nil)
15
+ self.config_file = config_file unless config_file.nil?
16
+
17
+ end
18
+
19
+ def load_configuration
20
+ config_file_path = determine_config_file_path
21
+ validate_and_load_config(config_file_path)
22
+ end
23
+
24
+ def determine_config_file_path
25
+ unless self.config_file.nil?
26
+ return self.config_file
27
+ end
28
+
29
+ valid_config_paths.each do |path|
30
+ file_path = File.join path, CONFIG_DEFAULT_NAME
31
+ return file_path if File.exists?(file_path)
32
+ end
33
+
34
+ raise ConfigurationError, %Q{config file #{CONFIG_DEFAULT_NAME} not found in search paths. Search paths are:
35
+ #{valid_config_paths.join "\n"} \n If this is a new project, run with the option --init}
36
+ end
37
+
38
+ def valid_config_paths
39
+ [
40
+ Dir.pwd,
41
+ File.join(Dir.pwd, 'config'),
42
+ File.join(Dir.pwd, '.config'),
43
+ Etc.getpwuid.dir
44
+ ]
45
+ end
46
+
47
+ #todo split!
48
+ def validate_and_load_config(file)
49
+ puts "Load configuration "
50
+
51
+ schema = Kwalify::Yaml.load_file(schema_file_path)
52
+ #validator = Kwalify::Validator.new(schema)
53
+ validator = ConfigValidator.new(schema)
54
+
55
+ parser = Kwalify::Yaml::Parser.new(validator)
56
+ document = parser.parse_file(file)
57
+ ## show errors if exist
58
+ errors = parser.errors()
59
+ ##todo convert to single statement, map for example
60
+ if errors && !errors.empty?
61
+ error_message = ""
62
+ for e in errors
63
+ error_message << "#{e.linenum}:#{e.column} [#{e.path}] #{e.message}\n"
64
+ end
65
+ raise ConfigurationError, error_message
66
+ end
67
+
68
+ self.merge! document
69
+
70
+ end
71
+
72
+ def schema_file_path
73
+ File.join(File.dirname(__FILE__), '..', 'config', SCHEMA_DEFAULT_NAME)
74
+ end
75
+
76
+ #todo
77
+ def validate_schema
78
+ meta_validator = Kwalify::MetaValidator.instance
79
+
80
+ ## validate schema definition
81
+ parser = Kwalify::Yaml::Parser.new(meta_validator)
82
+ errors = parser.parse_file(schema_file_path)
83
+ for e in errors
84
+ puts "#{e.linenum}:#{e.column} [#{e.path}] #{e.message}"
85
+ end if errors && !errors.empty?
86
+ end
87
+
88
+ def create_config
89
+ FileUtils.cp(File.join(File.dirname(__FILE__), "..", "config", CONFIG_DEFAULT_NAME), File.join(Dir.pwd, CONFIG_DEFAULT_NAME))
90
+ end
91
+ end
92
+ end
93
+ end
data/lib/importer.rb CHANGED
@@ -4,9 +4,8 @@ require 'yaml'
4
4
  require 'uri'
5
5
 
6
6
 
7
- module TerrImporter
8
7
 
9
- CONFIG_DEFAULT_NAME = 'terrimporter.config.yml'
8
+ module TerrImporter
10
9
 
11
10
  class DefaultError < StandardError
12
11
  end
@@ -16,16 +15,20 @@ module TerrImporter
16
15
 
17
16
  class Importer
18
17
  require 'options'
18
+ require 'configuration'
19
19
  include Logging
20
20
 
21
+ #todo remove
21
22
  attr_accessor :options, :config
22
23
 
23
24
  def initialize(options = {})
24
25
  self.options = options
26
+ self.config = TerrImporter::Application::Configuration.new options[:config_file]
27
+
25
28
  end
26
29
 
27
30
  def run
28
- init_config(config_file_path)
31
+ self.config.load_configuration
29
32
 
30
33
  if options[:all] != nil and options[:all] == true
31
34
  import_js
@@ -106,39 +109,6 @@ module TerrImporter
106
109
  end
107
110
 
108
111
  private
109
- def init_config (config_file)
110
- raise ConfigurationError, "config file #{config_file} doesn't exist, if this is a new project, run with the option -i'" unless File.exists?(config_file)
111
- load_config(config_file)
112
- validate_config(self.config)
113
- end
114
-
115
- def config_file_path(config_directory = nil)
116
- config_directory = Dir.pwd if config_directory.nil?
117
- File.join(config_directory, CONFIG_DEFAULT_NAME)
118
- end
119
-
120
-
121
- def validate_config(config)
122
- raise ConfigurationError, "specify downloader (curl or wget)" unless config['downloader'] =~ /curl|wget/
123
- raise ConfigurationError, "url format invalid" unless config['url'] =~ URI::regexp
124
- raise ConfigurationError, "version invalid" if config['version'].to_s.empty?
125
- raise ConfigurationError, "app path invalid" if config['app_path'].to_s.empty?
126
- raise ConfigurationError, "export path invalid" if config['export_path'].to_s.empty?
127
- raise ConfigurationError, "image base path invalid" if config['image_base_path'].to_s.empty?
128
- config['stylesheets']['styles'].each do |css|
129
- raise ConfigurationError, ".css extension not allowed on style definition: #{css}" if css =~ /\.css$/
130
- end
131
- config['javascripts']['dynamic_libraries'].each do |js|
132
- raise ConfigurationError, ".js extension not allowed on javascript dynamic library definition: #{js}" if js =~ /\.js$/
133
- end
134
- raise ConfigurationError, "dynamic javascript libraries path invalid" if config['javascripts']['libraries_dest'].to_s.empty?
135
- end
136
-
137
- def load_config(file)
138
- puts "Load configuration "
139
- self.config = YAML.load_file(file)['terrific']
140
- end
141
-
142
112
 
143
113
  def batch_download_files(relative_source_path, relative_dest_path, type_filter = "")
144
114
  source_path = relative_source_path
data/lib/options.rb CHANGED
@@ -28,6 +28,9 @@ module TerrImporter
28
28
  o.on('-j', '--js', 'export configured javascript files') { self[:import_js] = true }
29
29
  o.on('--init', 'create configuration file in current working directory') { self[:init] = true }
30
30
  #todo add force option to init
31
+ o.on('-f', '--config CONFIG_FILE', 'use alternative configuration file') do |config_file|
32
+ self[:config_file] = config_file
33
+ end
31
34
 
32
35
  o.separator ''
33
36
  o.separator 'Additional configuration:'
@@ -59,7 +62,7 @@ module TerrImporter
59
62
  end
60
63
 
61
64
  def show_help_on_no_options
62
- self[:show_help] = true unless self[:import_css] or self[:import_js] or self[:import_images] or self[:init]
65
+ self[:show_help] = true unless self[:import_css] or self[:import_js] or self[:import_images] or self[:init] or self[:version]
63
66
  end
64
67
 
65
68
  end
data/lib/terrimporter.rb CHANGED
@@ -10,7 +10,6 @@ module TerrImporter
10
10
  def run!(*arguments)
11
11
  options = build_options(arguments)
12
12
 
13
-
14
13
  if options[:init]
15
14
  #todo the config path can be differen in importer, extract to special class for loading and managing
16
15
  #todo raise error instead of puts and exit
@@ -50,12 +49,6 @@ module TerrImporter
50
49
  end
51
50
  end
52
51
 
53
- #todo check force option, only override if not existing, else raise and exit
54
- def create_config
55
- FileUtils.cp(File.join(File.dirname(__FILE__), "..", "config", CONFIG_DEFAULT_NAME), File.join(Dir.pwd, CONFIG_DEFAULT_NAME))
56
- end
57
-
58
-
59
52
  def build_options(arguments)
60
53
  env_opts_string = ENV['TERRIMPORTER_OPTS'] || ""
61
54
  env_opts = TerrImporter::Application::Options.new(shellwords(env_opts_string))
@@ -1,3 +1,3 @@
1
1
  module Terrimporter
2
- VERSION = "0.3.0"
2
+ VERSION = "0.4.0"
3
3
  end
File without changes
File without changes
File without changes
data/terrimporter.gemspec CHANGED
@@ -10,7 +10,7 @@ Gem::Specification.new do |s|
10
10
  s.email = ["daniel.kummer@gmail.com"]
11
11
  s.homepage = ""
12
12
  s.summary = %q{Import terrific javascripts, css files and images into a web project}
13
- s.description = %q{This gem allows terrific(http://terrifically.org/) project import of css, javascript and image files based on a command line tool and a configuration file.}
13
+ s.description = %q{This gem allows terrific(http://terrifically.org/ ) project import of css, javascript and image files based on a command line tool and a configuration file.}
14
14
 
15
15
  s.rubyforge_project = "terrimporter"
16
16
 
@@ -19,6 +19,8 @@ Gem::Specification.new do |s|
19
19
  s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
20
20
  s.require_paths = ["lib"]
21
21
 
22
+ s.add_dependency "kwalify"
23
+
22
24
  s.add_development_dependency "shoulda", [">= 0"]
23
25
  s.add_development_dependency "bundler", ["~> 1.0.0"]
24
26
  s.add_development_dependency "jeweler", ["~> 1.6.4"]
@@ -0,0 +1,58 @@
1
+ require "test/unit"
2
+ require "kwalify"
3
+
4
+ class ConfigurationTest < Test::Unit::TestCase
5
+
6
+ def setup
7
+ create_test_configuration_file
8
+ @configuration = TerrImporter::Application::Configuration.new @test_configuration_file
9
+ @configuration.load_configuration
10
+ end
11
+
12
+ def teardown
13
+ puts "Cleaning up configuration files"
14
+ delete_test_configuration_file
15
+ end
16
+
17
+ should 'find a configuration in the local path and not raise an error' do
18
+ assert_nothing_raised do
19
+ @configuration.determine_config_file_path
20
+ end
21
+ end
22
+
23
+ context 'test config file independed functions' do
24
+ setup {
25
+ @configuration = TerrImporter::Application::Configuration.new
26
+ }
27
+
28
+ should 'get the current working directory as config file path' do
29
+ config_in_cwd = File.join(Dir.pwd, TerrImporter::Application::Configuration::CONFIG_DEFAULT_NAME)
30
+ assert_equal config_in_cwd, @configuration.determine_config_file_path
31
+ end
32
+
33
+ should 'create a config file in the current directory' do
34
+ config_path = File.join(Dir.pwd, TerrImporter::Application::Configuration::CONFIG_DEFAULT_NAME)
35
+ FileUtils.rm_f config_path if File.exists? config_path
36
+ @configuration.create_config
37
+ assert File.exists?(config_path)
38
+ end
39
+ end
40
+
41
+ def schema_file_path
42
+ File.join(File.dirname(__FILE__), '..', '..', 'config', TerrImporter::Application::Configuration::SCHEMA_DEFAULT_NAME)
43
+ end
44
+
45
+ def create_test_configuration_file
46
+ example_configuration_path = File.join(File.dirname(__FILE__), '..', '..', 'config', TerrImporter::Application::Configuration::CONFIG_DEFAULT_NAME)
47
+ tmp_dir_path = File.join(File.dirname(__FILE__), '..', 'tmp')
48
+ test_configuration_path = File.join(tmp_dir_path, TerrImporter::Application::Configuration::CONFIG_DEFAULT_NAME)
49
+ FileUtils.mkdir(tmp_dir_path) unless File.exist? tmp_dir_path
50
+ FileUtils.cp example_configuration_path, test_configuration_path
51
+ @test_configuration_file = test_configuration_path
52
+ end
53
+
54
+ def delete_test_configuration_file
55
+ FileUtils.rm_rf @test_configuration_file if File.exists? @test_configuration_file
56
+ end
57
+
58
+ end