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.
@@ -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: []