ginny 0.5.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 +7 -0
- data/.gitignore +8 -0
- data/.rubocop.yml +138 -0
- data/.solargraph.yml +14 -0
- data/.travis.yml +7 -0
- data/.yardopts +2 -0
- data/CHANGELOG.md +68 -0
- data/Gemfile +4 -0
- data/Gemfile.lock +61 -0
- data/LICENSE.txt +21 -0
- data/README.md +147 -0
- data/Rakefile +10 -0
- data/bin/console +9 -0
- data/bin/docs +2 -0
- data/bin/setup +8 -0
- data/exe/ginny +23 -0
- data/ginny.gemspec +43 -0
- data/lib/ginny.rb +6 -0
- data/lib/ginny/error.rb +5 -0
- data/lib/ginny/load.rb +45 -0
- data/lib/ginny/mod.rb +32 -0
- data/lib/ginny/models/attr.rb +73 -0
- data/lib/ginny/models/class.rb +94 -0
- data/lib/ginny/models/func.rb +86 -0
- data/lib/ginny/models/param.rb +90 -0
- data/lib/ginny/string/comment.rb +19 -0
- data/lib/ginny/string/indent.rb +52 -0
- data/lib/ginny/symbolize.rb +31 -0
- data/lib/ginny/version.rb +3 -0
- metadata +203 -0
@@ -0,0 +1,90 @@
|
|
1
|
+
module Ginny
|
2
|
+
# Used to generate a function [parameter][2].
|
3
|
+
#
|
4
|
+
# [1]: http://ruby-for-beginners.rubymonstas.org/bonus/arguments_parameters.html
|
5
|
+
# [2]: https://ruby-doc.org/core-2.6.5/doc/syntax/methods_rdoc.html#label-Arguments
|
6
|
+
class Param
|
7
|
+
|
8
|
+
# Name of the param.
|
9
|
+
# @return [String]
|
10
|
+
attr_accessor :name
|
11
|
+
# Description of the param. [Markdown](https://github.com/adam-p/markdown-here/wiki/Markdown-Cheatsheet) is supported.
|
12
|
+
# @return [String]
|
13
|
+
attr_accessor :description
|
14
|
+
# [Type](https://rubydoc.info/gems/yard/file/docs/GettingStarted.md#Declaring_Types) of the attribute.
|
15
|
+
# @return [String]
|
16
|
+
attr_accessor :type
|
17
|
+
# Default value for the Param.
|
18
|
+
# Set `optional` as `true` for a default `nil` value.
|
19
|
+
# @return [String]
|
20
|
+
attr_accessor :default
|
21
|
+
# If `true`, the default value will be `nil`.
|
22
|
+
# FIXME: This is a workaround for the fact that that passing `nil` to `default` messes with conditionals. Not sure of a simpler way to do this.
|
23
|
+
# @return [Boolean]
|
24
|
+
attr_accessor :optional
|
25
|
+
# If `true`, the param will be generated as a [keyword argument](https://bugs.ruby-lang.org/issues/14183).
|
26
|
+
# @return [Boolean]
|
27
|
+
attr_accessor :keyword
|
28
|
+
|
29
|
+
# Constructor for a Param. Use `create`, not `new`.
|
30
|
+
#
|
31
|
+
# @param [Hash<Symbol>] args
|
32
|
+
# @option args [String] :name
|
33
|
+
# @option args [String] :description
|
34
|
+
# @option args [String] :type
|
35
|
+
# @option args [Object] :default
|
36
|
+
# @option args [Boolean] :keyword (false)
|
37
|
+
# @option args [Boolean] :optional (false)
|
38
|
+
# @return [Ginny::Param]
|
39
|
+
def self.create(args = {})
|
40
|
+
p = Ginny::Param.new()
|
41
|
+
p.name = args[:name]
|
42
|
+
p.description = args[:description]
|
43
|
+
p.type = args[:type]
|
44
|
+
p.default = args[:default]
|
45
|
+
p.keyword = args[:keyword] || false
|
46
|
+
p.optional = args[:optional] || false
|
47
|
+
return p
|
48
|
+
end
|
49
|
+
|
50
|
+
# @param array [Array<Hash>]
|
51
|
+
# @return [Array<Ginny::Param>]
|
52
|
+
def self.from_array(array)
|
53
|
+
return array.map { |p| self.create(p) }
|
54
|
+
end
|
55
|
+
|
56
|
+
# @return [String]
|
57
|
+
def render
|
58
|
+
parts = []
|
59
|
+
parts << @name
|
60
|
+
default = self.render_default_value()
|
61
|
+
if @keyword
|
62
|
+
parts << ":"
|
63
|
+
parts << (" " + default) if default
|
64
|
+
elsif default
|
65
|
+
parts << (" = " + default)
|
66
|
+
end
|
67
|
+
return parts.compact.join("").gsub(/\s+$/, "")
|
68
|
+
end
|
69
|
+
|
70
|
+
# @return [String,nil]
|
71
|
+
def render_default_value
|
72
|
+
# `nil` default value
|
73
|
+
return "nil" if self.optional
|
74
|
+
# No default value
|
75
|
+
return nil if self.default.nil?
|
76
|
+
# Add quotes to a String.
|
77
|
+
return (Ginny::QUOTE + self.default + Ginny::QUOTE) if self.type == "String" || self.default.is_a?(String)
|
78
|
+
# Add colon to a Symbol.
|
79
|
+
return ":#{self.default}" if self.type == "Symbol" || self.default.is_a?(Symbol)
|
80
|
+
# `to_s` should handle everything else.
|
81
|
+
return self.default.to_s
|
82
|
+
end
|
83
|
+
|
84
|
+
# @return [String]
|
85
|
+
def render_doc
|
86
|
+
return "# @param #{self.name} [#{self.type}] #{self.description}".strip
|
87
|
+
end
|
88
|
+
|
89
|
+
end
|
90
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
# Monkeypatch some convenience methods in to the String class.
|
2
|
+
class String
|
3
|
+
# Adds a comment string (`"# "`) after every newline in a string.
|
4
|
+
#
|
5
|
+
# @param indent_empty_lines [Boolean]
|
6
|
+
# @return [void]
|
7
|
+
def comment!(indent_empty_lines = true)
|
8
|
+
re = indent_empty_lines ? /^/ : /^(?!$)/
|
9
|
+
gsub!(re, "# ")
|
10
|
+
end
|
11
|
+
|
12
|
+
# Returns a copy of a string with a comment (`"# "`) after every newline in a string.
|
13
|
+
#
|
14
|
+
# @param indent_empty_lines [Boolean]
|
15
|
+
# @return [String]
|
16
|
+
def comment(indent_empty_lines = true)
|
17
|
+
dup.tap { |s| s.comment!(indent_empty_lines) }
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,52 @@
|
|
1
|
+
# Monkeypatch some convenience methods in to the String class.
|
2
|
+
class String
|
3
|
+
|
4
|
+
# def titleize2(string)
|
5
|
+
# words = self.split(" ")
|
6
|
+
# skips = ["and", "of", "the", "in", "to", "over", "an", "a"]
|
7
|
+
# words.each do |word|
|
8
|
+
# if word == words[0] || !skips.include?(word)
|
9
|
+
# element.capitalize!
|
10
|
+
# end
|
11
|
+
# end
|
12
|
+
# answer = array.join(" ")
|
13
|
+
# return answer
|
14
|
+
# end
|
15
|
+
|
16
|
+
# Same as {indent}, except it indents the receiver in-place.
|
17
|
+
#
|
18
|
+
# Returns the indented string, or `nil` if there was nothing to indent.
|
19
|
+
#
|
20
|
+
# @param amount [Integer] The level of indentation to add.
|
21
|
+
# @param indent_string [String] Defaults to tab if a tab is present in the string, and `" "` otherwise.
|
22
|
+
# @param indent_empty_lines [Boolean]
|
23
|
+
#
|
24
|
+
# @return [void]
|
25
|
+
def indent!(amount, indent_string = nil, indent_empty_lines = false)
|
26
|
+
indent_string = indent_string || self[/^[ \t]/] || " "
|
27
|
+
re = indent_empty_lines ? /^/ : /^(?!$)/
|
28
|
+
gsub!(re, indent_string * amount)
|
29
|
+
end
|
30
|
+
|
31
|
+
# Indents the lines in the receiver.
|
32
|
+
#
|
33
|
+
# The second argument, `indent_string`, specifies which indent string to
|
34
|
+
# use. The default is `nil`, which tells the method to make a guess by
|
35
|
+
# peeking at the first indented line, and fallback to a space if there is
|
36
|
+
# none.
|
37
|
+
#
|
38
|
+
# While `indent_string` is typically one space or tab, it may be any string.
|
39
|
+
#
|
40
|
+
# The third argument, `indent_empty_lines`, is a flag that says whether
|
41
|
+
# empty lines should be indented. Default is `false`.
|
42
|
+
#
|
43
|
+
# @param amount [Integer] The level of indentation to add.
|
44
|
+
# @param indent_string [String] Defaults to tab if a tab is present in the string, and `" "` otherwise.
|
45
|
+
# @param indent_empty_lines [Boolean]
|
46
|
+
#
|
47
|
+
# @return [String]
|
48
|
+
def indent(amount, indent_string = nil, indent_empty_lines = false)
|
49
|
+
dup.tap { |s| s.indent!(amount, indent_string, indent_empty_lines) }
|
50
|
+
end
|
51
|
+
|
52
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
module Ginny
|
2
|
+
# Recursively convert keys in a Hash or Array to symbols.
|
3
|
+
#
|
4
|
+
# See:
|
5
|
+
# - [original code](https://avdi.codes/recursively-symbolize-keys/)
|
6
|
+
# - [array support](https://gist.github.com/neektza/8585746)
|
7
|
+
#
|
8
|
+
# @param arg [Hash,Array]
|
9
|
+
# @return [Hash,Array]
|
10
|
+
def self.symbolize_keys(arg)
|
11
|
+
if arg.is_a?(Hash)
|
12
|
+
arg.inject({}) do |result, (key, value)|
|
13
|
+
new_key = case key
|
14
|
+
when String then key.to_sym()
|
15
|
+
else key
|
16
|
+
end
|
17
|
+
new_value = case value
|
18
|
+
when Hash then symbolize_keys(value)
|
19
|
+
when Array then symbolize_keys(value)
|
20
|
+
else value
|
21
|
+
end
|
22
|
+
result[new_key] = new_value
|
23
|
+
result
|
24
|
+
end
|
25
|
+
elsif arg.is_a?(Array)
|
26
|
+
arg.map { |e| symbolize_keys(e) }
|
27
|
+
else
|
28
|
+
arg
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
metadata
ADDED
@@ -0,0 +1,203 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: ginny
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.5.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Clay Dunston
|
8
|
+
autorequire:
|
9
|
+
bindir: exe
|
10
|
+
cert_chain: []
|
11
|
+
date: 2019-11-28 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: bundler
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '2.0'
|
20
|
+
type: :development
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '2.0'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: coveralls
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: 0.8.23
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: 0.8.23
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: minitest
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - "~>"
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '5.0'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - "~>"
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '5.0'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: minitest-focus
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - "~>"
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '1.1'
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - "~>"
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '1.1'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: minitest-reporters
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - "~>"
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '1.4'
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - "~>"
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '1.4'
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: pry
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - "~>"
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: 0.12.2
|
90
|
+
type: :development
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - "~>"
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: 0.12.2
|
97
|
+
- !ruby/object:Gem::Dependency
|
98
|
+
name: rake
|
99
|
+
requirement: !ruby/object:Gem::Requirement
|
100
|
+
requirements:
|
101
|
+
- - "~>"
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
version: '10.0'
|
104
|
+
type: :development
|
105
|
+
prerelease: false
|
106
|
+
version_requirements: !ruby/object:Gem::Requirement
|
107
|
+
requirements:
|
108
|
+
- - "~>"
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: '10.0'
|
111
|
+
- !ruby/object:Gem::Dependency
|
112
|
+
name: simplecov
|
113
|
+
requirement: !ruby/object:Gem::Requirement
|
114
|
+
requirements:
|
115
|
+
- - ">="
|
116
|
+
- !ruby/object:Gem::Version
|
117
|
+
version: '0'
|
118
|
+
type: :development
|
119
|
+
prerelease: false
|
120
|
+
version_requirements: !ruby/object:Gem::Requirement
|
121
|
+
requirements:
|
122
|
+
- - ">="
|
123
|
+
- !ruby/object:Gem::Version
|
124
|
+
version: '0'
|
125
|
+
- !ruby/object:Gem::Dependency
|
126
|
+
name: dry-inflector
|
127
|
+
requirement: !ruby/object:Gem::Requirement
|
128
|
+
requirements:
|
129
|
+
- - "~>"
|
130
|
+
- !ruby/object:Gem::Version
|
131
|
+
version: 0.2.0
|
132
|
+
type: :runtime
|
133
|
+
prerelease: false
|
134
|
+
version_requirements: !ruby/object:Gem::Requirement
|
135
|
+
requirements:
|
136
|
+
- - "~>"
|
137
|
+
- !ruby/object:Gem::Version
|
138
|
+
version: 0.2.0
|
139
|
+
description: Generate Ruby code.
|
140
|
+
email:
|
141
|
+
- dunstontc@gmail.com
|
142
|
+
executables:
|
143
|
+
- ginny
|
144
|
+
extensions: []
|
145
|
+
extra_rdoc_files: []
|
146
|
+
files:
|
147
|
+
- ".gitignore"
|
148
|
+
- ".rubocop.yml"
|
149
|
+
- ".solargraph.yml"
|
150
|
+
- ".travis.yml"
|
151
|
+
- ".yardopts"
|
152
|
+
- CHANGELOG.md
|
153
|
+
- Gemfile
|
154
|
+
- Gemfile.lock
|
155
|
+
- LICENSE.txt
|
156
|
+
- README.md
|
157
|
+
- Rakefile
|
158
|
+
- bin/console
|
159
|
+
- bin/docs
|
160
|
+
- bin/setup
|
161
|
+
- exe/ginny
|
162
|
+
- ginny.gemspec
|
163
|
+
- lib/ginny.rb
|
164
|
+
- lib/ginny/error.rb
|
165
|
+
- lib/ginny/load.rb
|
166
|
+
- lib/ginny/mod.rb
|
167
|
+
- lib/ginny/models/attr.rb
|
168
|
+
- lib/ginny/models/class.rb
|
169
|
+
- lib/ginny/models/func.rb
|
170
|
+
- lib/ginny/models/param.rb
|
171
|
+
- lib/ginny/string/comment.rb
|
172
|
+
- lib/ginny/string/indent.rb
|
173
|
+
- lib/ginny/symbolize.rb
|
174
|
+
- lib/ginny/version.rb
|
175
|
+
homepage: https://github.com/tcd/ginny
|
176
|
+
licenses:
|
177
|
+
- MIT
|
178
|
+
metadata:
|
179
|
+
homepage_uri: https://github.com/tcd/ginny
|
180
|
+
source_code_uri: https://github.com/tcd/ginny
|
181
|
+
documentation_uri: https://www.rubydoc.info/gems/ginny/0.5.0
|
182
|
+
changelog_uri: https://github.com/tcd/ginny/blob/master/CHANGELOG.md
|
183
|
+
yard.run: yri
|
184
|
+
post_install_message:
|
185
|
+
rdoc_options: []
|
186
|
+
require_paths:
|
187
|
+
- lib
|
188
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
189
|
+
requirements:
|
190
|
+
- - ">="
|
191
|
+
- !ruby/object:Gem::Version
|
192
|
+
version: 2.3.0
|
193
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
194
|
+
requirements:
|
195
|
+
- - ">="
|
196
|
+
- !ruby/object:Gem::Version
|
197
|
+
version: '0'
|
198
|
+
requirements: []
|
199
|
+
rubygems_version: 3.0.3
|
200
|
+
signing_key:
|
201
|
+
specification_version: 4
|
202
|
+
summary: Generate Ruby code.
|
203
|
+
test_files: []
|