katapult 0.3.0 → 0.4.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +30 -0
- data/README.md +57 -9
- data/bin/katapult +7 -3
- data/features/application_model.feature +4 -1
- data/features/authenticate.feature +1 -18
- data/features/basics.feature +1 -0
- data/features/binary.feature +5 -7
- data/features/model.feature +42 -3
- data/features/step_definitions/rails_steps.rb +1 -1
- data/features/web_ui.feature +17 -5
- data/lib/generators/katapult/app_model/templates/lib/katapult/application_model.rb +3 -0
- data/lib/generators/katapult/basics/basics_generator.rb +3 -8
- data/lib/generators/katapult/basics/templates/README.md.tt +33 -0
- data/lib/generators/katapult/basics/templates/features/support/paths.rb +1 -1
- data/lib/generators/katapult/clearance/clearance_generator.rb +6 -2
- data/lib/generators/katapult/clearance/templates/config/initializers/clearance.rb +1 -0
- data/lib/generators/katapult/cucumber_features/cucumber_features_generator.rb +10 -0
- data/lib/generators/katapult/cucumber_features/templates/feature.feature +4 -3
- data/lib/generators/katapult/model/model_generator.rb +15 -0
- data/lib/generators/katapult/model/templates/model.rb +13 -3
- data/lib/generators/katapult/model_specs/model_specs_generator.rb +1 -1
- data/lib/generators/katapult/model_specs/templates/model_spec.rb +1 -1
- data/lib/generators/katapult/transform/transform_generator.rb +4 -7
- data/lib/generators/katapult/views/templates/_form.html.haml +16 -13
- data/lib/generators/katapult/views/templates/show.html.haml +2 -0
- data/lib/katapult/application_model.rb +68 -19
- data/lib/katapult/element.rb +13 -18
- data/lib/katapult/{action.rb → elements/action.rb} +0 -0
- data/lib/katapult/elements/association.rb +35 -0
- data/lib/katapult/{attribute.rb → elements/attribute.rb} +14 -5
- data/lib/katapult/{authentication.rb → elements/authentication.rb} +2 -5
- data/lib/katapult/elements/model.rb +76 -0
- data/lib/katapult/{navigation.rb → elements/navigation.rb} +0 -0
- data/lib/katapult/{web_ui.rb → elements/web_ui.rb} +2 -12
- data/lib/katapult/generator.rb +2 -2
- data/lib/katapult/{binary_util.rb → support/binary_util.rb} +2 -1
- data/lib/katapult/{generator_goodies.rb → support/generator_goodies.rb} +9 -2
- data/lib/katapult/version.rb +1 -1
- data/script/console +5 -2
- data/script/update +1 -1
- data/spec/action_spec.rb +1 -1
- data/spec/application_model_spec.rb +26 -0
- data/spec/association_spec.rb +12 -0
- data/spec/attribute_spec.rb +35 -1
- data/spec/model_spec.rb +5 -2
- data/spec/util_spec.rb +1 -1
- data/spec/web_ui_spec.rb +11 -33
- metadata +17 -13
- data/lib/katapult/model.rb +0 -45
- data/lib/katapult/parser.rb +0 -53
- data/spec/parser_spec.rb +0 -26
@@ -0,0 +1,12 @@
|
|
1
|
+
require 'katapult/elements/association'
|
2
|
+
|
3
|
+
describe Katapult::Association do
|
4
|
+
|
5
|
+
subject { described_class.new('association') }
|
6
|
+
|
7
|
+
it 'stores its :belongs_to as String' do
|
8
|
+
subject = described_class.new('model', belongs_to: :other_model)
|
9
|
+
expect(subject.belongs_to).to eq 'other_model'
|
10
|
+
end
|
11
|
+
|
12
|
+
end
|
data/spec/attribute_spec.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
require 'katapult/attribute'
|
1
|
+
require 'katapult/elements/attribute'
|
2
2
|
|
3
3
|
describe Katapult::Attribute do
|
4
4
|
|
@@ -57,4 +57,38 @@ describe Katapult::Attribute do
|
|
57
57
|
end
|
58
58
|
end
|
59
59
|
|
60
|
+
describe '#asset_values_as_list?' do
|
61
|
+
it 'returns false when there are no assignable values given' do
|
62
|
+
subject = described_class.new('name')
|
63
|
+
expect(subject.assignable_values_as_list?).to be false
|
64
|
+
end
|
65
|
+
|
66
|
+
it 'returns false when assignable values are give as a string (= custom code)' do
|
67
|
+
subject = described_class.new('name', assignable_values: 'NameProvider.all')
|
68
|
+
expect(subject.assignable_values_as_list?).to be false
|
69
|
+
end
|
70
|
+
|
71
|
+
it 'returns true when assignable values are an Array' do
|
72
|
+
subject = described_class.new('name', assignable_values: %w[andi andy])
|
73
|
+
expect(subject.assignable_values_as_list?).to be true
|
74
|
+
end
|
75
|
+
|
76
|
+
it 'returns true when assignable values are a Range' do
|
77
|
+
subject = described_class.new('age', assignable_values: (1..99))
|
78
|
+
expect(subject.assignable_values_as_list?).to be true
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
describe '#has_defaults?' do
|
83
|
+
it 'returns false when it is an "assignable values" attribute' do
|
84
|
+
subject = described_class.new('kind', assignable_values: %w[customer guest])
|
85
|
+
expect(subject.has_defaults?).to be false
|
86
|
+
end
|
87
|
+
|
88
|
+
it 'returns false when it is a flag attribute' do
|
89
|
+
subject = described_class.new('active', type: :flag, default: true)
|
90
|
+
expect(subject.has_defaults?).to be false
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
60
94
|
end
|
data/spec/model_spec.rb
CHANGED
@@ -1,5 +1,4 @@
|
|
1
|
-
require 'katapult/model'
|
2
|
-
require 'katapult/attribute'
|
1
|
+
require 'katapult/elements/model'
|
3
2
|
|
4
3
|
describe Katapult::Model do
|
5
4
|
|
@@ -13,6 +12,10 @@ describe Katapult::Model do
|
|
13
12
|
|
14
13
|
expect(subject.label_attr.name).to eql('second_attr')
|
15
14
|
end
|
15
|
+
|
16
|
+
it 'raises an error when someone needs/wants/expect a label attribute but there is none' do
|
17
|
+
expect{ subject.label_attr }.to raise_error Katapult::Model::MissingLabelAttributeError
|
18
|
+
end
|
16
19
|
end
|
17
20
|
|
18
21
|
end
|
data/spec/util_spec.rb
CHANGED
data/spec/web_ui_spec.rb
CHANGED
@@ -1,5 +1,5 @@
|
|
1
|
-
require 'katapult/web_ui'
|
2
|
-
require 'katapult/model'
|
1
|
+
require 'katapult/elements/web_ui'
|
2
|
+
require 'katapult/elements/model'
|
3
3
|
require 'katapult/application_model'
|
4
4
|
|
5
5
|
describe Katapult::WebUI do
|
@@ -37,43 +37,21 @@ describe Katapult::WebUI do
|
|
37
37
|
|
38
38
|
describe '#model' do
|
39
39
|
it 'returns the model object' do
|
40
|
-
|
41
|
-
model = Katapult::Model.new('User')
|
40
|
+
application_model.model 'User'
|
42
41
|
|
43
|
-
|
44
|
-
|
42
|
+
subject = described_class.new('Customer',
|
43
|
+
model: 'User',
|
44
|
+
application_model: application_model,
|
45
|
+
)
|
45
46
|
|
46
|
-
expect(subject.model).to
|
47
|
+
expect(subject.model).to be application_model.models.first
|
47
48
|
end
|
48
49
|
|
49
50
|
it 'detects the model from its own name, if not stated explicitly' do
|
50
|
-
|
51
|
-
|
51
|
+
application_model.model 'Customer'
|
52
|
+
subject = described_class.new('Customer', application_model: application_model)
|
52
53
|
|
53
|
-
|
54
|
-
application_model.add_model(model)
|
55
|
-
|
56
|
-
expect(subject.model).to eql(model)
|
57
|
-
end
|
58
|
-
|
59
|
-
it 'raises an error if it cannot find the model' do
|
60
|
-
subject = described_class.new('MissingModel')
|
61
|
-
application_model.add_web_ui(subject)
|
62
|
-
|
63
|
-
expect{ subject.model }.to raise_error(Katapult::WebUI::UnknownModelError)
|
64
|
-
end
|
65
|
-
end
|
66
|
-
|
67
|
-
describe '#render' do
|
68
|
-
it 'raises an error when its model does not have a label attribute' do
|
69
|
-
subject = described_class.new('user')
|
70
|
-
model = Katapult::Model.new('user')
|
71
|
-
|
72
|
-
application_model.add_web_ui(subject)
|
73
|
-
application_model.add_model(model)
|
74
|
-
|
75
|
-
expect{ subject.render }.to raise_error Katapult::WebUI::MissingLabelAttrError,
|
76
|
-
'Cannot render a WebUI without a model with a label attribute'
|
54
|
+
expect(subject.model).to be application_model.models.first
|
77
55
|
end
|
78
56
|
end
|
79
57
|
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: katapult
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.4.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Dominik Schöler
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-01-
|
11
|
+
date: 2018-01-15 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rails
|
@@ -52,6 +52,7 @@ files:
|
|
52
52
|
- ".gitignore"
|
53
53
|
- ".rspec"
|
54
54
|
- ".ruby-version"
|
55
|
+
- CHANGELOG.md
|
55
56
|
- Gemfile
|
56
57
|
- Guardfile
|
57
58
|
- LICENSE.txt
|
@@ -86,6 +87,7 @@ files:
|
|
86
87
|
- lib/generators/katapult/basics/templates/Capfile
|
87
88
|
- lib/generators/katapult/basics/templates/Gemfile
|
88
89
|
- lib/generators/katapult/basics/templates/Guardfile
|
90
|
+
- lib/generators/katapult/basics/templates/README.md.tt
|
89
91
|
- lib/generators/katapult/basics/templates/app/controllers/errors_controller.rb
|
90
92
|
- lib/generators/katapult/basics/templates/app/helpers/unpoly_helper.rb
|
91
93
|
- lib/generators/katapult/basics/templates/app/views/layouts/_flashes.html.haml
|
@@ -189,27 +191,28 @@ files:
|
|
189
191
|
- lib/generators/katapult/web_ui/templates/controller.rb
|
190
192
|
- lib/generators/katapult/web_ui/web_ui_generator.rb
|
191
193
|
- lib/katapult.rb
|
192
|
-
- lib/katapult/action.rb
|
193
194
|
- lib/katapult/application_model.rb
|
194
|
-
- lib/katapult/attribute.rb
|
195
|
-
- lib/katapult/authentication.rb
|
196
|
-
- lib/katapult/binary_util.rb
|
197
195
|
- lib/katapult/element.rb
|
196
|
+
- lib/katapult/elements/action.rb
|
197
|
+
- lib/katapult/elements/association.rb
|
198
|
+
- lib/katapult/elements/attribute.rb
|
199
|
+
- lib/katapult/elements/authentication.rb
|
200
|
+
- lib/katapult/elements/model.rb
|
201
|
+
- lib/katapult/elements/navigation.rb
|
202
|
+
- lib/katapult/elements/web_ui.rb
|
198
203
|
- lib/katapult/generator.rb
|
199
|
-
- lib/katapult/
|
200
|
-
- lib/katapult/
|
201
|
-
- lib/katapult/navigation.rb
|
202
|
-
- lib/katapult/parser.rb
|
204
|
+
- lib/katapult/support/binary_util.rb
|
205
|
+
- lib/katapult/support/generator_goodies.rb
|
203
206
|
- lib/katapult/version.rb
|
204
|
-
- lib/katapult/web_ui.rb
|
205
207
|
- script/console
|
206
208
|
- script/kta
|
207
209
|
- script/update
|
208
210
|
- spec/action_spec.rb
|
211
|
+
- spec/application_model_spec.rb
|
212
|
+
- spec/association_spec.rb
|
209
213
|
- spec/attribute_spec.rb
|
210
214
|
- spec/element_spec.rb
|
211
215
|
- spec/model_spec.rb
|
212
|
-
- spec/parser_spec.rb
|
213
216
|
- spec/spec_helper.rb
|
214
217
|
- spec/util_spec.rb
|
215
218
|
- spec/web_ui_spec.rb
|
@@ -255,10 +258,11 @@ test_files:
|
|
255
258
|
- features/support/env.rb
|
256
259
|
- features/web_ui.feature
|
257
260
|
- spec/action_spec.rb
|
261
|
+
- spec/application_model_spec.rb
|
262
|
+
- spec/association_spec.rb
|
258
263
|
- spec/attribute_spec.rb
|
259
264
|
- spec/element_spec.rb
|
260
265
|
- spec/model_spec.rb
|
261
|
-
- spec/parser_spec.rb
|
262
266
|
- spec/spec_helper.rb
|
263
267
|
- spec/util_spec.rb
|
264
268
|
- spec/web_ui_spec.rb
|
data/lib/katapult/model.rb
DELETED
@@ -1,45 +0,0 @@
|
|
1
|
-
# Models a Rails model.
|
2
|
-
|
3
|
-
require 'katapult/element'
|
4
|
-
require 'katapult/attribute'
|
5
|
-
require 'generators/katapult/model/model_generator'
|
6
|
-
|
7
|
-
module Katapult
|
8
|
-
class Model < Element
|
9
|
-
|
10
|
-
UnknownAttributeError = Class.new(StandardError)
|
11
|
-
|
12
|
-
attr_accessor :attrs
|
13
|
-
|
14
|
-
def initialize(*args)
|
15
|
-
self.attrs = []
|
16
|
-
|
17
|
-
super
|
18
|
-
end
|
19
|
-
|
20
|
-
def attr(attr_name, options = {})
|
21
|
-
attrs << Attribute.new(attr_name, options)
|
22
|
-
end
|
23
|
-
|
24
|
-
def label_attr
|
25
|
-
renderable_attrs.first
|
26
|
-
end
|
27
|
-
|
28
|
-
def db_fields
|
29
|
-
attrs.reject(&:skip_db)
|
30
|
-
end
|
31
|
-
|
32
|
-
def renderable_attrs
|
33
|
-
attrs.reject { |a| %w[plain_json json password].include? a.type.to_s }
|
34
|
-
end
|
35
|
-
|
36
|
-
def editable_attrs
|
37
|
-
attrs.reject { |a| %w[plain_json json].include? a.type.to_s }
|
38
|
-
end
|
39
|
-
|
40
|
-
def render
|
41
|
-
Generators::ModelGenerator.new(self).invoke_all
|
42
|
-
end
|
43
|
-
|
44
|
-
end
|
45
|
-
end
|
data/lib/katapult/parser.rb
DELETED
@@ -1,53 +0,0 @@
|
|
1
|
-
# This class reads an application model file and turns it into an
|
2
|
-
# ApplicationModel instance.
|
3
|
-
|
4
|
-
require_relative 'application_model'
|
5
|
-
require 'katapult/model'
|
6
|
-
require 'katapult/web_ui'
|
7
|
-
require 'katapult/navigation'
|
8
|
-
require 'katapult/authentication'
|
9
|
-
|
10
|
-
module Katapult
|
11
|
-
class Parser
|
12
|
-
|
13
|
-
def initialize
|
14
|
-
self.application_model = Katapult::ApplicationModel.new
|
15
|
-
end
|
16
|
-
|
17
|
-
def parse(application_model_string, path_to_model = '')
|
18
|
-
instance_eval application_model_string, path_to_model
|
19
|
-
|
20
|
-
application_model
|
21
|
-
end
|
22
|
-
|
23
|
-
def model(name, &block)
|
24
|
-
application_model.add_model Model.new(name, &block)
|
25
|
-
end
|
26
|
-
|
27
|
-
def web_ui(name, options = {}, &block)
|
28
|
-
application_model.add_web_ui WebUI.new(name, options, &block)
|
29
|
-
end
|
30
|
-
|
31
|
-
# A shortcut to create a #model together with a default #web_ui with CRUD
|
32
|
-
# actions
|
33
|
-
def crud(name, &block)
|
34
|
-
application_model.add_model Model.new(name, &block)
|
35
|
-
application_model.add_web_ui WebUI.new(name, &:crud)
|
36
|
-
end
|
37
|
-
|
38
|
-
def navigation(name = :main)
|
39
|
-
application_model.set_navigation Navigation.new(name)
|
40
|
-
end
|
41
|
-
|
42
|
-
def authenticate(name, system_email:)
|
43
|
-
application_model.set_authentication Authentication.new(name,
|
44
|
-
system_email: system_email
|
45
|
-
)
|
46
|
-
end
|
47
|
-
|
48
|
-
private
|
49
|
-
|
50
|
-
attr_accessor :application_model
|
51
|
-
|
52
|
-
end
|
53
|
-
end
|
data/spec/parser_spec.rb
DELETED
@@ -1,26 +0,0 @@
|
|
1
|
-
require 'katapult/parser'
|
2
|
-
|
3
|
-
describe Katapult::Parser do
|
4
|
-
|
5
|
-
describe '#crud' do
|
6
|
-
it 'creates a model plus a web UI with crud actions' do
|
7
|
-
model = <<-MODEL
|
8
|
-
crud 'user' do |user|
|
9
|
-
user.attr :age
|
10
|
-
end
|
11
|
-
MODEL
|
12
|
-
|
13
|
-
parsed_model = subject.parse(model)
|
14
|
-
expect(parsed_model.models.count).to be 1
|
15
|
-
user = parsed_model.models.first
|
16
|
-
expect(user.name).to eq 'user'
|
17
|
-
expect(user.attrs.count).to be 1
|
18
|
-
expect(user.attrs.first.name).to eq 'age'
|
19
|
-
|
20
|
-
expect(parsed_model.web_uis.count).to be 1
|
21
|
-
web_ui = parsed_model.web_uis.first
|
22
|
-
expect(web_ui.actions.map(&:name)).to match Katapult::WebUI::RAILS_ACTIONS
|
23
|
-
end
|
24
|
-
end
|
25
|
-
|
26
|
-
end
|