term_utils 0.1.1 → 0.4.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 +4 -4
- data/AUTHORS +1 -0
- data/CHANGELOG.md +51 -0
- data/COPYING +674 -0
- data/README.md +99 -0
- data/Rakefile +55 -0
- data/doc/TermUtils.html +138 -0
- data/doc/TermUtils/AP.html +394 -0
- data/doc/TermUtils/AP/Article.html +993 -0
- data/doc/TermUtils/AP/ArticleResult.html +584 -0
- data/doc/TermUtils/AP/Flag.html +756 -0
- data/doc/TermUtils/AP/NoSuchValueError.html +217 -0
- data/doc/TermUtils/AP/Parameter.html +1592 -0
- data/doc/TermUtils/AP/ParameterResult.html +980 -0
- data/doc/TermUtils/AP/ParameterWalkerHooks.html +409 -0
- data/doc/TermUtils/AP/ParseError.html +217 -0
- data/doc/TermUtils/AP/Parser.html +604 -0
- data/doc/TermUtils/AP/Result.html +837 -0
- data/doc/TermUtils/AP/Syntax.html +761 -0
- data/doc/TermUtils/AP/SyntaxError.html +217 -0
- data/doc/TermUtils/AP/Walker.html +686 -0
- data/doc/TermUtils/FF.html +128 -0
- data/doc/TermUtils/FF/Config.html +774 -0
- data/doc/TermUtils/FF/Context.html +585 -0
- data/doc/TermUtils/FF/Entry.html +626 -0
- data/doc/TermUtils/FF/Query.html +1085 -0
- data/doc/TermUtils/PropertyTreeNode.html +2113 -0
- data/doc/TermUtils/Tab.html +1486 -0
- data/doc/TermUtils/Tab/Column.html +1263 -0
- data/doc/TermUtils/Tab/Header.html +536 -0
- data/doc/TermUtils/Tab/Holder.html +1210 -0
- data/doc/TermUtils/Tab/Printer.html +967 -0
- data/doc/TermUtils/Tab/Table.html +1966 -0
- data/doc/TermUtils/Tab/TableError.html +217 -0
- data/doc/_index.html +387 -0
- data/doc/class_list.html +51 -0
- data/doc/css/common.css +1 -0
- data/doc/css/full_list.css +58 -0
- data/doc/css/style.css +496 -0
- data/doc/file.README.html +170 -0
- data/doc/file_list.html +56 -0
- data/doc/frames.html +17 -0
- data/doc/index.html +170 -0
- data/doc/js/app.js +314 -0
- data/doc/js/full_list.js +216 -0
- data/doc/js/jquery.js +4 -0
- data/doc/method_list.html +1539 -0
- data/doc/top-level-namespace.html +110 -0
- data/lib/term_utils.rb +11 -0
- data/lib/term_utils/ap.rb +70 -0
- data/lib/term_utils/ap/article.rb +74 -0
- data/lib/term_utils/ap/flag.rb +65 -0
- data/lib/term_utils/ap/parameter.rb +144 -0
- data/lib/term_utils/ap/parser.rb +211 -0
- data/lib/term_utils/ap/result.rb +244 -0
- data/lib/term_utils/ap/syntax.rb +96 -0
- data/lib/term_utils/ff.rb +27 -0
- data/lib/term_utils/ff/config.rb +55 -0
- data/lib/term_utils/ff/entry.rb +45 -0
- data/lib/term_utils/ff/query.rb +145 -0
- data/lib/term_utils/property_tree_node.rb +228 -0
- data/lib/term_utils/tab.rb +338 -88
- data/term_utils.gemspec +16 -0
- metadata +69 -7
@@ -0,0 +1,110 @@
|
|
1
|
+
<!DOCTYPE html>
|
2
|
+
<html>
|
3
|
+
<head>
|
4
|
+
<meta charset="utf-8">
|
5
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
6
|
+
<title>
|
7
|
+
Top Level Namespace
|
8
|
+
|
9
|
+
— Documentation by YARD 0.9.25
|
10
|
+
|
11
|
+
</title>
|
12
|
+
|
13
|
+
<link rel="stylesheet" href="css/style.css" type="text/css" />
|
14
|
+
|
15
|
+
<link rel="stylesheet" href="css/common.css" type="text/css" />
|
16
|
+
|
17
|
+
<script type="text/javascript">
|
18
|
+
pathId = "";
|
19
|
+
relpath = '';
|
20
|
+
</script>
|
21
|
+
|
22
|
+
|
23
|
+
<script type="text/javascript" charset="utf-8" src="js/jquery.js"></script>
|
24
|
+
|
25
|
+
<script type="text/javascript" charset="utf-8" src="js/app.js"></script>
|
26
|
+
|
27
|
+
|
28
|
+
</head>
|
29
|
+
<body>
|
30
|
+
<div class="nav_wrap">
|
31
|
+
<iframe id="nav" src="class_list.html?1"></iframe>
|
32
|
+
<div id="resizer"></div>
|
33
|
+
</div>
|
34
|
+
|
35
|
+
<div id="main" tabindex="-1">
|
36
|
+
<div id="header">
|
37
|
+
<div id="menu">
|
38
|
+
|
39
|
+
<a href="_index.html">Index</a> »
|
40
|
+
|
41
|
+
|
42
|
+
<span class="title">Top Level Namespace</span>
|
43
|
+
|
44
|
+
</div>
|
45
|
+
|
46
|
+
<div id="search">
|
47
|
+
|
48
|
+
<a class="full_list_link" id="class_list_link"
|
49
|
+
href="class_list.html">
|
50
|
+
|
51
|
+
<svg width="24" height="24">
|
52
|
+
<rect x="0" y="4" width="24" height="4" rx="1" ry="1"></rect>
|
53
|
+
<rect x="0" y="12" width="24" height="4" rx="1" ry="1"></rect>
|
54
|
+
<rect x="0" y="20" width="24" height="4" rx="1" ry="1"></rect>
|
55
|
+
</svg>
|
56
|
+
</a>
|
57
|
+
|
58
|
+
</div>
|
59
|
+
<div class="clear"></div>
|
60
|
+
</div>
|
61
|
+
|
62
|
+
<div id="content"><h1>Top Level Namespace
|
63
|
+
|
64
|
+
|
65
|
+
|
66
|
+
</h1>
|
67
|
+
<div class="box_info">
|
68
|
+
|
69
|
+
|
70
|
+
|
71
|
+
|
72
|
+
|
73
|
+
|
74
|
+
|
75
|
+
|
76
|
+
|
77
|
+
|
78
|
+
|
79
|
+
</div>
|
80
|
+
|
81
|
+
<h2>Defined Under Namespace</h2>
|
82
|
+
<p class="children">
|
83
|
+
|
84
|
+
|
85
|
+
<strong class="modules">Modules:</strong> <span class='object_link'><a href="TermUtils.html" title="TermUtils (module)">TermUtils</a></span>
|
86
|
+
|
87
|
+
|
88
|
+
|
89
|
+
|
90
|
+
</p>
|
91
|
+
|
92
|
+
|
93
|
+
|
94
|
+
|
95
|
+
|
96
|
+
|
97
|
+
|
98
|
+
|
99
|
+
|
100
|
+
</div>
|
101
|
+
|
102
|
+
<div id="footer">
|
103
|
+
Generated on Sun Aug 2 18:35:09 2020 by
|
104
|
+
<a href="http://yardoc.org" title="Yay! A Ruby Documentation Tool" target="_parent">yard</a>
|
105
|
+
0.9.25 (ruby-2.6.5).
|
106
|
+
</div>
|
107
|
+
|
108
|
+
</div>
|
109
|
+
</body>
|
110
|
+
</html>
|
data/lib/term_utils.rb
CHANGED
@@ -1,3 +1,7 @@
|
|
1
|
+
# frozen-string-literal: true
|
2
|
+
|
3
|
+
# Copyright (C) 2020 Thomas Baron
|
4
|
+
#
|
1
5
|
# This file is part of term_utils.
|
2
6
|
#
|
3
7
|
# term_utils is free software: you can redistribute it and/or modify
|
@@ -11,4 +15,11 @@
|
|
11
15
|
#
|
12
16
|
# You should have received a copy of the GNU General Public License
|
13
17
|
# along with term_utils. If not, see <https://www.gnu.org/licenses/>.
|
18
|
+
|
19
|
+
# Utilities for terminal application.
|
20
|
+
module TermUtils
|
21
|
+
end
|
22
|
+
|
23
|
+
require 'term_utils/ap'
|
24
|
+
require 'term_utils/ff'
|
14
25
|
require 'term_utils/tab'
|
@@ -0,0 +1,70 @@
|
|
1
|
+
# frozen-string-literal: true
|
2
|
+
|
3
|
+
# Copyright (C) 2020 Thomas Baron
|
4
|
+
#
|
5
|
+
# This file is part of term_utils.
|
6
|
+
#
|
7
|
+
# term_utils is free software: you can redistribute it and/or modify
|
8
|
+
# it under the terms of the GNU General Public License as published by
|
9
|
+
# the Free Software Foundation, version 3 of the License.
|
10
|
+
#
|
11
|
+
# term_utils is distributed in the hope that it will be useful,
|
12
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
13
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
14
|
+
# GNU General Public License for more details.
|
15
|
+
#
|
16
|
+
# You should have received a copy of the GNU General Public License
|
17
|
+
# along with term_utils. If not, see <https://www.gnu.org/licenses/>.
|
18
|
+
|
19
|
+
module TermUtils
|
20
|
+
# The Argument Parser module provides a way to parse arguments.
|
21
|
+
module AP
|
22
|
+
# NoSuchValueError.
|
23
|
+
class NoSuchValueError < StandardError
|
24
|
+
def initialize(msg)
|
25
|
+
super
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
# ParseError.
|
30
|
+
class ParseError < StandardError
|
31
|
+
def initialize(msg)
|
32
|
+
super
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
# SyntaxError.
|
37
|
+
class SyntaxError < StandardError
|
38
|
+
def initialize(msg)
|
39
|
+
super
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
# Creates a new Syntax.
|
44
|
+
# @return [TermUtils::AP::Syntax]
|
45
|
+
def self.create_syntax(&block)
|
46
|
+
new_syntax = TermUtils::AP::Syntax.new
|
47
|
+
block.call(new_syntax) if block
|
48
|
+
new_syntax
|
49
|
+
end
|
50
|
+
|
51
|
+
# Parses a given list of arguments.
|
52
|
+
# @param syntax [Syntax]
|
53
|
+
# @param arguments [Array<String>]
|
54
|
+
# @param opts [Hash]
|
55
|
+
# @option opts [Boolean] :strict Whether the Syntax must be considered strict.
|
56
|
+
# @return [Result]
|
57
|
+
# @raise [ParseError]
|
58
|
+
# @raise [SyntaxError]
|
59
|
+
def self.parse_arguments(syntax, arguments, opts = {}, &block)
|
60
|
+
TermUtils::AP::Parser.new.parse_arguments(syntax, arguments, opts, &block)
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
require 'term_utils/ap/article'
|
66
|
+
require 'term_utils/ap/flag'
|
67
|
+
require 'term_utils/ap/parameter'
|
68
|
+
require 'term_utils/ap/syntax'
|
69
|
+
require 'term_utils/ap/result'
|
70
|
+
require 'term_utils/ap/parser'
|
@@ -0,0 +1,74 @@
|
|
1
|
+
# frozen-string-literal: true
|
2
|
+
|
3
|
+
# Copyright (C) 2020 Thomas Baron
|
4
|
+
#
|
5
|
+
# This file is part of term_utils.
|
6
|
+
#
|
7
|
+
# term_utils is free software: you can redistribute it and/or modify
|
8
|
+
# it under the terms of the GNU General Public License as published by
|
9
|
+
# the Free Software Foundation, version 3 of the License.
|
10
|
+
#
|
11
|
+
# term_utils is distributed in the hope that it will be useful,
|
12
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
13
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
14
|
+
# GNU General Public License for more details.
|
15
|
+
#
|
16
|
+
# You should have received a copy of the GNU General Public License
|
17
|
+
# along with term_utils. If not, see <https://www.gnu.org/licenses/>.
|
18
|
+
|
19
|
+
module TermUtils
|
20
|
+
module AP
|
21
|
+
# Represents a Article.
|
22
|
+
class Article
|
23
|
+
# @return [Symbol]
|
24
|
+
attr_accessor :id
|
25
|
+
# @return [Integer]
|
26
|
+
attr_accessor :min_occurs
|
27
|
+
# @return [Integer]
|
28
|
+
attr_accessor :max_occurs
|
29
|
+
# @return [Symbol] `:integer`, `:string`
|
30
|
+
attr_accessor :type
|
31
|
+
# @return [String] `%d`, `%s`.
|
32
|
+
attr_accessor :format
|
33
|
+
|
34
|
+
# Constructs a new Article.
|
35
|
+
# @param opts [Hash]
|
36
|
+
# @option opts [Symbol] :id
|
37
|
+
# @option opts [Integer] :min_occurs Default value is `1`.
|
38
|
+
# @option opts [Integer] :max_occurs Default value is `1`.
|
39
|
+
# @option opts [Symbol] :type `:integer`, `:string`.
|
40
|
+
# @option opts [Symbol] :format
|
41
|
+
def initialize(opts = {})
|
42
|
+
@id = opts.fetch(:id, nil)
|
43
|
+
@min_occurs = opts.fetch(:min_occurs, 1)
|
44
|
+
@max_occurs = opts.fetch(:max_occurs, 1)
|
45
|
+
@type = opts.fetch(:type, :string)
|
46
|
+
@format = opts.fetch(:format, '%s')
|
47
|
+
end
|
48
|
+
|
49
|
+
# Finalizes this one. Internal use.
|
50
|
+
# @return [nil]
|
51
|
+
def finalize!(opts = {})
|
52
|
+
raise TermUtils::AP::SyntaxError, 'min_occurs must be equal or greater than 0' if !@min_occurs.is_a?(Integer) || (@min_occurs < 0)
|
53
|
+
raise TermUtils::AP::SyntaxError, 'max_occurs must be equal or greater than min_occurs' if occur_bounded? && (@max_occurs < @min_occurs)
|
54
|
+
|
55
|
+
unless @id
|
56
|
+
opts[:anonymous] += 1
|
57
|
+
@id = "anonymous#{opts[:anonymous]}".intern
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
# Tests whether this one has mutiple occurs.
|
62
|
+
# @return [Boolean]
|
63
|
+
def multiple_occurs?
|
64
|
+
(@max_occurs == nil) || (@max_occurs.is_a?(Integer) && (@max_occurs > 1))
|
65
|
+
end
|
66
|
+
|
67
|
+
# Tests whether the number of occurs is fixed.
|
68
|
+
# @return [Boolean]
|
69
|
+
def occur_bounded?
|
70
|
+
(@max_occurs != nil) && @max_occurs.is_a?(Integer)
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
@@ -0,0 +1,65 @@
|
|
1
|
+
# frozen-string-literal: true
|
2
|
+
|
3
|
+
# Copyright (C) 2020 Thomas Baron
|
4
|
+
#
|
5
|
+
# This file is part of term_utils.
|
6
|
+
#
|
7
|
+
# term_utils is free software: you can redistribute it and/or modify
|
8
|
+
# it under the terms of the GNU General Public License as published by
|
9
|
+
# the Free Software Foundation, version 3 of the License.
|
10
|
+
#
|
11
|
+
# term_utils is distributed in the hope that it will be useful,
|
12
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
13
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
14
|
+
# GNU General Public License for more details.
|
15
|
+
#
|
16
|
+
# You should have received a copy of the GNU General Public License
|
17
|
+
# along with term_utils. If not, see <https://www.gnu.org/licenses/>.
|
18
|
+
|
19
|
+
module TermUtils
|
20
|
+
module AP
|
21
|
+
# Represents a Flag.
|
22
|
+
class Flag
|
23
|
+
# @return [String]
|
24
|
+
attr_reader :label
|
25
|
+
# @return [Symbol] `:long`, `:short`.
|
26
|
+
attr_reader :flavor
|
27
|
+
|
28
|
+
# Constructs a new Flag.
|
29
|
+
# @param label [String]
|
30
|
+
# @param flavor [Symbol] `:short`, `:long`.
|
31
|
+
def initialize(label, flavor)
|
32
|
+
raise TermUtils::AP::SyntaxError, 'wrong flag label' if !label.is_a?(String) || /^-+$/.match?(label) || !/^-[0-9A-Za-z_-]+$/.match?(label)
|
33
|
+
raise TermUtils::AP::SyntaxError, '' unless %i[short long].include?(flavor)
|
34
|
+
|
35
|
+
@label = label
|
36
|
+
@flavor = flavor
|
37
|
+
end
|
38
|
+
|
39
|
+
# Tests whether this one is equal to a given Flag.
|
40
|
+
def ==(other)
|
41
|
+
return false unless other.is_a?(TermUtils::AP::Flag)
|
42
|
+
|
43
|
+
@label == other.label
|
44
|
+
end
|
45
|
+
|
46
|
+
# Tests whether this one represents a long flag.
|
47
|
+
# @return [Boolean]
|
48
|
+
def long?
|
49
|
+
@flavor == :long
|
50
|
+
end
|
51
|
+
|
52
|
+
# Tests whether this one represents a short flag.
|
53
|
+
# @return [Boolean]
|
54
|
+
def short?
|
55
|
+
@flavor == :short
|
56
|
+
end
|
57
|
+
|
58
|
+
# Returns the string representation of this one.
|
59
|
+
# @return [String]
|
60
|
+
def to_s
|
61
|
+
@label
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
@@ -0,0 +1,144 @@
|
|
1
|
+
# frozen-string-literal: true
|
2
|
+
|
3
|
+
# Copyright (C) 2020 Thomas Baron
|
4
|
+
#
|
5
|
+
# This file is part of term_utils.
|
6
|
+
#
|
7
|
+
# term_utils is free software: you can redistribute it and/or modify
|
8
|
+
# it under the terms of the GNU General Public License as published by
|
9
|
+
# the Free Software Foundation, version 3 of the License.
|
10
|
+
#
|
11
|
+
# term_utils is distributed in the hope that it will be useful,
|
12
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
13
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
14
|
+
# GNU General Public License for more details.
|
15
|
+
#
|
16
|
+
# You should have received a copy of the GNU General Public License
|
17
|
+
# along with term_utils. If not, see <https://www.gnu.org/licenses/>.
|
18
|
+
|
19
|
+
module TermUtils
|
20
|
+
module AP
|
21
|
+
# Represents a Parameter.
|
22
|
+
class Parameter
|
23
|
+
# @return [Symbol]
|
24
|
+
attr_accessor :id
|
25
|
+
# @return [Integer]
|
26
|
+
attr_accessor :min_occurs
|
27
|
+
# @return [Integer]
|
28
|
+
attr_accessor :max_occurs
|
29
|
+
# @return [Array<Flag>]
|
30
|
+
attr_accessor :flags
|
31
|
+
# @return [Array<Article>]
|
32
|
+
attr_accessor :articles
|
33
|
+
|
34
|
+
# Constructs a new Parameter.
|
35
|
+
# @param opts [Hash]
|
36
|
+
# @option opts [Symbol] :id
|
37
|
+
# @option opts [Integer] :min_occurs Default value is `0`.
|
38
|
+
# @option opts [Integer] :max_occurs Default value is `1`.
|
39
|
+
def initialize(opts = {})
|
40
|
+
@id = opts.fetch(:id, nil)
|
41
|
+
@min_occurs = opts.fetch(:min_occurs, 0)
|
42
|
+
@max_occurs = opts.fetch(:max_occurs, 1)
|
43
|
+
@flags = []
|
44
|
+
@articles = []
|
45
|
+
end
|
46
|
+
|
47
|
+
# For dup method.
|
48
|
+
def initialize_dup(other)
|
49
|
+
super(other)
|
50
|
+
@flags = other.flags.map(&:dup) if other.flags
|
51
|
+
@articles = other.articles.map(&:dup) if other.articles
|
52
|
+
end
|
53
|
+
|
54
|
+
# Finalizes this one. Internal use.
|
55
|
+
# @return [nil]
|
56
|
+
# @raise [SyntaxError]
|
57
|
+
def finalize!(opts = {})
|
58
|
+
raise TermUtils::AP::SyntaxError, 'min_occurs must be equal or greater than 0' if !@min_occurs.is_a?(Integer) || (@min_occurs < 0)
|
59
|
+
raise TermUtils::AP::SyntaxError, 'max_occurs must be equal or greater than min_occurs' if occur_bounded? && (@max_occurs < @min_occurs)
|
60
|
+
raise TermUtils::AP::SyntaxError, 'empty' if @flags.empty? && @articles.empty?
|
61
|
+
|
62
|
+
unless @id
|
63
|
+
opts[:anonymous] += 1
|
64
|
+
@id = "anonymous#{opts[:anonymous]}".intern
|
65
|
+
end
|
66
|
+
@flags.each do |f|
|
67
|
+
raise TermUtils::AP::SyntaxError, 'duplicate flag label' if opts[:flag_labels].include?(f.to_s)
|
68
|
+
|
69
|
+
opts[:flag_labels] << f.to_s
|
70
|
+
end
|
71
|
+
@articles.each { |a| a.finalize!(opts) }
|
72
|
+
nil
|
73
|
+
end
|
74
|
+
|
75
|
+
# Tests whether this one has mutiple occurs.
|
76
|
+
# @return [Boolean]
|
77
|
+
def multiple_occurs?
|
78
|
+
(@max_occurs == nil) || (@max_occurs.is_a?(Integer) && (@max_occurs > 1))
|
79
|
+
end
|
80
|
+
|
81
|
+
# Tests whether the number of occurs is fixed.
|
82
|
+
# @return [Boolean]
|
83
|
+
def occur_bounded?
|
84
|
+
(@max_occurs != nil) && @max_occurs.is_a?(Integer)
|
85
|
+
end
|
86
|
+
|
87
|
+
# Tests whether this one is flagged.
|
88
|
+
# @return [Boolean]
|
89
|
+
def flagged?
|
90
|
+
!@flags.empty?
|
91
|
+
end
|
92
|
+
|
93
|
+
# Adds a new Flag to this one.
|
94
|
+
# @param label [String]
|
95
|
+
# @return [Flag]
|
96
|
+
def define_flag(label, &block)
|
97
|
+
flavor = (label.length == 2) ? :short : :long
|
98
|
+
new_flag = TermUtils::AP::Flag.new(label, flavor)
|
99
|
+
raise TermUtils::AP::SyntaxError, 'duplicate flag label' if @flags.include? new_flag
|
100
|
+
|
101
|
+
@flags << new_flag
|
102
|
+
block.call(new_flag) if block
|
103
|
+
new_flag
|
104
|
+
end
|
105
|
+
|
106
|
+
# Adds a new Article to this one.
|
107
|
+
# @param id [Symbol, nil]
|
108
|
+
# @param opts [Hash]
|
109
|
+
# @option opts [Symbol] :id
|
110
|
+
# @option opts [Integer] :min_occurs Default value is `1`.
|
111
|
+
# @option opts [Integer] :max_occurs Default value is `1`.
|
112
|
+
# @option opts [Symbol] :type `:integer`, `:string`.
|
113
|
+
# @option opts [Symbol] :format
|
114
|
+
# @return [Article]
|
115
|
+
def define_article(id = nil, opts = {}, &block)
|
116
|
+
if id
|
117
|
+
art = @articles.find { |p| p.id == id }
|
118
|
+
if art
|
119
|
+
block.call(art) if block
|
120
|
+
return art
|
121
|
+
end
|
122
|
+
|
123
|
+
opts[:id] = id
|
124
|
+
end
|
125
|
+
new_article = TermUtils::AP::Article.new(opts)
|
126
|
+
@articles << new_article
|
127
|
+
block.call(new_article) if block
|
128
|
+
new_article
|
129
|
+
end
|
130
|
+
|
131
|
+
# Fetches all flags.
|
132
|
+
# @return [Array<Flag>]
|
133
|
+
def fetch_flags
|
134
|
+
@flags.dup
|
135
|
+
end
|
136
|
+
|
137
|
+
# Fetches all articles.
|
138
|
+
# @return [Array<Article>]
|
139
|
+
def fetch_articles
|
140
|
+
@articles.collect(&:dup)
|
141
|
+
end
|
142
|
+
end
|
143
|
+
end
|
144
|
+
end
|