ginny 0.5.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -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
@@ -0,0 +1,3 @@
1
+ module Ginny
2
+ VERSION = "0.5.0".freeze
3
+ 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: []