daifuku 0.9.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/.github/workflows/ruby.yml +31 -0
- data/.gitignore +56 -0
- data/.ruby-version +1 -0
- data/Gemfile +6 -0
- data/Gemfile.lock +55 -0
- data/LICENSE +21 -0
- data/README.md +149 -0
- data/Rakefile +6 -0
- data/daifuku.gemspec +39 -0
- data/daifuku.rb +9 -0
- data/docs/images/code-completion.png +0 -0
- data/docs/images/transpile.png +0 -0
- data/docs/syntax.ja.md +143 -0
- data/example/LogDefinitions/common.md +20 -0
- data/example/LogDefinitions/recipe_search.md +19 -0
- data/example/iOS/Templates/CommonPayload.swift.erb +25 -0
- data/example/iOS/Templates/LogCategories.swift.erb +33 -0
- data/example/iOS/generate-log-classes.rb +212 -0
- data/lib/daifuku/compiler.rb +43 -0
- data/lib/daifuku/models.rb +171 -0
- data/lib/daifuku/parser.rb +76 -0
- data/lib/daifuku/renderer.rb +11 -0
- data/lib/daifuku/strdef_generator.rb +196 -0
- data/lib/daifuku/validator.rb +127 -0
- data/lib/daifuku/version.rb +3 -0
- data/lib/daifuku.rb +10 -0
- metadata +143 -0
@@ -0,0 +1,127 @@
|
|
1
|
+
module Daifuku
|
2
|
+
class Violation
|
3
|
+
attr_reader :message
|
4
|
+
|
5
|
+
def initialize(message, category_name:, event_name:, column_name:)
|
6
|
+
@message = message
|
7
|
+
@category_name = category_name
|
8
|
+
@event_name = event_name
|
9
|
+
@column_name = column_name
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
|
14
|
+
class Rule
|
15
|
+
def validate!(categories)
|
16
|
+
raise "Not implemented"
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
class MultipleTypesRule < Rule
|
21
|
+
def validate!(categories)
|
22
|
+
violations = []
|
23
|
+
all_columns = categories.values.map { |category| category.events.values.map { |event| event.columns }}.flatten
|
24
|
+
columns_by_name = all_columns.group_by { |column| column.name }
|
25
|
+
all_duplicated_columns = columns_by_name.filter { |_, columns| columns.size >= 2 }
|
26
|
+
all_duplicated_columns.each do |name, columns|
|
27
|
+
unless columns.map { |column| column.type }.uniq { |type| [type.name, type.str_length] }.size == 1
|
28
|
+
violations << Violation.new("Multiple types are found for '#{name}'",
|
29
|
+
category_name: nil,
|
30
|
+
event_name: nil,
|
31
|
+
column_name: name)
|
32
|
+
end
|
33
|
+
end
|
34
|
+
violations
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
class ShadowingRule < Rule
|
39
|
+
def validate!(categories)
|
40
|
+
violations = []
|
41
|
+
common_category = categories[COMMON_CATEGORY_NAME]
|
42
|
+
return [] unless common_category&.common_columns
|
43
|
+
all_common_columns = common_category.common_columns.map(&:name)
|
44
|
+
categories.each_value do |category|
|
45
|
+
next if category.name == COMMON_CATEGORY_NAME
|
46
|
+
category.events.each_value do |event|
|
47
|
+
event.columns.each do |column|
|
48
|
+
if all_common_columns.include?(column.name)
|
49
|
+
message = "Column '#{column.name}' on '#{category.name}' is already defined on common columns"
|
50
|
+
violations << Violation.new(message, category_name: category.name, event_name: event.name, column_name: column.name)
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
violations
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
class ReservedColumnsRule < Rule
|
60
|
+
RESERVED_COLUMNS = %w(event_name event_category log_id id)
|
61
|
+
|
62
|
+
def validate!(categories)
|
63
|
+
violations = []
|
64
|
+
categories.each_value do |category|
|
65
|
+
category.events.each_value do |event|
|
66
|
+
event.columns.each do |column|
|
67
|
+
message = "'#{column.name}' is reserved"
|
68
|
+
violations << Violation.new(message, category_name: category.name, event_name: event.name, column_name: column.name) if RESERVED_COLUMNS.include?(column.name)
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
72
|
+
violations
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
class NameLengthRule < Rule
|
77
|
+
attr_reader :max_length
|
78
|
+
|
79
|
+
def initialize(max_length)
|
80
|
+
@max_length = max_length
|
81
|
+
end
|
82
|
+
|
83
|
+
def validate!(categories)
|
84
|
+
violations = []
|
85
|
+
categories.each_value do |category|
|
86
|
+
if category.name.length > max_length
|
87
|
+
violations << Violation.new("#{category.name} must be within #{max_length} characters.",
|
88
|
+
category_name: category.name,
|
89
|
+
event_name: nil,
|
90
|
+
column_name: nil)
|
91
|
+
end
|
92
|
+
category.events.each_value do |event|
|
93
|
+
if event.name.length > max_length
|
94
|
+
violations << Violation.new("#{category.name}.#{event.name} must be within #{max_length} characters.",
|
95
|
+
category_name: category.name,
|
96
|
+
event_name: event.name,
|
97
|
+
column_name: nil)
|
98
|
+
end
|
99
|
+
event.columns.each do |column|
|
100
|
+
if column.name.length > max_length
|
101
|
+
violations << Violation.new("#{category.name}.#{event.name}.#{column.name} must be within #{max_length} characters.",
|
102
|
+
category_name: category.name,
|
103
|
+
event_name: event.name,
|
104
|
+
column_name: column.name)
|
105
|
+
end
|
106
|
+
end
|
107
|
+
end
|
108
|
+
end
|
109
|
+
violations
|
110
|
+
end
|
111
|
+
end
|
112
|
+
|
113
|
+
class Validator
|
114
|
+
def initialize(rules)
|
115
|
+
@rules = rules
|
116
|
+
end
|
117
|
+
|
118
|
+
def validate!(categories)
|
119
|
+
violations = []
|
120
|
+
@rules.each do |rule|
|
121
|
+
violations += rule.validate!(categories)
|
122
|
+
end
|
123
|
+
violations.flatten!
|
124
|
+
raise violations.map(&:message).join("\n") unless violations.empty?
|
125
|
+
end
|
126
|
+
end
|
127
|
+
end
|
data/lib/daifuku.rb
ADDED
@@ -0,0 +1,10 @@
|
|
1
|
+
require "daifuku/version"
|
2
|
+
require "daifuku/compiler"
|
3
|
+
require "daifuku/parser"
|
4
|
+
require "daifuku/models"
|
5
|
+
require "daifuku/renderer"
|
6
|
+
require 'daifuku/validator'
|
7
|
+
require 'daifuku/strdef_generator'
|
8
|
+
|
9
|
+
COMMON_CATEGORY_NAME = 'common'
|
10
|
+
COMMON_EVENT_NAME = 'common'
|
metadata
ADDED
@@ -0,0 +1,143 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: daifuku
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.9.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Kohki Miki
|
8
|
+
autorequire:
|
9
|
+
bindir: exe
|
10
|
+
cert_chain: []
|
11
|
+
date: 2023-08-01 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: redcarpet
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '3.6'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '3.6'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: nokogiri
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '1.15'
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '1.15'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: bundler
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - "~>"
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '2.0'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - "~>"
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '2.0'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: rake
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - "~>"
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '13.0'
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - "~>"
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '13.0'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: rspec
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - "~>"
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '3.0'
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - "~>"
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '3.0'
|
83
|
+
description: |
|
84
|
+
Daifuku is a markdown parser and compiler for log definitions in mobile applications. It provides an
|
85
|
+
automatic generation of document-based type-safe log implementation code from markdown.
|
86
|
+
email:
|
87
|
+
- giginet.net@gmail.com
|
88
|
+
executables: []
|
89
|
+
extensions: []
|
90
|
+
extra_rdoc_files: []
|
91
|
+
files:
|
92
|
+
- ".github/workflows/ruby.yml"
|
93
|
+
- ".gitignore"
|
94
|
+
- ".ruby-version"
|
95
|
+
- Gemfile
|
96
|
+
- Gemfile.lock
|
97
|
+
- LICENSE
|
98
|
+
- README.md
|
99
|
+
- Rakefile
|
100
|
+
- daifuku.gemspec
|
101
|
+
- daifuku.rb
|
102
|
+
- docs/images/code-completion.png
|
103
|
+
- docs/images/transpile.png
|
104
|
+
- docs/syntax.ja.md
|
105
|
+
- example/LogDefinitions/common.md
|
106
|
+
- example/LogDefinitions/recipe_search.md
|
107
|
+
- example/iOS/Templates/CommonPayload.swift.erb
|
108
|
+
- example/iOS/Templates/LogCategories.swift.erb
|
109
|
+
- example/iOS/generate-log-classes.rb
|
110
|
+
- lib/daifuku.rb
|
111
|
+
- lib/daifuku/compiler.rb
|
112
|
+
- lib/daifuku/models.rb
|
113
|
+
- lib/daifuku/parser.rb
|
114
|
+
- lib/daifuku/renderer.rb
|
115
|
+
- lib/daifuku/strdef_generator.rb
|
116
|
+
- lib/daifuku/validator.rb
|
117
|
+
- lib/daifuku/version.rb
|
118
|
+
homepage: https://github.com/cookpad/daifuku
|
119
|
+
licenses:
|
120
|
+
- MIT
|
121
|
+
metadata:
|
122
|
+
homepage_uri: https://github.com/cookpad/daifuku
|
123
|
+
source_code_uri: https://github.com/cookpad/daifuku
|
124
|
+
post_install_message:
|
125
|
+
rdoc_options: []
|
126
|
+
require_paths:
|
127
|
+
- lib
|
128
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
129
|
+
requirements:
|
130
|
+
- - ">="
|
131
|
+
- !ruby/object:Gem::Version
|
132
|
+
version: '0'
|
133
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
134
|
+
requirements:
|
135
|
+
- - ">="
|
136
|
+
- !ruby/object:Gem::Version
|
137
|
+
version: '0'
|
138
|
+
requirements: []
|
139
|
+
rubygems_version: 3.4.6
|
140
|
+
signing_key:
|
141
|
+
specification_version: 4
|
142
|
+
summary: A markdown parser and compiler for log definitions in mobile applications
|
143
|
+
test_files: []
|