oaken 0.6.0 → 0.7.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: 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.