sus 0.4.0 → 0.5.0

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
  SHA256:
3
- metadata.gz: 8383ea04a6993d4e2c871ea7657c52489ef552ef3b8b07982eed6c9afe30b6eb
4
- data.tar.gz: 2e256747d0c6f2372afc6663242888da0ab8895600e956ce962531aa29e514cd
3
+ metadata.gz: fd31357ac07052a2e6c93a7dc674d2245a567644434eaf8e1983dedd7f594be7
4
+ data.tar.gz: c33ba038edd7f9c22896a6e3c4b8fe7f8880d4c0e8361c3d44cbd74bba35939f
5
5
  SHA512:
6
- metadata.gz: 93e210ec09d3512186fe2e82ed5fae116e72dda4ba64ec3b050387c3b0b233b3841050bded33bdf31b532cee71144205410a50fe54c270bbe101e3c6ddcfda91
7
- data.tar.gz: 28d48801189055201108645be27db4eace9b41a3e9dca8749eff807d9d192ae9f5889c98d683115265b1d42859774e05c4b87a80f082e4c95904ba0677752f9c
6
+ metadata.gz: bfcd742a489b8ec128cd79ab6d631b1ba6bc45421563eeec51acb476648bc5bb821dc5fccbf0530032e5075879c8271a1be0981825e444d0893a407ca6ebb6fa
7
+ data.tar.gz: 6014eff61f90083dbf9210faf64d2c7fec25c67cc8e0afa1721f20d3d730f7d8feea22c36e0db308b5712fea9b5a75433bd01785c0bea5eeb20bdb9a3ac5d7e4
data/lib/sus/describe.rb CHANGED
@@ -11,12 +11,12 @@ module Sus
11
11
  base.children = Hash.new
12
12
  end
13
13
 
14
- def self.build(parent, subject, identity: nil, &block)
14
+ def self.build(parent, subject, unique: true, &block)
15
15
  base = Class.new(parent)
16
16
  base.extend(Describe)
17
17
  base.subject = subject
18
- base.description = subject.inspect
19
- base.identity = identity || Identity.nested(parent.identity, base.description)
18
+ base.description = subject.to_s
19
+ base.identity = Identity.nested(parent.identity, base.description, unique: unique)
20
20
  base.define_method(:subject, ->{subject})
21
21
 
22
22
  if block_given?
@@ -35,8 +35,8 @@ module Sus
35
35
  end
36
36
 
37
37
  module Context
38
- def describe(...)
39
- add Describe.build(self, ...)
38
+ def describe(subject, **options, &block)
39
+ add Describe.build(self, subject, **options, &block)
40
40
  end
41
41
  end
42
42
  end
data/lib/sus/file.rb ADDED
@@ -0,0 +1,34 @@
1
+
2
+ require_relative 'context'
3
+
4
+ # This has to be done at the top level. It allows us to define constants within the given class while still retaining top-level constant resolution.
5
+ Sus::TOPLEVEL_CLASS_EVAL = ->(klass, path){klass.class_eval(::File.read(path), path)}
6
+
7
+ module Sus
8
+ module File
9
+ extend Context
10
+
11
+ attr_accessor :path
12
+
13
+ def self.extended(base)
14
+ base.children = Hash.new
15
+ end
16
+
17
+ def self.build(parent, path)
18
+ base = Class.new(parent)
19
+ base.extend(File)
20
+ base.description = path
21
+ base.identity = Identity.new(path)
22
+
23
+ TOPLEVEL_CLASS_EVAL.call(base, path)
24
+
25
+ return base
26
+ end
27
+ end
28
+
29
+ module Context
30
+ def file(path)
31
+ add File.build(self, path)
32
+ end
33
+ end
34
+ end
data/lib/sus/filter.rb CHANGED
@@ -16,7 +16,13 @@ module Sus
16
16
  end
17
17
 
18
18
  def insert(identity, context)
19
- @contexts[identity.key] = context
19
+ key = identity.key
20
+
21
+ if @contexts[key]
22
+ raise KeyError, "Assigning context to existing key: #{key.inspect}!"
23
+ else
24
+ @contexts[key] = context
25
+ end
20
26
  end
21
27
 
22
28
  def [] key
data/lib/sus/identity.rb CHANGED
@@ -7,6 +7,7 @@ module Sus
7
7
  self.new(location.path, name, location.lineno, parent, **options)
8
8
  end
9
9
 
10
+ # @parameter unique [Boolean | Symbol] Whether this identity is unique or needs a unique key/line number suffix.
10
11
  def initialize(path, name = nil, line = nil, parent = nil, unique: true)
11
12
  @path = path
12
13
  @name = name
@@ -55,7 +56,7 @@ module Sus
55
56
  unless @key
56
57
  key = Array.new
57
58
 
58
- append_unique_key(key, false)
59
+ append_unique_key(key)
59
60
 
60
61
  @key = key.join(':')
61
62
  end
@@ -65,15 +66,21 @@ module Sus
65
66
 
66
67
  protected
67
68
 
68
- def append_unique_key(key, unique = @unique)
69
+ def append_unique_key(key)
69
70
  if @parent
70
71
  @parent.append_unique_key(key)
71
72
  else
72
73
  key << @path
73
74
  end
74
75
 
75
- if @line
76
- key << @line unless unique
76
+ if @unique == true
77
+ # No key is needed because this identity is unique.
78
+ else
79
+ if @unique
80
+ key << @unique
81
+ elsif @line
82
+ key << @line
83
+ end
77
84
  end
78
85
  end
79
86
  end
data/lib/sus/it.rb CHANGED
@@ -7,7 +7,7 @@ module Sus
7
7
  base = Class.new(parent)
8
8
  base.extend(It)
9
9
  base.description = description
10
- base.identity = Identity.nested(parent.identity, base.description)
10
+ base.identity = Identity.nested(parent.identity, base.description, unique: false)
11
11
 
12
12
  if block_given?
13
13
  base.define_method(:call, &block)
@@ -11,11 +11,11 @@ module Sus
11
11
  base.children = Hash.new
12
12
  end
13
13
 
14
- def self.build(parent, shared)
14
+ def self.build(parent, shared, unique: false)
15
15
  base = Class.new(parent)
16
16
  base.extend(ItBehavesLike)
17
17
  base.description = shared.name
18
- base.identity = Identity.nested(parent.identity, base.description, unique: false)
18
+ base.identity = Identity.nested(parent.identity, base.description, unique: unique)
19
19
  base.class_exec(&shared.block)
20
20
  return base
21
21
  end
@@ -27,8 +27,8 @@ module Sus
27
27
  end
28
28
 
29
29
  module Context
30
- def it_behaves_like(shared)
31
- add ItBehavesLike.build(self, shared)
30
+ def it_behaves_like(shared, **options)
31
+ add ItBehavesLike.build(self, shared, **options)
32
32
  end
33
33
  end
34
34
  end
data/lib/sus/registry.rb CHANGED
@@ -1,6 +1,7 @@
1
1
 
2
2
  require_relative 'base'
3
3
 
4
+ require_relative 'file'
4
5
  require_relative 'describe'
5
6
  require_relative 'with'
6
7
 
@@ -12,9 +13,6 @@ require_relative 'include_context'
12
13
 
13
14
  require_relative 'let'
14
15
 
15
- # This has to be done at the top level. It allows us to define constants within the given class while still retaining top-level constant resolution.
16
- TOPLEVEL_CLASS_EVAL = ->(klass, path){klass.class_eval(File.read(path), path)}
17
-
18
16
  module Sus
19
17
  class Registry
20
18
  # Create a top level scope with self as the instance:
@@ -25,9 +23,7 @@ module Sus
25
23
  attr :base
26
24
 
27
25
  def load(path)
28
- @base.describe(path, identity: Identity.new(path)) do
29
- TOPLEVEL_CLASS_EVAL.call(self, path)
30
- end
26
+ @base.file(path)
31
27
  end
32
28
 
33
29
  def call(assertions = Assertions.default)
data/lib/sus/version.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Sus
4
- VERSION = "0.4.0"
4
+ VERSION = "0.5.0"
5
5
  end
data/lib/sus/with.rb CHANGED
@@ -12,12 +12,12 @@ module Sus
12
12
  base.children = Hash.new
13
13
  end
14
14
 
15
- def self.build(parent, subject, variables, &block)
15
+ def self.build(parent, subject, variables, unique: true, &block)
16
16
  base = Class.new(parent)
17
17
  base.extend(With)
18
18
  base.subject = subject
19
19
  base.description = subject
20
- base.identity = Identity.nested(parent.identity, base.description)
20
+ base.identity = Identity.nested(parent.identity, base.description, unique: unique)
21
21
  base.variables = variables
22
22
 
23
23
  variables.each do |key, value|
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sus
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.0
4
+ version: 0.5.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Samuel Williams
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-12-08 00:00:00.000000000 Z
11
+ date: 2021-12-09 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description:
14
14
  email:
@@ -28,6 +28,7 @@ files:
28
28
  - lib/sus/context.rb
29
29
  - lib/sus/describe.rb
30
30
  - lib/sus/expect.rb
31
+ - lib/sus/file.rb
31
32
  - lib/sus/filter.rb
32
33
  - lib/sus/have_duration.rb
33
34
  - lib/sus/identity.rb