xcop 0.2 → 0.3

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 224e5335c950bd78ecfdef602bfb503ca1c42b2d
4
- data.tar.gz: f5f46f16fdc922a08c4676cd00e036e7925f8434
3
+ metadata.gz: 5aa1f93ebccfdcec5e65a77c4d9a563ccbedb824
4
+ data.tar.gz: bfee771919d61c8fc4ca3adaf1c1031a992344c3
5
5
  SHA512:
6
- metadata.gz: dda353bb1dd435d438304047cc7f904bad2dcd28a575ab5fb58a111a742b9067deb93fe3aa069f389d5c2e8b4cdd9afbc3c2ffd9092c6eba733fa3558b4e7a4c
7
- data.tar.gz: dce36b9a1a547ebaafcb768ac0b0710d89441285c29fa7cc8592195f2ebf18ca6c90ca2d26055e88e74f370550692e693f0e3731fbbbb7a088e41108473f482f
6
+ metadata.gz: d6cb86b7d2a422f86d71c2729d20d179dac70e8e17a9e9eb577842bdfb416396293013ba49d1ec17bc92b4efe458e8e45c8e7cb3be57f32fe161a8207d0b4a94
7
+ data.tar.gz: 2d2b8245efe0a331ee2daf9e18fb454af68fb554d8497a5c2ca32d1e2deeb80a9ebdb288e72ae675bff52f8e76d5f8bfd78ed6247b97959bb713ca7251d5b3eb
data/.simplecov CHANGED
@@ -29,9 +29,9 @@ if Gem.win_platform? then
29
29
  add_filter "/features/"
30
30
  end
31
31
  else
32
- SimpleCov.formatter = SimpleCov::Formatter::MultiFormatter[
33
- SimpleCov::Formatter::HTMLFormatter,
34
- ]
32
+ SimpleCov.formatter = SimpleCov::Formatter::MultiFormatter.new(
33
+ [SimpleCov::Formatter::HTMLFormatter]
34
+ )
35
35
  SimpleCov.start do
36
36
  add_filter "/test/"
37
37
  add_filter "/features/"
data/README.md CHANGED
@@ -10,7 +10,7 @@
10
10
  [![Code Climate](http://img.shields.io/codeclimate/github/yegor256/xcop.svg)](https://codeclimate.com/github/yegor256/xcop)
11
11
  [![Test Coverage](https://img.shields.io/codecov/c/github/yegor256/xcop.svg)](https://codecov.io/github/yegor256/xcop?branch=master)
12
12
 
13
- ## What This is for?
13
+ ## What this is for?
14
14
 
15
15
  This command line tool validates your XML files for proper formatting.
16
16
  If they are not formatted correctly, it prints the difference and
@@ -18,7 +18,7 @@ returns with an error. You can use it two ways: 1) to fail your build
18
18
  if any X-like files (XML, XSD, XSL, XHTML) are not formatted correctly,
19
19
  and 2) to format them correctly.
20
20
 
21
- ## How to Install?
21
+ ## How to install?
22
22
 
23
23
  Install it first:
24
24
 
@@ -26,7 +26,7 @@ Install it first:
26
26
  $ gem install xcop
27
27
  ```
28
28
 
29
- ## How to Run?
29
+ ## How to run?
30
30
 
31
31
  Run it locally and read its output:
32
32
 
@@ -34,6 +34,20 @@ Run it locally and read its output:
34
34
  $ xcop --help
35
35
  ```
36
36
 
37
+ ## How to use in Rakefile?
38
+
39
+ This is what you need there:
40
+
41
+ ```ruby
42
+ require 'xcop/rake_task'
43
+ desc 'Run XCop on all XML/XSL files in all directories'
44
+ Xcop::RakeTask.new(:xcop) do |task|
45
+ task.license = 'LICENSE.txt'
46
+ task.includes = ['**/*.xml', '**/*.xsl']
47
+ task.excludes = ['target/**/*']
48
+ end
49
+ ```
50
+
37
51
  ## How to contribute?
38
52
 
39
53
  Just submit a pull request. Make sure `rake` passes.
data/bin/xcop CHANGED
@@ -50,22 +50,9 @@ Encoding.default_internal = Encoding::UTF_8
50
50
 
51
51
  license = opts.license? ? File.read(opts[:license]) : ''
52
52
 
53
- opts.arguments.each do |f|
54
- print "Validating #{f}... "
55
- doc = Xcop::Document.new(f)
56
- diff = doc.diff
57
- unless diff.empty?
58
- print "Error\n"
59
- puts diff
60
- exit -1
61
- end
62
- unless license.empty?
63
- ldiff = doc.ldiff(license)
64
- unless ldiff.empty?
65
- print "Broken license\n"
66
- puts ldiff
67
- exit -1
68
- end
69
- end
70
- print "OK\n"
53
+ begin
54
+ Xcop::CLI.new(opts.arguments, license).run
55
+ rescue StandardError => e
56
+ puts e.message
57
+ exit -1
71
58
  end
@@ -13,7 +13,7 @@ Feature: Gem Package
13
13
  fail 'no executables: ' + File.read('./spec.rb')
14
14
  end
15
15
  """
16
- When I run bash with
16
+ When I run bash with:
17
17
  """
18
18
  cd xcop
19
19
  gem build xcop.gemspec
@@ -0,0 +1,21 @@
1
+ Feature: Rake tasks
2
+ As a source code writer I want to be able to
3
+ run Xcop from Rakefile
4
+
5
+ Scenario: Xcop can be used in Rakefile
6
+ Given It is Unix
7
+ And I have a "Rakefile" file with content:
8
+ """
9
+ require 'xcop/rake_task'
10
+ Xcop::RakeTask.new(:xcop) do |task|
11
+ task.includes = ['**/*.xml']
12
+ end
13
+ """
14
+ And I have a "good.xml" file with content:
15
+ """
16
+ <?xml version="1.0"?>
17
+ <hello>Hello, world!</hello>
18
+
19
+ """
20
+ When I run bash with "rake xcop"
21
+ Then Exit code is zero
@@ -73,7 +73,13 @@ Then(/^Exit code is not zero$/) do
73
73
  raise 'Zero exit code' if @exitstatus == 0
74
74
  end
75
75
 
76
- When(/^I run bash with$/) do |text|
76
+ When(/^I run bash with "([^"]*)"$/) do |text|
77
+ FileUtils.copy_entry(@cwd, File.join(@dir, 'xcop'))
78
+ @stdout = `#{text}`
79
+ @exitstatus = $CHILD_STATUS.exitstatus
80
+ end
81
+
82
+ When(/^I run bash with:$/) do |text|
77
83
  FileUtils.copy_entry(@cwd, File.join(@dir, 'xcop'))
78
84
  @stdout = `#{text}`
79
85
  @exitstatus = $CHILD_STATUS.exitstatus
data/lib/xcop.rb CHANGED
@@ -29,6 +29,34 @@ require_relative 'xcop/version'
29
29
  # Copyright:: Copyright (c) 2017 Yegor Bugayenko
30
30
  # License:: MIT
31
31
  module Xcop
32
+ # Command line interface.
33
+ class CLI
34
+ def initialize(files, license)
35
+ @files = files
36
+ @license = license
37
+ end
38
+
39
+ def run
40
+ @files.each do |f|
41
+ print "Validating #{f}... "
42
+ doc = Document.new(f)
43
+ diff = doc.diff
44
+ unless diff.empty?
45
+ puts diff
46
+ raise "Invalid XML formatting in #{f}"
47
+ end
48
+ unless @license.empty?
49
+ ldiff = doc.ldiff(@license)
50
+ unless ldiff.empty?
51
+ puts ldiff
52
+ raise "Broken license in #{f}"
53
+ end
54
+ end
55
+ print "OK\n"
56
+ end
57
+ end
58
+ end
59
+
32
60
  # One document.
33
61
  class Document
34
62
  # Ctor.
@@ -0,0 +1,67 @@
1
+ # encoding: utf-8
2
+ #
3
+ # Copyright (c) 2017 Yegor Bugayenko
4
+ #
5
+ # Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ # of this software and associated documentation files (the 'Software'), to deal
7
+ # in the Software without restriction, including without limitation the rights
8
+ # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ # copies of the Software, and to permit persons to whom the Software is
10
+ # furnished to do so, subject to the following conditions:
11
+ #
12
+ # The above copyright notice and this permission notice shall be included in all
13
+ # copies or substantial portions of the Software.
14
+ #
15
+ # THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ # FITNESS FOR A PARTICULAR PURPOSE AND NONINFINGEMENT. IN NO EVENT SHALL THE
18
+ # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ # SOFTWARE.
22
+
23
+ require 'rake'
24
+ require 'rake/tasklib'
25
+ require_relative '../xcop'
26
+
27
+ # Xcop rake task.
28
+ # Author:: Yegor Bugayenko (yegor256@gmail.com)
29
+ # Copyright:: Copyright (c) 2017 Yegor Bugayenko
30
+ # License:: MIT
31
+ module Xcop
32
+ # Rake task.
33
+ class RakeTask < Rake::TaskLib
34
+ attr_accessor :name
35
+ attr_accessor :fail_on_error
36
+ attr_accessor :excludes
37
+ attr_accessor :includes
38
+ attr_accessor :license
39
+
40
+ def initialize(*args, &task_block)
41
+ @name = args.shift || :xcop
42
+ @includes = %w(xml xsd xhtml xsl html).map { |e| "**/*.#{e}" }
43
+ @excludes = []
44
+ @license = nil
45
+ desc 'Run Xcop' unless ::Rake.application.last_description
46
+ task(name, *args) do |_, task_args|
47
+ RakeFileUtils.send(:verbose, true) do
48
+ yield(*[self, task_args].slice(0, task_block.arity)) if block_given?
49
+ run
50
+ end
51
+ end
52
+ end
53
+
54
+ private
55
+
56
+ def run
57
+ require 'xcop'
58
+ bad = Dir.glob(@excludes)
59
+ good = Dir.glob(@includes).reject { |f| bad.include?(f) }
60
+ begin
61
+ Xcop::CLI.new(good, @license.nil? ? '' : File.read(@license)).run
62
+ rescue StandardError => e
63
+ abort(e.message)
64
+ end
65
+ end
66
+ end
67
+ end
data/lib/xcop/version.rb CHANGED
@@ -25,5 +25,5 @@
25
25
  # Copyright:: Copyright (c) 2017 Yegor Bugayenko
26
26
  # License:: MIT
27
27
  module Xcop
28
- VERSION = '0.2'.freeze
28
+ VERSION = '0.3'.freeze
29
29
  end
@@ -0,0 +1,56 @@
1
+ # encoding: utf-8
2
+ #
3
+ # Copyright (c) 2017 Yegor Bugayenko
4
+ #
5
+ # Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ # of this software and associated documentation files (the 'Software'), to deal
7
+ # in the Software without restriction, including without limitation the rights
8
+ # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ # copies of the Software, and to permit persons to whom the Software is
10
+ # furnished to do so, subject to the following conditions:
11
+ #
12
+ # The above copyright notice and this permission notice shall be included in all
13
+ # copies or substantial portions of the Software.
14
+ #
15
+ # THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ # FITNESS FOR A PARTICULAR PURPOSE AND NONINFINGEMENT. IN NO EVENT SHALL THE
18
+ # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ # SOFTWARE.
22
+
23
+ require 'minitest/autorun'
24
+ require 'tmpdir'
25
+ require 'rake'
26
+ require_relative '../lib/xcop/rake_task'
27
+
28
+ # Xcop rake task.
29
+ # Author:: Yegor Bugayenko (yegor256@gmail.com)
30
+ # Copyright:: Copyright (c) 2017 Yegor Bugayenko
31
+ # License:: MIT
32
+ class TestRakeTask < Minitest::Test
33
+ def test_basic
34
+ Dir.mktmpdir 'test' do |dir|
35
+ Dir.chdir(dir)
36
+ File.write('a.xml', "<?xml version=\"1.0\"?>\n<x/>\n")
37
+ Xcop::RakeTask.new(:xcop1) do |task|
38
+ # task.license = 'LICENSE.txt'
39
+ end
40
+ Rake::Task['xcop1'].invoke
41
+ end
42
+ end
43
+
44
+ def test_with_broken_xml
45
+ Dir.mktmpdir 'test' do |dir|
46
+ Dir.chdir(dir)
47
+ File.write('broken.xml', "<z><a><b></b></a>\n\n</z>")
48
+ Xcop::RakeTask.new(:xcop2) do |task|
49
+ task.excludes = ['test/**/*']
50
+ end
51
+ assert_raises SystemExit do
52
+ Rake::Task['xcop2'].invoke
53
+ end
54
+ end
55
+ end
56
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: xcop
3
3
  version: !ruby/object:Gem::Version
4
- version: '0.2'
4
+ version: '0.3'
5
5
  platform: ruby
6
6
  authors:
7
7
  - Yegor Bugayenko
@@ -190,11 +190,14 @@ files:
190
190
  - cucumber.yml
191
191
  - features/cli.feature
192
192
  - features/gem_package.feature
193
+ - features/rake.feature
193
194
  - features/step_definitions/steps.rb
194
195
  - features/support/env.rb
195
196
  - lib/xcop.rb
197
+ - lib/xcop/rake_task.rb
196
198
  - lib/xcop/version.rb
197
199
  - test/test__helper.rb
200
+ - test/test_rake_task.rb
198
201
  - test/test_xcop.rb
199
202
  - xcop.gemspec
200
203
  homepage: http://github.com/yegor256/xcop
@@ -225,7 +228,9 @@ summary: XML Formatting Static Validator
225
228
  test_files:
226
229
  - features/cli.feature
227
230
  - features/gem_package.feature
231
+ - features/rake.feature
228
232
  - features/step_definitions/steps.rb
229
233
  - features/support/env.rb
230
234
  - test/test__helper.rb
235
+ - test/test_rake_task.rb
231
236
  - test/test_xcop.rb