release_notes 0.3.4 → 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/README.md +7 -69
- data/lib/generators/release_notes/orm_helpers.rb +0 -8
- data/lib/generators/templates/release_notes.rb +1 -7
- data/lib/release_notes/cli.rb +0 -5
- data/lib/release_notes/version.rb +1 -1
- data/lib/release_notes.rb +0 -8
- metadata +1 -9
- data/app/views/release_notes/broadcasts/_bare.html.erb +0 -5
- data/app/views/release_notes/broadcasts/_link_back.html.erb +0 -6
- data/lib/generators/active_record/broadcasts_generator.rb +0 -47
- data/lib/generators/active_record/templates/broadcasts_migration.rb +0 -13
- data/lib/generators/release_notes/broadcasts_generator.rb +0 -16
- data/lib/generators/templates/broadcast_blank.md +0 -3
- data/lib/release_notes/cli/broadcast.rb +0 -116
- data/lib/release_notes/generators/broadcast.rb +0 -58
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 731dcb71f1a19814625ea48da3cfd1fa952a9c0e
|
4
|
+
data.tar.gz: 6f51fcd0ea61d46157b59cc2a7adebde72002921
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c0ad76f89c32fa8f47fdd59de3ddf16127d785bce48399311e6a9564897e023acb00a6ca2ad7c7587321b1b3fd64257380ab4471f40cbd2ce4662bc26dbdeef5
|
7
|
+
data.tar.gz: 232cb6697d9e10cc1e84bb2fbd96906747217a44432f6473f3d70c8d39f507707748c1f5b8f5581a1fea5280a1c8bdd287823a8a38486dbbf0ef86ff878bfdfb
|
data/README.md
CHANGED
@@ -32,45 +32,6 @@ Be sure to migrate your database.
|
|
32
32
|
|
33
33
|
$ rake db:migrate
|
34
34
|
|
35
|
-
### Optional
|
36
|
-
|
37
|
-
#### Broadcasts
|
38
|
-
|
39
|
-
To add the ability to display broadcasts of new releases (or any other messages) run the following:
|
40
|
-
|
41
|
-
$ rails generate release_notes:broadcasts Broadcast
|
42
|
-
|
43
|
-
This will generate a model named `Broadcast` in your Rails project. You can choose to use a different model name, but you must edit the release_notes initializer file with the updated Broadcast name.
|
44
|
-
|
45
|
-
Migrate your database.
|
46
|
-
|
47
|
-
$ rake db:migrate
|
48
|
-
|
49
|
-
Then add one of the following render tags to whichever view you'd like to display the broadcast message in.
|
50
|
-
|
51
|
-
<%= render 'release_notes/broadcasts/link_back' %>
|
52
|
-
|
53
|
-
OR...
|
54
|
-
|
55
|
-
<%= render 'release_notes/broadcasts/bare' %>
|
56
|
-
|
57
|
-
#### Views
|
58
|
-
|
59
|
-
While not necessary, you may want to copy over the ReleaseNotes views to your app to customize:
|
60
|
-
|
61
|
-
$ rails generate release_notes:views
|
62
|
-
|
63
|
-
If you do decide to customize the ReleaseNotes views and want to use your own layout you should probably **(1)** edit the layout declaration in `app/decorators/controllers/release_notes/release_notes_controller_decorator.rb` and **(2)** add one of the following stylesheet_link_tag snippets to your view:
|
64
|
-
|
65
|
-
<%= stylesheet_link_tag "release_notes/application", media: "all" %>
|
66
|
-
|
67
|
-
Will load Bootstrap 3 and a [Github Flavored Markdown](https://help.github.com/articles/github-flavored-markdown) style.
|
68
|
-
|
69
|
-
<%= stylesheet_link_tag "release_notes/github", media: "all" %>
|
70
|
-
|
71
|
-
Will load just the [Github Flavored Markdown](https://help.github.com/articles/github-flavored-markdown) style.
|
72
|
-
|
73
|
-
|
74
35
|
## Usage
|
75
36
|
|
76
37
|
### Generate a new release note template
|
@@ -95,42 +56,19 @@ After finalizing your release note markdown file be sure to update your ReleaseN
|
|
95
56
|
|
96
57
|
$ release_notes update
|
97
58
|
|
98
|
-
If you ever want to update a
|
99
|
-
|
100
|
-
$ release_notes update -v=VERSION
|
101
|
-
|
102
|
-
This will only update the release note matching the version number specified.
|
103
|
-
|
104
|
-
### View release notes in your application
|
105
|
-
|
106
|
-
To view all of your release notes just visit `http://yourapp/release_notes` (or whatever route is mounted in your `routes.rb` file) in your application. To view a specific version just visit `http://yourapp/release_notes/:version` where `:version` is the release notes version that you are looking to view using underscores instead of periods (i.e. `0_1_0`).
|
107
|
-
|
108
|
-
### Create a new Broadcast
|
109
|
-
|
110
|
-
To create a new Broadcast run:
|
111
|
-
|
112
|
-
$ release_notes broadcast new
|
113
|
-
|
114
|
-
This will generate a broadcast markdown file which you can edit.
|
115
|
-
**Note:** You *can* use HTML within the markdown file.
|
116
|
-
|
117
|
-
### Update Broadcast
|
59
|
+
If you ever want to update a previous release note and/or want to rebuild your ReleaseNotes model and README you can run the following:
|
118
60
|
|
119
|
-
|
61
|
+
$ release_notes update -r
|
120
62
|
|
121
|
-
|
63
|
+
### Getting Help
|
122
64
|
|
123
|
-
|
65
|
+
To get additional help on release_notes commands or to see all available options just run:
|
124
66
|
|
125
|
-
$ release_notes
|
67
|
+
$ release_notes --help [command]
|
126
68
|
|
127
|
-
###
|
128
|
-
|
129
|
-
You can set a specific broadcast to set as the "latest" broadcast (the default shown by using the broadcast partials) by running the following:
|
130
|
-
|
131
|
-
$ release_notes broadcast set_version VERSION
|
69
|
+
### View release notes in your application
|
132
70
|
|
133
|
-
|
71
|
+
To view all of your release notes just visit `http://yourapp/release_notes` (or whatever route is mounted in your `routes.rb` file) in your application. To view a specific version just visit `http://yourapp/release_notes/:version` where `:version` is the release notes version that you are looking to view using underscores instead of periods (i.e. `0_1_0`).
|
134
72
|
|
135
73
|
## Contributing
|
136
74
|
|
@@ -6,16 +6,10 @@ ReleaseNotes.setup do |config|
|
|
6
6
|
# Name of the model you're using to store the various release notes.
|
7
7
|
config.release_note_model = 'ReleaseNote'
|
8
8
|
|
9
|
-
# Name of the model you're using to store broadcasts.
|
10
|
-
config.broadcast_model = 'Broadcast'
|
11
|
-
|
12
9
|
# Name of the model you're using to store users.
|
13
10
|
config.user_model = 'User'
|
14
11
|
|
15
|
-
# Name of the
|
16
|
-
config.user_broadcast_model = 'UserBroadcast'
|
17
|
-
|
18
|
-
# Name of the folder you're using to store the release note and broadcast markdown files.
|
12
|
+
# Name of the folder you're using to store the release note markdown files.
|
19
13
|
config.release_note_folder = 'release_notes'
|
20
14
|
|
21
15
|
# Path that ReleaseNotes::Engine is mounted at in the config/routes.rb file.
|
data/lib/release_notes/cli.rb
CHANGED
@@ -2,15 +2,11 @@ require 'thor'
|
|
2
2
|
require 'release_notes'
|
3
3
|
require 'release_notes/version'
|
4
4
|
require 'release_notes/versioning'
|
5
|
-
require 'release_notes/cli/broadcast'
|
6
5
|
require 'release_notes/cli/helpers'
|
7
6
|
require 'release_notes/generators/release_note'
|
8
|
-
require 'release_notes/generators/broadcast'
|
9
7
|
|
10
8
|
module ReleaseNotes
|
11
9
|
class CLI < Thor
|
12
|
-
register(Broadcast, 'broadcast', 'broadcast [COMMAND]', 'Create a new broadcast or update Broadcast models')
|
13
|
-
|
14
10
|
package_name 'ReleaseNotes'
|
15
11
|
map '-v' => :version
|
16
12
|
|
@@ -47,7 +43,6 @@ module ReleaseNotes
|
|
47
43
|
method_option :destination, :aliases => '-d', :default => ReleaseNotes.release_note_folder, :desc => 'relative location of release note folder'
|
48
44
|
method_option :no_log, :aliases => '-n', :type => :boolean, :default => false, :desc => 'disable README.md log of release notes'
|
49
45
|
method_option :reset, :aliases => '-r', :type => :boolean, :default => false, :desc => 'delete all model entries and rebuilds them'
|
50
|
-
# method_option :version, :aliases => '-v', :desc => 'update only the given version number'
|
51
46
|
|
52
47
|
def update
|
53
48
|
# If reset option is passed delete all release notes in model
|
data/lib/release_notes.rb
CHANGED
@@ -13,18 +13,10 @@ module ReleaseNotes
|
|
13
13
|
mattr_accessor :release_note_model
|
14
14
|
@@release_note_model = 'ReleaseNote'
|
15
15
|
|
16
|
-
# Model name of the model created to store broadcasts.
|
17
|
-
mattr_accessor :broadcast_model
|
18
|
-
@@broadcast_model = 'Broadcast'
|
19
|
-
|
20
16
|
# Model name of the model created to store users.
|
21
17
|
mattr_accessor :user_model
|
22
18
|
@@user_model = 'User'
|
23
19
|
|
24
|
-
# Model name of the model created to store broadcasts for users.
|
25
|
-
mattr_accessor :user_broadcast_model
|
26
|
-
@@user_broadcast_model = 'UserBroadcast'
|
27
|
-
|
28
20
|
# Name of the folder where release notes are stored.
|
29
21
|
mattr_accessor :release_note_folder
|
30
22
|
@@release_note_folder = 'release_notes'
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: release_notes
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.4.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Brandon Robins
|
@@ -145,35 +145,27 @@ files:
|
|
145
145
|
- app/controllers/release_notes/release_notes_controller.rb
|
146
146
|
- app/helpers/release_notes/application_helper.rb
|
147
147
|
- app/views/layouts/release_notes/application.html.erb
|
148
|
-
- app/views/release_notes/broadcasts/_bare.html.erb
|
149
|
-
- app/views/release_notes/broadcasts/_link_back.html.erb
|
150
148
|
- app/views/release_notes/release_notes/_shared.html.erb
|
151
149
|
- app/views/release_notes/release_notes/index.html.erb
|
152
150
|
- app/views/release_notes/release_notes/show.html.erb
|
153
151
|
- bin/release_notes
|
154
152
|
- config/routes.rb
|
155
153
|
- features/support/setup.rb
|
156
|
-
- lib/generators/active_record/broadcasts_generator.rb
|
157
154
|
- lib/generators/active_record/release_notes_generator.rb
|
158
|
-
- lib/generators/active_record/templates/broadcasts_migration.rb
|
159
155
|
- lib/generators/active_record/templates/release_notes_migration.rb
|
160
|
-
- lib/generators/release_notes/broadcasts_generator.rb
|
161
156
|
- lib/generators/release_notes/install_generator.rb
|
162
157
|
- lib/generators/release_notes/orm_helpers.rb
|
163
158
|
- lib/generators/release_notes/release_notes_generator.rb
|
164
159
|
- lib/generators/release_notes/views_generator.rb
|
165
160
|
- lib/generators/templates/README
|
166
|
-
- lib/generators/templates/broadcast_blank.md
|
167
161
|
- lib/generators/templates/release_notes.rb
|
168
162
|
- lib/generators/templates/release_notes_controller_decorator.rb
|
169
163
|
- lib/generators/templates/update.md
|
170
164
|
- lib/generators/templates/update_blank.md
|
171
165
|
- lib/release_notes.rb
|
172
166
|
- lib/release_notes/cli.rb
|
173
|
-
- lib/release_notes/cli/broadcast.rb
|
174
167
|
- lib/release_notes/cli/helpers.rb
|
175
168
|
- lib/release_notes/engine.rb
|
176
|
-
- lib/release_notes/generators/broadcast.rb
|
177
169
|
- lib/release_notes/generators/release_note.rb
|
178
170
|
- lib/release_notes/version.rb
|
179
171
|
- lib/release_notes/versioning.rb
|
@@ -1,47 +0,0 @@
|
|
1
|
-
require 'rails/generators/active_record'
|
2
|
-
require 'generators/release_notes/orm_helpers'
|
3
|
-
|
4
|
-
module ActiveRecord
|
5
|
-
module Generators
|
6
|
-
class BroadcastsGenerator < ActiveRecord::Generators::Base
|
7
|
-
argument :attributes, :type => :array, :default => [], :banner => "field:type field:type"
|
8
|
-
|
9
|
-
include ReleaseNotes::Generators::OrmHelpers
|
10
|
-
source_root File.expand_path("../templates", __FILE__)
|
11
|
-
|
12
|
-
def copy_broadcasts_migration
|
13
|
-
if (behavior == :invoke && model_exists?)
|
14
|
-
raise "#{table_name} already exists..."
|
15
|
-
else
|
16
|
-
migration_template "broadcasts_migration.rb", "db/migrate/release_notes_create_#{table_name}.rb"
|
17
|
-
end
|
18
|
-
end
|
19
|
-
|
20
|
-
def generate_module
|
21
|
-
invoke "active_record:model", [name], :migration => false unless model_exists? && behavior == :invoke
|
22
|
-
end
|
23
|
-
|
24
|
-
def inject_broadcasts_content
|
25
|
-
content = broadcasts_model_contents
|
26
|
-
|
27
|
-
class_path = if namespaced?
|
28
|
-
class_name.to_s.split("::")
|
29
|
-
else
|
30
|
-
[class_name]
|
31
|
-
end
|
32
|
-
|
33
|
-
indent_depth = class_path.size - 1
|
34
|
-
content = content.split("\n").map { |line| " " * indent_depth + line }.join("\n") << "\n"
|
35
|
-
|
36
|
-
inject_into_class(model_path, class_path.last, content) if model_exists?
|
37
|
-
end
|
38
|
-
|
39
|
-
def migration_data
|
40
|
-
<<RUBY
|
41
|
-
t.text :markdown, :null => false
|
42
|
-
t.string :version, :null => false
|
43
|
-
RUBY
|
44
|
-
end
|
45
|
-
end
|
46
|
-
end
|
47
|
-
end
|
@@ -1,13 +0,0 @@
|
|
1
|
-
class ReleaseNotesCreate<%= table_name.camelize %> < ActiveRecord::Migration
|
2
|
-
def change
|
3
|
-
create_table(:<%= table_name %>) do |t|
|
4
|
-
<%= migration_data -%>
|
5
|
-
|
6
|
-
<% attributes.each do |attribute| -%>
|
7
|
-
t.<%= attribute.type %> :<%= attribute.name %>
|
8
|
-
<% end -%>
|
9
|
-
|
10
|
-
t.timestamps
|
11
|
-
end
|
12
|
-
end
|
13
|
-
end
|
@@ -1,16 +0,0 @@
|
|
1
|
-
require 'rails/generators/named_base'
|
2
|
-
|
3
|
-
module ReleaseNotes
|
4
|
-
module Generators
|
5
|
-
class BroadcastsGenerator < Rails::Generators::NamedBase
|
6
|
-
include Rails::Generators::ResourceHelpers
|
7
|
-
|
8
|
-
namespace "release_notes:broadcasts"
|
9
|
-
source_root File.expand_path("../templates", __FILE__)
|
10
|
-
|
11
|
-
desc "Generates a Broadcast model with the given NAME (if one does not exist)."
|
12
|
-
|
13
|
-
hook_for :orm
|
14
|
-
end
|
15
|
-
end
|
16
|
-
end
|
@@ -1,116 +0,0 @@
|
|
1
|
-
module ReleaseNotes
|
2
|
-
class Broadcast < Thor
|
3
|
-
desc 'broadcast new', 'Create a new broadcast'
|
4
|
-
method_option :destination, :aliases => '-d', :default => ReleaseNotes.release_note_folder, :desc => 'relative location of release note folder'
|
5
|
-
method_option :release_note_version, :aliases => '-r', :desc => 'corresponding release note version'
|
6
|
-
method_option :subject, :aliases => '-s', :default => "New Update", :desc => 'subject of broadcast'
|
7
|
-
method_option :body, :aliases => '-b', :default => "We've made some new changes - check 'em out!", :desc => 'body of broadcast'
|
8
|
-
|
9
|
-
def new
|
10
|
-
release_note_version = options[:release_note_version] || ""
|
11
|
-
|
12
|
-
ReleaseNotes::Generators::Broadcast.start([options[:destination],
|
13
|
-
options[:subject],
|
14
|
-
options[:body],
|
15
|
-
release_note_version])
|
16
|
-
end
|
17
|
-
|
18
|
-
|
19
|
-
desc 'broadcast set_version [VERSION]', 'Sets the latest broadcast to the given version'
|
20
|
-
|
21
|
-
def set_version(version)
|
22
|
-
rn = ReleaseNotes.broadcast_model.constantize.find_by(version: version)
|
23
|
-
|
24
|
-
new_rn = ReleaseNotes.broadcast_model.constantize.new
|
25
|
-
new_rn.version = rn.version
|
26
|
-
new_rn.markdown = rn.markdown
|
27
|
-
|
28
|
-
rn.destroy
|
29
|
-
new_rn.save
|
30
|
-
|
31
|
-
say "Latest broadcast is now set to version #{version}.", :green
|
32
|
-
rescue NoMethodError
|
33
|
-
say "Broadcast version #{version} was not found in the db.", :red
|
34
|
-
end
|
35
|
-
|
36
|
-
|
37
|
-
desc 'broadcast update', "Update #{ReleaseNotes.broadcast_model} models"
|
38
|
-
method_option :destination, :aliases => '-d', :default => ReleaseNotes.release_note_folder, :desc => 'relative location of release note folder'
|
39
|
-
method_option :reset, :aliases => '-r', :type => :boolean, :default => false, :desc => 'delete all model entries and rebuilds them'
|
40
|
-
method_option :version, :aliases => '-v', :desc => 'specific broadcast version to save/update'
|
41
|
-
|
42
|
-
def update
|
43
|
-
# If reset option is passed delete all broadcasts in model
|
44
|
-
if options[:reset]
|
45
|
-
ReleaseNotes.broadcast_model.constantize.all.each do |b|
|
46
|
-
b.destroy
|
47
|
-
end
|
48
|
-
end
|
49
|
-
|
50
|
-
if options[:version]
|
51
|
-
version = options[:version]
|
52
|
-
broadcast_file = single_broadcast_lookup_at(options[:destination], version)
|
53
|
-
markdown = File.read("#{options[:destination]}/#{broadcast_file}")
|
54
|
-
|
55
|
-
# If version is set check to see if its already in db or create new one
|
56
|
-
if ReleaseNotes.broadcast_model.constantize.find_by(version: version)
|
57
|
-
ReleaseNotes.broadcast_model.constantize
|
58
|
-
.find_by(version: version)
|
59
|
-
.update_attributes(markdown: markdown)
|
60
|
-
|
61
|
-
say "#{ReleaseNotes.broadcast_model} model successfully updated.", :green
|
62
|
-
else
|
63
|
-
ReleaseNotes.broadcast_model.constantize.create(version: version,
|
64
|
-
markdown: markdown)
|
65
|
-
|
66
|
-
say "#{ReleaseNotes.broadcast_model} model successfully saved.", :green
|
67
|
-
end
|
68
|
-
else
|
69
|
-
# Gets last broadcast version from db
|
70
|
-
last_broadcast = ReleaseNotes.broadcast_model.constantize.last
|
71
|
-
|
72
|
-
if last_broadcast.nil?
|
73
|
-
last_version = 0
|
74
|
-
else
|
75
|
-
last_version = last_broadcast.version.to_i
|
76
|
-
end
|
77
|
-
|
78
|
-
# Collects relevant files and saves version and content to db
|
79
|
-
broadcast_files = collect_broadcast_files(options[:destination])
|
80
|
-
broadcast_files.each do |file|
|
81
|
-
version = file.split('_').last.to_i
|
82
|
-
|
83
|
-
if version > last_version
|
84
|
-
markdown = File.read("#{options[:destination]}/#{file}")
|
85
|
-
|
86
|
-
ReleaseNotes.broadcast_model.constantize.create(version: version,
|
87
|
-
markdown: markdown)
|
88
|
-
|
89
|
-
say "#{ReleaseNotes.broadcast_model} version #{version} successfully saved.", :green
|
90
|
-
end
|
91
|
-
end
|
92
|
-
end
|
93
|
-
end
|
94
|
-
|
95
|
-
protected
|
96
|
-
def collect_broadcast_files(dirname)
|
97
|
-
broadcast_lookup_at(dirname).collect do |file|
|
98
|
-
File.basename(file)
|
99
|
-
end
|
100
|
-
end
|
101
|
-
|
102
|
-
def current_broadcast_number(dirname)
|
103
|
-
broadcast_lookup_at(dirname).collect do |file|
|
104
|
-
File.basename(file).split('_').last.to_i
|
105
|
-
end.max.to_i
|
106
|
-
end
|
107
|
-
|
108
|
-
def broadcast_lookup_at(dirname)
|
109
|
-
Dir.glob("#{dirname}/broadcast_[0-9]*.md")
|
110
|
-
end
|
111
|
-
|
112
|
-
def single_broadcast_lookup_at(dirname, version)
|
113
|
-
File.basename(Dir.glob("#{dirname}/broadcast_#{version}*.md")[0])
|
114
|
-
end
|
115
|
-
end
|
116
|
-
end
|
@@ -1,58 +0,0 @@
|
|
1
|
-
require 'thor/group'
|
2
|
-
|
3
|
-
module ReleaseNotes
|
4
|
-
module Generators
|
5
|
-
class Broadcast < Thor::Group
|
6
|
-
include Thor::Actions
|
7
|
-
|
8
|
-
argument :destination, :type => :string
|
9
|
-
argument :subject, :type => :string
|
10
|
-
argument :body, :type => :string
|
11
|
-
argument :release_note_version, :type => :string
|
12
|
-
|
13
|
-
source_root File.expand_path('../../../generators/templates', __FILE__)
|
14
|
-
|
15
|
-
def set_local_assigns
|
16
|
-
@subject = subject
|
17
|
-
@body = body
|
18
|
-
|
19
|
-
if release_note_version != ""
|
20
|
-
@release_note_version = release_note_version.gsub('.', '_')
|
21
|
-
else
|
22
|
-
@release_note_version = nil
|
23
|
-
end
|
24
|
-
|
25
|
-
@broadcast_template = 'broadcast_blank.md'
|
26
|
-
@destination = File.expand_path(destination)
|
27
|
-
end
|
28
|
-
|
29
|
-
def create_directory
|
30
|
-
empty_directory(@destination)
|
31
|
-
end
|
32
|
-
|
33
|
-
def get_broadcast_number
|
34
|
-
@broadcast_number = next_broadcast_number(@destination)
|
35
|
-
end
|
36
|
-
|
37
|
-
def copy_broadcast
|
38
|
-
@filename = "#{destination}/broadcast_#{@broadcast_number}.md"
|
39
|
-
template(@broadcast_template, @filename)
|
40
|
-
end
|
41
|
-
|
42
|
-
protected
|
43
|
-
def next_broadcast_number(dirname)
|
44
|
-
current_broadcast_number(dirname) + 1
|
45
|
-
end
|
46
|
-
|
47
|
-
def current_broadcast_number(dirname)
|
48
|
-
broadcast_lookup_at(dirname).collect do |file|
|
49
|
-
File.basename(file).split('_').last.to_i
|
50
|
-
end.max.to_i
|
51
|
-
end
|
52
|
-
|
53
|
-
def broadcast_lookup_at(dirname)
|
54
|
-
Dir.glob("#{dirname}/*_[0-9]*.md")
|
55
|
-
end
|
56
|
-
end
|
57
|
-
end
|
58
|
-
end
|