oaken 0.6.0 → 0.7.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: 3d441d9ce6156b7fa0f30b188f1f1e09a065292fb520c8415e8eae3e3b3f6aef
4
- data.tar.gz: b69bc4be147d5dca48ded82969b8abee63f10fd81b53015bf3c236d2abfcaadc
3
+ metadata.gz: 81f5e7a3ea1f5236b6e2726d1ecd24dee5698b59dc5e73f80ce618181b1dffe1
4
+ data.tar.gz: 6c4628800cdc44acd516a8e51a708fdee3d63ce506679fa5bc742b337da5c725
5
5
  SHA512:
6
- metadata.gz: 22c8eb550e6564429fed5302807d5586b77f8e19c2a5c097d168d23dec0bec25f8595db8a79ee654cdc24f67b7c1dbcb8c758c0dab38ffb03ccb823374e5ce94
7
- data.tar.gz: 7dcd270301eb5994cdfac1c2630e9a0c27ba45df0bf851f54dc78e47273625e8500bf357649eab7f04481ae8bb4bc68144813eb831229bc66814df0196defe33
6
+ metadata.gz: 5257b630ef4ac76db5b9fceb161df47d71e1df3481d1fdcd45fb1ac35319a72568d084f6e48a158cca3217512382890d5919111f329b08798f388e46d4ff5014
7
+ data.tar.gz: 2b91b6caeede127715691ecdeab3b8355ba273d9105b11f52579f7c4da2dcfefb7bfbc243ee4cc7b7de2af6401e95e195b4c377d31502ddd0162043e243c07aa
data/README.md CHANGED
@@ -64,6 +64,23 @@ Oaken has some chosen directory conventions to help strengthen your understandin
64
64
  - `db/seeds/data` for any data tables, like the plans a SaaS app has.
65
65
  - `db/seeds/tests/cases` for any specific cases that are only used in some tests, like `pagination.rb`.
66
66
 
67
+ ### Using default attributes
68
+
69
+ You can set up default attributes that's applied to created/inserted records at different levels, like this:
70
+
71
+ ```ruby
72
+ Oaken.prepare do
73
+ # Assign broad global defaults for every type.
74
+ defaults name: -> { Faker::Name.name }, public_key: -> { SecureRandom.hex }
75
+
76
+ # Assign a more specific default on one type, which overrides the global default above.
77
+ accounts.defaults name: -> { Faker::Business.name }
78
+ end
79
+ ```
80
+
81
+ > [!TIP]
82
+ > `defaults` are particularly well suited for assigning generated data with [Faker](https://github.com/faker-ruby/faker).
83
+
67
84
  ### Reusing data in tests
68
85
 
69
86
  With the setup above, Oaken can reuse the same data in tests like this:
@@ -77,6 +94,12 @@ end
77
94
 
78
95
  Now tests have access to `accounts.kaspers_donuts` and `users.kasper` etc. that were setup in the data scripts.
79
96
 
97
+ > [!NOTE]
98
+ > For RSpec, you can put this in `spec/rails_helper.rb`:
99
+ > ```ruby
100
+ > require "oaken/rspec_setup"
101
+ > ```
102
+
80
103
  You can also load a specific seed, like this:
81
104
 
82
105
  ```ruby
@@ -113,7 +136,7 @@ If bundler is not being used to manage dependencies, install the gem by executin
113
136
 
114
137
  ## Development
115
138
 
116
- After checking out the repo, run `bin/setup` to install dependencies. Then, run `cd test/dummy` and `bin/rails test` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
139
+ After checking out the repo, run `bin/setup` to install dependencies. Then, run `bin/rails test` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
117
140
 
118
141
  To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and the created tag, and push the `.gem` file to [rubygems.org](https://rubygems.org).
119
142
 
@@ -1,9 +1,8 @@
1
1
  RSpec.configure do |config|
2
- config.include(Oaken::Seeds)
3
-
2
+ config.include Oaken::Seeds
4
3
  config.use_transactional_fixtures = true
5
4
 
6
- config.before(:suite) do
5
+ config.before :suite do
7
6
  # Mimic fixtures by truncating before inserting.
8
7
  ActiveRecord::Tasks::DatabaseTasks.truncate_all
9
8
  Oaken.load_seed
data/lib/oaken/seeds.rb CHANGED
@@ -1,16 +1,43 @@
1
1
  module Oaken::Seeds
2
2
  extend self
3
3
 
4
- def self.method_missing(name, ...)
5
- if type = name.to_s.classify.safe_constantize
4
+ # Allow assigning defaults across different types.
5
+ def self.defaults(**defaults) = attributes.merge!(**defaults)
6
+ def self.defaults_for(*keys) = attributes.slice(*keys)
7
+ def self.attributes = @attributes ||= {}.with_indifferent_access
8
+
9
+ # Oaken's main auto-registering logic.
10
+ #
11
+ # So when you first call e.g. `accounts.create`, we'll hit `method_missing` here
12
+ # and automatically call `register Account`.
13
+ #
14
+ # We'll also match partial and full nested namespaces like in this order:
15
+ #
16
+ # accounts => Account
17
+ # account_jobs => AccountJob | Account::Job
18
+ # account_job_tasks => AccountJobTask | Account::JobTask | Account::Job::Task
19
+ #
20
+ # If you have classes that don't follow this naming convention, you must call `register` manually.
21
+ def self.method_missing(meth, ...)
22
+ name = meth.to_s.classify
23
+ name = name.sub!(/(?<=[a-z])(?=[A-Z])/, "::") until name.nil? or type = name.safe_constantize
24
+
25
+ if type
6
26
  register type
7
- public_send(name, ...)
27
+ public_send(meth, ...)
8
28
  else
9
29
  super
10
30
  end
11
31
  end
12
32
  def self.respond_to_missing?(name, ...) = name.to_s.classify.safe_constantize || super
13
33
 
34
+ # Register a model class to be accessible as an instance method via `include Oaken::Seeds`.
35
+ # Note: Oaken's auto-register via `method_missing` means it's less likely you need to call this manually.
36
+ #
37
+ # register Account, Account::Job, Account::Job::Task
38
+ #
39
+ # Oaken uses the `table_name` of the passed classes for the method names, e.g. here they'd be
40
+ # `accounts`, `account_jobs`, and `account_job_tasks`, respectively.
14
41
  def self.register(*types)
15
42
  types.each do |type|
16
43
  stored = provider.new(type) and define_method(stored.key) { stored }
@@ -1,7 +1,7 @@
1
1
  class Oaken::Stored::ActiveRecord
2
2
  def initialize(type)
3
3
  @type, @key = type, type.table_name
4
- @attributes = {}
4
+ @attributes = Oaken::Seeds.defaults_for(*type.column_names)
5
5
  end
6
6
  attr_reader :type, :key
7
7
  delegate :transaction, to: :type # For multi-db setups to help open a transaction on secondary connections.
data/lib/oaken/version.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Oaken
4
- VERSION = "0.6.0"
4
+ VERSION = "0.7.0"
5
5
  end
data/lib/oaken.rb CHANGED
@@ -18,17 +18,12 @@ module Oaken
18
18
 
19
19
  class Loader
20
20
  def initialize(path)
21
- @entries = Pathname.glob("#{path}{,/**/*}.{rb,sql}").sort
21
+ @entries = Pathname.glob("#{path}{,/**/*}.rb").sort
22
22
  end
23
23
 
24
- def load_onto(seeds)
25
- @entries.each do |path|
26
- ActiveRecord::Base.transaction do
27
- case path.extname
28
- when ".rb" then seeds.class_eval path.read, path.to_s
29
- when ".sql" then ActiveRecord::Base.connection.execute path.read
30
- end
31
- end
24
+ def load_onto(seeds) = @entries.each do |path|
25
+ ActiveRecord::Base.transaction do
26
+ seeds.class_eval path.read, path.to_s
32
27
  end
33
28
  end
34
29
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: oaken
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.6.0
4
+ version: 0.7.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Kasper Timm Hansen
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2024-05-13 00:00:00.000000000 Z
11
+ date: 2024-06-30 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description:
14
14
  email:
@@ -53,7 +53,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
53
53
  - !ruby/object:Gem::Version
54
54
  version: '0'
55
55
  requirements: []
56
- rubygems_version: 3.5.6
56
+ rubygems_version: 3.5.10
57
57
  signing_key:
58
58
  specification_version: 4
59
59
  summary: Oaken aims to blend your Fixtures/Factories and levels up your database seeds.