cspec 0.1.4 → 0.1.5

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: e427c7b44fa48e7e15dcbbf3e0cb209068c51e9047f6d0e1b8f9a0de5e29fc0a
4
- data.tar.gz: 19d7e7c056cde836bdd5829bf7393a83eb0bbe1c97f9a09119ce44e7d9be3b30
3
+ metadata.gz: 714f4f91b2400d6116f74df4ffbe5ca1bc9c5bec537e732e40be0b98a7725257
4
+ data.tar.gz: fba0bb895cee486513aa75eca6b822bf4dc111e9f3036638addbfb86a56d2088
5
5
  SHA512:
6
- metadata.gz: '0907f02733e13b4123b5347b017f88a2851ffe81cd1428214edddd1671612cd99f03e10295c4c9468e5e51a267c7bf002bcffc9254501b310e9c3885c17cbea3'
7
- data.tar.gz: 81949fcf736842604f8230caf037682e8743a583be103b37671ada357fca388f5e3a3edc136193bb0f35598c1f581fe527d2917c25c222624877185cb7bb50b0
6
+ metadata.gz: da0f7fe559c1e5cc941cda78d4d2eeb2b78a29b69364c5b0c92581772d7447cad98a5f54ce035dd243020d08487dd5d33c3254d8ad58200493d5aaad17ad11a2
7
+ data.tar.gz: a5da9ae8fd9f37aa85a77f5f8ea9ba56a9b89d38bfdc50724398b49722ee166ffb106515f65137d9a841d572793317265def0e2a173292ef3ccdbf45d7c39418
@@ -0,0 +1,48 @@
1
+ # This workflow uses actions that are not certified by GitHub.
2
+ # They are provided by a third-party and are governed by
3
+ # separate terms of service, privacy policy, and support
4
+ # documentation.
5
+ # This workflow will download a prebuilt Ruby version, install dependencies and run tests with Rake
6
+ # For more information see: https://github.com/marketplace/actions/setup-ruby-jruby-and-truffleruby
7
+
8
+ name: Ruby
9
+
10
+ on:
11
+ push:
12
+ branches: [ main ]
13
+ pull_request:
14
+ branches: [ main ]
15
+
16
+ jobs:
17
+ test:
18
+
19
+ runs-on: ubuntu-latest
20
+ strategy:
21
+ matrix:
22
+ ruby-version: ['2.5', '2.6', '2.7', '3.0']
23
+
24
+ steps:
25
+ - uses: actions/checkout@v2
26
+ - name: Set up Ruby
27
+ # To automatically get bug fixes and new Ruby versions for ruby/setup-ruby,
28
+ # change this to (see https://github.com/ruby/setup-ruby#versioning):
29
+ # uses: ruby/setup-ruby@v1
30
+ uses: ruby/setup-ruby@473e4d8fe5dd94ee328fdfca9f8c9c7afc9dae5e
31
+ with:
32
+ ruby-version: ${{ matrix.ruby-version }}
33
+ bundler-cache: true # runs 'bundle install' and caches installed gems automatically
34
+ - name: Install Rubocop
35
+ run: gem install rubocop
36
+ - name: Run Rubocop
37
+ run: rubocop
38
+ - name: Run Specs
39
+ run: bundle exec rspec
40
+ - name: Run Basic Example
41
+ working-directory: ./examples/basic
42
+ run: bundle install && bundle exec ruby myspec.rb
43
+ - name: Run Method Args Example
44
+ working-directory: ./examples/method_args
45
+ run: bundle install && bundle exec ruby myspec.rb
46
+ - name: Run Class Methods Example
47
+ working-directory: ./examples/class_methods
48
+ run: bundle install && bundle exec ruby myspec.rb
data/.rubocop.yml ADDED
@@ -0,0 +1,4 @@
1
+ inherit_from: .rubocop_todo.yml
2
+
3
+ Style/Documentation:
4
+ Enabled: false
data/.rubocop_todo.yml ADDED
@@ -0,0 +1,28 @@
1
+ # This configuration was generated by
2
+ # `rubocop --auto-gen-config`
3
+ # on 2022-03-04 05:00:00 UTC using RuboCop version 1.25.1.
4
+ # The point is for the user to remove these configuration records
5
+ # one by one as the offenses are removed from the code base.
6
+ # Note that changes in the inspected code, or installation of new
7
+ # versions of RuboCop, may require this file to be generated again.
8
+
9
+ # Offense count: 3
10
+ # Configuration parameters: CountComments, CountAsOne, ExcludedMethods, IgnoredMethods.
11
+ # IgnoredMethods: refine
12
+ Metrics/BlockLength:
13
+ Max: 50
14
+
15
+ # Offense count: 1
16
+ # Configuration parameters: CountComments, CountAsOne, ExcludedMethods, IgnoredMethods.
17
+ Metrics/MethodLength:
18
+ Max: 11
19
+
20
+ # Offense count: 1
21
+ # Configuration parameters: CountKeywordArgs, MaxOptionalParameters.
22
+ Metrics/ParameterLists:
23
+ Max: 6
24
+
25
+ # Offense count: 1
26
+ Security/Eval:
27
+ Exclude:
28
+ - 'lib/cspec.rb'
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- cspec (0.1.3)
4
+ cspec (0.1.4)
5
5
 
6
6
  GEM
7
7
  remote: https://rubygems.org/
data/cspec.gemspec CHANGED
@@ -5,6 +5,7 @@ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
5
5
  require 'cspec/version'
6
6
 
7
7
  Gem::Specification.new do |spec|
8
+ spec.required_ruby_version = '>= 2.5.0'
8
9
  spec.name = 'cspec'
9
10
  spec.version = Cspec::VERSION
10
11
  spec.authors = ['Jarrod Folino']
@@ -1,2 +1,4 @@
1
+ # frozen_string_literal: true
2
+
1
3
  source 'https://rubygems.org'
2
- gem 'cspec'
4
+ gem 'cspec'
@@ -1,7 +1,7 @@
1
1
  GEM
2
2
  remote: https://rubygems.org/
3
3
  specs:
4
- cspec (0.1.2)
4
+ cspec (0.1.4)
5
5
 
6
6
  PLATFORMS
7
7
  ruby
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'cspec'
2
4
 
3
5
  class MyClass
@@ -7,4 +9,5 @@ class MyClass
7
9
  end
8
10
 
9
11
  result = CSpec::Runner.run!("#{Dir.pwd}/specs.csv")
10
- puts "Success: #{result}"
12
+ puts "Success: #{result}"
13
+ exit result ? 0 : 1
@@ -1,2 +1,2 @@
1
- class,name,type,method,expected
2
- MyClass,my test,instance,hello,world
1
+ class,name,type,method,method_args_1,expected
2
+ MyClass,my test,instance,hello,,world
@@ -0,0 +1,4 @@
1
+ # frozen_string_literal: true
2
+
3
+ source 'https://rubygems.org'
4
+ gem 'cspec'
@@ -0,0 +1,13 @@
1
+ GEM
2
+ remote: https://rubygems.org/
3
+ specs:
4
+ cspec (0.1.4)
5
+
6
+ PLATFORMS
7
+ ruby
8
+
9
+ DEPENDENCIES
10
+ cspec
11
+
12
+ BUNDLED WITH
13
+ 1.17.2
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'cspec'
4
+
5
+ class MyClass
6
+ def self.hello
7
+ 'world'
8
+ end
9
+
10
+ def self.say(name)
11
+ "Hello, #{name}"
12
+ end
13
+ end
14
+
15
+ result = CSpec::Runner.run!("#{Dir.pwd}/specs.csv")
16
+ puts "Success: #{result}"
17
+ exit result ? 0 : 1
@@ -0,0 +1,3 @@
1
+ class,name,type,method,method_args_1,expected
2
+ MyClass,my test,class,hello,,world
3
+ MyClass,my test,class,say,Bob,"Hello, Bob"
@@ -0,0 +1,4 @@
1
+ # frozen_string_literal: true
2
+
3
+ source 'https://rubygems.org'
4
+ gem 'cspec'
@@ -0,0 +1,13 @@
1
+ GEM
2
+ remote: https://rubygems.org/
3
+ specs:
4
+ cspec (0.1.4)
5
+
6
+ PLATFORMS
7
+ ruby
8
+
9
+ DEPENDENCIES
10
+ cspec
11
+
12
+ BUNDLED WITH
13
+ 1.17.2
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'cspec'
4
+
5
+ class MyClass
6
+ def greet(name)
7
+ "Hello, #{name}"
8
+ end
9
+ end
10
+
11
+ result = CSpec::Runner.run!("#{Dir.pwd}/specs.csv")
12
+ puts "Success: #{result}"
13
+ exit result ? 0 : 1
@@ -0,0 +1,2 @@
1
+ class,name,type,method,method_arg_1,expected
2
+ MyClass,my test,instance,greet,Bob,"Hello, Bob"
@@ -0,0 +1,30 @@
1
+ # frozen_string_literal: true
2
+
3
+ module CSpec
4
+ module Loader
5
+ def self.load(filename)
6
+ ::CSV.open(filename, headers: :first_row).map(&:to_h)
7
+ end
8
+
9
+ def self.process_args(spec)
10
+ process_arg(spec, /method_arg_\d+/, 'method_args').merge(
11
+ process_arg(spec, /initialization_arg_\d+/, 'initialization_args')
12
+ )
13
+ end
14
+
15
+ def self.process_arg(spec, regex, aggregate_key)
16
+ spec.merge({
17
+ aggregate_key => spec.keys
18
+ .select { |k| k.match?(regex) }
19
+ .inject([]) { |values, key| values << spec[key] }
20
+ })
21
+ end
22
+
23
+ def self.validate(filename)
24
+ headers = CSV.open(filename, &:readline)
25
+ %w[class type name method expected].map do |required_header|
26
+ "Need header: #{required_header}" unless headers.include?(required_header)
27
+ end.reject(&:nil?)
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,39 @@
1
+ # frozen_string_literal: true
2
+
3
+ module CSpec
4
+ class Result
5
+ attr_reader :name, :class, :method, :error, :description, :details
6
+
7
+ def self.success?(results)
8
+ results.count { |r| !r.error.nil? }.zero?
9
+ end
10
+
11
+ def self.from_spec(spec, error = nil)
12
+ Result.new(spec['name'], spec['class'], spec['method'],
13
+ error, spec['description'], nil)
14
+ end
15
+
16
+ def initialize(name, klass, method, error, description, details)
17
+ @name = name
18
+ @error = error
19
+ @class = klass
20
+ @method = method
21
+ @description = description
22
+ @details = details
23
+ end
24
+
25
+ def ==(other)
26
+ name == other.name &&
27
+ self.class == other.class &&
28
+ method == other.method &&
29
+ error == other.error &&
30
+ description == other.description &&
31
+ details == other.details
32
+ end
33
+
34
+ def to_s
35
+ "name: #{name}, class: #{self.class}, method: #{method}," \
36
+ " error: #{error}, description: #{description}, details: #{details}"
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,31 @@
1
+ # frozen_string_literal: true
2
+
3
+ module CSpec
4
+ module Runner
5
+ def self.run!(filepath)
6
+ errors = Loader.validate(filepath)
7
+ unless errors.empty?
8
+ puts errors
9
+ return false
10
+ end
11
+ specs = Loader.load(filepath)
12
+ results = run(specs)
13
+
14
+ return true if CSpec::Result.success?(results)
15
+
16
+ ResultsOutputter.display(results)
17
+ false
18
+ end
19
+
20
+ def self.run(specs)
21
+ specs.map do |spec|
22
+ result = ::CSpec::DataType.convert(::CSpec::Executer.do(spec))
23
+ expected = ::CSpec::DataType.convert(spec[:expected])
24
+ error_msg = "Expected #{spec[:expected]}, got: #{result}" if result != expected
25
+ Result.from_spec(spec, error_msg)
26
+ rescue StandardError => e
27
+ Result.from_spec(spec, e.inspect)
28
+ end
29
+ end
30
+ end
31
+ end
data/lib/cspec/version.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Cspec
4
- VERSION = '0.1.4'
4
+ VERSION = '0.1.5'
5
5
  end
data/lib/cspec.rb CHANGED
@@ -1,8 +1,11 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require 'cspec/version'
4
+ require 'cspec/runner'
5
+ require 'cspec/loader'
6
+ require 'cspec/result'
7
+
4
8
  require 'csv'
5
- require_relative 'result'
6
9
 
7
10
  module CSpec
8
11
  module ResultsOutputter
@@ -13,97 +16,36 @@ module CSpec
13
16
  end
14
17
  end
15
18
 
16
- module Loader
17
- def self.load(filename)
18
- ::CSV.open(filename, headers: :first_row).map(&:to_h)
19
- end
20
-
21
- def self.process_args(spec)
22
- method_arg_keys = spec.keys.select { |k| k.match?(/method\_arg\_\d+/) }
23
- combined_method_args = method_arg_keys.inject([]) do |values, key|
24
- values << spec[key]
25
- end
26
- spec.merge({"method_args" => combined_method_args})
27
- end
28
-
29
- def self.validate(filename)
30
- errors = []
31
- headers = CSV.open(filename, &:readline)
32
- %w[class type name method expected].each do |required_header|
33
- errors << "Need header: #{required_header}" unless headers.include?(required_header)
34
- end
35
- errors
36
- end
37
- end
38
-
39
19
  module Executer
40
20
  def self.do_instance(spec)
41
- class_under_test = Object.const_get(spec[:class])
42
- instance_under_test = class_under_test.new(*spec[:initialize_params])
43
- instance_under_test.send(spec[:method], *spec[:method_args])
21
+ class_under_test = Object.const_get(spec['class'])
22
+ instance_under_test = class_under_test.new(*spec['initialization_args'])
23
+ instance_under_test.send(spec['method'], *spec['method_args'])
44
24
  end
45
25
 
46
26
  def self.do_class(spec)
47
- class_under_test = Object.const_get(spec[:class])
48
- class_under_test.send(spec[:method], *spec[:method_args])
27
+ class_under_test = Object.const_get(spec['class'])
28
+ class_under_test.send(spec['method'], *spec['method_args'])
49
29
  end
50
- end
51
30
 
52
- module DataType
53
- def self.convert(input)
54
- if input =~ /^\d+\.\d+$/
55
- input.to_f
56
- elsif input =~ /^\d+$/
57
- input.to_i
58
- elsif input =~ /^\[.*\]$/
59
- eval(input)
60
- elsif ['', nil, 'nil'].include?(input)
61
- nil
62
- else
63
- input.to_s
31
+ def self.do(spec)
32
+ case spec[:type]
33
+ when 'class'
34
+ do_class(spec)
35
+ when 'instance'
36
+ do_instance(spec)
64
37
  end
65
38
  end
66
39
  end
67
40
 
68
- module Runner
69
- def self.run!(filepath)
70
- errors = Loader.validate(filepath)
71
- if errors.size != 0
72
- puts errors
73
- return false
74
- end
75
- specs = Loader.load(filepath)
76
- results = run(specs)
77
-
78
- if CSpec::Result.success?(results)
79
- return true
80
- else
81
- ResultsOutputter.display(results)
82
- return false
83
- end
84
- end
85
-
86
- def self.run(specs)
87
- results = []
88
- specs.each do |spec|
89
- result = case spec[:type]
90
- when 'class'
91
- ::CSpec::Executer.do_class(spec)
92
- when 'instance'
93
- ::CSpec::Executer.do_instance(spec)
94
- end
41
+ module DataType
42
+ def self.convert(input)
43
+ return input.to_f if input =~ /^\d+\.\d+$/
44
+ return input.to_i if input =~ /^\d+$/
45
+ return eval(input) if input =~ /^\[.*\]$/
46
+ return nil if ['', nil, 'nil'].include?(input)
95
47
 
96
- result = ::CSpec::DataType.convert(result)
97
- results << if result == ::CSpec::DataType.convert(spec[:expected])
98
- Result.new(spec['name'], spec['class'], spec['method'], nil, spec['description'], nil)
99
- else
100
- Result.new(spec['name'], spec['class'], spec['method'],
101
- "Expected #{spec[:expected]}, got: #{result}", spec['description'], nil)
102
- end
103
- rescue StandardError => e
104
- results << Result.new(spec[:name], spec[:class], spec[:method], e.inspect, spec[:description], nil)
105
- end
106
- results
48
+ input.to_s
107
49
  end
108
50
  end
109
51
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: cspec
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.4
4
+ version: 0.1.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jarrod Folino
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2022-02-27 00:00:00.000000000 Z
11
+ date: 2022-03-05 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -59,8 +59,11 @@ executables: []
59
59
  extensions: []
60
60
  extra_rdoc_files: []
61
61
  files:
62
+ - ".github/workflows/ruby.yml"
62
63
  - ".gitignore"
63
64
  - ".rspec"
65
+ - ".rubocop.yml"
66
+ - ".rubocop_todo.yml"
64
67
  - CODE_OF_CONDUCT.md
65
68
  - Gemfile
66
69
  - Gemfile.lock
@@ -74,9 +77,19 @@ files:
74
77
  - examples/basic/Gemfile.lock
75
78
  - examples/basic/myspec.rb
76
79
  - examples/basic/specs.csv
80
+ - examples/class_methods/Gemfile
81
+ - examples/class_methods/Gemfile.lock
82
+ - examples/class_methods/myspec.rb
83
+ - examples/class_methods/specs.csv
84
+ - examples/method_args/Gemfile
85
+ - examples/method_args/Gemfile.lock
86
+ - examples/method_args/myspec.rb
87
+ - examples/method_args/specs.csv
77
88
  - lib/cspec.rb
89
+ - lib/cspec/loader.rb
90
+ - lib/cspec/result.rb
91
+ - lib/cspec/runner.rb
78
92
  - lib/cspec/version.rb
79
- - lib/result.rb
80
93
  homepage: https://github.com/jarroddalefolino/cspec
81
94
  licenses:
82
95
  - MIT
@@ -90,7 +103,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
90
103
  requirements:
91
104
  - - ">="
92
105
  - !ruby/object:Gem::Version
93
- version: '0'
106
+ version: 2.5.0
94
107
  required_rubygems_version: !ruby/object:Gem::Requirement
95
108
  requirements:
96
109
  - - ">="
data/lib/result.rb DELETED
@@ -1,31 +0,0 @@
1
- module CSpec
2
- class Result
3
- attr_reader :name, :class, :method, :error, :description, :details
4
-
5
- def self.success?(results)
6
- results.count {|r|r.error != nil} == 0
7
- end
8
-
9
- def initialize(name, klass, method, error, description, details)
10
- @name = name
11
- @error = error
12
- @class = klass
13
- @method = method
14
- @description = description
15
- @details = details
16
- end
17
-
18
- def ==(other)
19
- name == other.name &&
20
- self.class == other.class &&
21
- self.method == other.method &&
22
- self.error == other.error &&
23
- self.description == other.description &&
24
- self.details == other.details
25
- end
26
-
27
- def to_s
28
- "name: #{self.name}, class: #{self.class}, method: #{self.method}, error: #{self.error}, description: #{self.description}, details: #{self.details}"
29
- end
30
- end
31
- end