sus 0.4.0 → 0.5.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.
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