twenty-backend 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (36) hide show
  1. checksums.yaml +7 -0
  2. data/.bundle/config +3 -0
  3. data/.rubocop.yml +34 -0
  4. data/Gemfile +3 -0
  5. data/Rakefile.rb +12 -0
  6. data/lib/twenty-backend/graphql/input/task_input.rb +9 -0
  7. data/lib/twenty-backend/graphql/input.rb +4 -0
  8. data/lib/twenty-backend/graphql/mutation/complete_task.rb +15 -0
  9. data/lib/twenty-backend/graphql/mutation/create_task.rb +13 -0
  10. data/lib/twenty-backend/graphql/mutation/destroy_task.rb +15 -0
  11. data/lib/twenty-backend/graphql/mutation/set_random_project_color.rb +17 -0
  12. data/lib/twenty-backend/graphql/mutation/update_task.rb +15 -0
  13. data/lib/twenty-backend/graphql/mutation.rb +5 -0
  14. data/lib/twenty-backend/graphql/schema.rb +6 -0
  15. data/lib/twenty-backend/graphql/type/mutation.rb +14 -0
  16. data/lib/twenty-backend/graphql/type/project.rb +10 -0
  17. data/lib/twenty-backend/graphql/type/query.rb +27 -0
  18. data/lib/twenty-backend/graphql/type/task.rb +15 -0
  19. data/lib/twenty-backend/graphql/type/task_status.rb +8 -0
  20. data/lib/twenty-backend/graphql/type.rb +10 -0
  21. data/lib/twenty-backend/graphql.rb +7 -0
  22. data/lib/twenty-backend/migration/1_create_projects.rb +16 -0
  23. data/lib/twenty-backend/migration/2_create_tasks.rb +17 -0
  24. data/lib/twenty-backend/migration/3_add_color_to_projects.rb +10 -0
  25. data/lib/twenty-backend/migration.rb +34 -0
  26. data/lib/twenty-backend/model/mixin/colorable_mixin.rb +28 -0
  27. data/lib/twenty-backend/model/project.rb +22 -0
  28. data/lib/twenty-backend/model/task.rb +18 -0
  29. data/lib/twenty-backend/model.rb +7 -0
  30. data/lib/twenty-backend/servlet/graphql.rb +15 -0
  31. data/lib/twenty-backend/servlet/mixin/server_mixin.rb +27 -0
  32. data/lib/twenty-backend/servlet.rb +12 -0
  33. data/lib/twenty-backend.rb +55 -0
  34. data/share/twenty-backend/schema.graphql +91 -0
  35. data/twenty-backend.gemspec +21 -0
  36. metadata +175 -0
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: e542a39b0f28686ecebc793a71cf5a0ebc0906e82343a4dbf07438cef3b3b962
4
+ data.tar.gz: 6d1ed96207eb078d8432a65f339fd4095eec81838e4ec697d47294f0632cf45e
5
+ SHA512:
6
+ metadata.gz: 4666ad8f846373943ac508d4d4edccd231b7825af18b58b0c14566943d0281d4967f85ec0d0760d1c5d1c2cd0989359650f2480388800dbed3aaeb2cc65ab0ee
7
+ data.tar.gz: c4214b4df047e114b2be519156530f391bc1dcdc5e0ad193a93b8f68e2034f9b3a49b9c5eb943f781251d82826d901e741e16d78dd3eca5463a13d2647722ef5
data/.bundle/config ADDED
@@ -0,0 +1,3 @@
1
+ ---
2
+ BUNDLE_PATH: ".gems"
3
+ BUNDLE_BUILD__SQLITE3: "--enable-system-libraries"
data/.rubocop.yml ADDED
@@ -0,0 +1,34 @@
1
+ ##
2
+ # Plugins
3
+ require:
4
+ - standard
5
+
6
+ ##
7
+ # Defaults: standard-rb
8
+ inherit_gem:
9
+ standard: config/base.yml
10
+
11
+ ##
12
+ # All cops
13
+ AllCops:
14
+ TargetRubyVersion: 3.2
15
+ Include:
16
+ - lib/*.rb
17
+ - lib/**/*.rb
18
+ - test/*_test.rb
19
+
20
+ ##
21
+ # Enabled
22
+ Style/FrozenStringLiteralComment:
23
+ Enabled: true
24
+
25
+ ##
26
+ # Disabled
27
+ Layout/ArgumentAlignment:
28
+ Enabled: false
29
+ Layout/MultilineMethodCallIndentation:
30
+ Enabled: false
31
+ Layout/EmptyLineBetweenDefs:
32
+ Enabled: false
33
+ Style/TrivialAccessors:
34
+ Enabled: false
data/Gemfile ADDED
@@ -0,0 +1,3 @@
1
+ # frozen_string_literal: true
2
+ source "https://rubygems.org"
3
+ gemspec
data/Rakefile.rb ADDED
@@ -0,0 +1,12 @@
1
+ require "bundler/setup"
2
+ require "fileutils"
3
+
4
+ namespace :schema do
5
+ desc "Generate share/twenty-backend/schema.graphql"
6
+ task :regen do
7
+ require "twenty-backend"
8
+ schema = File.join(__dir__, "share", "twenty-backend", "schema.graphql")
9
+ FileUtils.mkdir_p File.dirname(schema)
10
+ File.binwrite schema, Twenty::GraphQL::Schema.to_definition
11
+ end
12
+ end
@@ -0,0 +1,9 @@
1
+ module Twenty::GraphQL::Input
2
+ class TaskInput < GraphQL::Schema::InputObject
3
+ require_relative "../type/task_status"
4
+ argument :title, String, required: false
5
+ argument :content, String, required: false
6
+ argument :project_id, Int, required: false
7
+ argument :status, Twenty::GraphQL::Type::TaskStatus, required: false
8
+ end
9
+ end
@@ -0,0 +1,4 @@
1
+ module Twenty::GraphQL::Input
2
+ include GraphQL::Types
3
+ require_relative "input/task_input"
4
+ end
@@ -0,0 +1,15 @@
1
+ module Twenty::GraphQL::Mutation
2
+ class CompleteTask < GraphQL::Schema::Mutation
3
+ argument :task_id, Int
4
+ field :ok, Boolean
5
+ field :errors, [String]
6
+
7
+ def resolve(task_id:)
8
+ task = Twenty::Task.find(task_id)
9
+ task.update!(status: :complete)
10
+ {ok: true, errors: []}
11
+ rescue => ex
12
+ {ok: false, errors: [ex.message]}
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,13 @@
1
+ module Twenty::GraphQL::Mutation
2
+ class CreateTask < GraphQL::Schema::Mutation
3
+ field :errors, [String], null: false
4
+ argument :input, Twenty::GraphQL::Input::TaskInput
5
+
6
+ def resolve(input:)
7
+ Twenty::Task.new(input.to_h).save!
8
+ {"errors" => []}
9
+ rescue => ex
10
+ {"errors" => [ex.message]}
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,15 @@
1
+ module Twenty::GraphQL::Mutation
2
+ class DestroyTask < GraphQL::Schema::Mutation
3
+ argument :task_id, Int
4
+ field :ok, Boolean
5
+ field :errors, [String]
6
+
7
+ def resolve(task_id:)
8
+ task = Twenty::Task.find(task_id)
9
+ task.destroy!
10
+ {ok: true, errors: []}
11
+ rescue => ex
12
+ {ok: false, errors: [ex.message]}
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,17 @@
1
+ module Twenty::GraphQL::Mutation
2
+ class SetRandomProjectColor < ::GraphQL::Schema::Mutation
3
+ require_relative "../type/project"
4
+ argument :project_id, Int, required: true
5
+
6
+ field :errors, [String], null: false
7
+ field :project, Twenty::GraphQL::Type::Project, null: true
8
+
9
+ def resolve(project_id:)
10
+ project = Twenty::Project.find(project_id)
11
+ project.update!(color: project.random_color)
12
+ {errors: [], project:}
13
+ rescue => ex
14
+ {errors: [ex.message]}
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,15 @@
1
+ module Twenty::GraphQL::Mutation
2
+ class UpdateTask < GraphQL::Schema::Mutation
3
+ field :errors, [String], null: false
4
+ argument :task_id, Int
5
+ argument :input, Twenty::GraphQL::Input::TaskInput
6
+
7
+ def resolve(task_id:, input:)
8
+ task = Twenty::Task.find_by(id: task_id)
9
+ task.update!(input.to_h)
10
+ {"errors" => []}
11
+ rescue => ex
12
+ {"errors" => [ex.message]}
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,5 @@
1
+ module Twenty::GraphQL
2
+ module Mutation
3
+ require_relative "mutation/destroy_task"
4
+ end
5
+ end
@@ -0,0 +1,6 @@
1
+ module Twenty::GraphQL
2
+ class Schema < GraphQL::Schema
3
+ query Type::Query
4
+ mutation Type::Mutation
5
+ end
6
+ end
@@ -0,0 +1,14 @@
1
+ module Twenty::GraphQL::Type
2
+ class Mutation < GraphQL::Schema::Object
3
+ require_relative "../mutation/destroy_task"
4
+ require_relative "../mutation/complete_task"
5
+ require_relative "../mutation/create_task"
6
+ require_relative "../mutation/update_task"
7
+ require_relative "../mutation/set_random_project_color"
8
+ field :destroy_task, mutation: Twenty::GraphQL::Mutation::DestroyTask
9
+ field :complete_task, mutation: Twenty::GraphQL::Mutation::CompleteTask
10
+ field :create_task, mutation: Twenty::GraphQL::Mutation::CreateTask
11
+ field :update_task, mutation: Twenty::GraphQL::Mutation::UpdateTask
12
+ field :set_random_project_color, mutation: Twenty::GraphQL::Mutation::SetRandomProjectColor
13
+ end
14
+ end
@@ -0,0 +1,10 @@
1
+ module Twenty::GraphQL::Type
2
+ class Project < GraphQL::Schema::Object
3
+ require_relative "task"
4
+ field :id, Int, null: false
5
+ field :name, String, null: false
6
+ field :path, String, null: false
7
+ field :color, String, null: false
8
+ field :tasks, [Task], null: false
9
+ end
10
+ end
@@ -0,0 +1,27 @@
1
+ module Twenty::GraphQL::Type
2
+ class Query < GraphQL::Schema::Object
3
+ field :find_task, Task, null: true do
4
+ argument :task_id, Int
5
+ end
6
+ field :tasks, [Task], null: false do
7
+ argument :status, TaskStatus
8
+ argument :project_id, Int, required: false
9
+ end
10
+ field :projects, [Project], null: false
11
+
12
+ def find_task(task_id:)
13
+ Twenty::Task.find_by(id: task_id)
14
+ end
15
+
16
+ def tasks(status:, project_id: nil)
17
+ tasks = Twenty::Task
18
+ .where(status:)
19
+ .order(updated_at: :desc)
20
+ project_id ? tasks.where(project_id:) : tasks
21
+ end
22
+
23
+ def projects
24
+ Twenty::Project.all
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,15 @@
1
+ module Twenty::GraphQL::Type
2
+ class Task < GraphQL::Schema::Object
3
+ require_relative "project"
4
+ field :id, Int, null: false
5
+ field :title, String, null: false
6
+ field :status, TaskStatus, null: false
7
+ field :content, String, null: false
8
+ field :project, Project, null: false
9
+ field :updated_at, GraphQL::Types::ISO8601DateTime, null: false
10
+ field :is_ready, Boolean, null: false, method: :ready?
11
+ field :is_backlogged, Boolean, null: false, method: :backlog?
12
+ field :is_complete, Boolean, null: false, method: :complete?
13
+ field :in_progress, Boolean, null: false, method: :in_progress?
14
+ end
15
+ end
@@ -0,0 +1,8 @@
1
+ module Twenty::GraphQL::Type
2
+ class TaskStatus < GraphQL::Schema::Enum
3
+ value :backlog
4
+ value :ready
5
+ value :in_progress
6
+ value :complete
7
+ end
8
+ end
@@ -0,0 +1,10 @@
1
+ module Twenty::GraphQL
2
+ module Type
3
+ include ::GraphQL::Types
4
+ end
5
+ require_relative "type/task_status"
6
+ require_relative "type/project"
7
+ require_relative "type/task"
8
+ require_relative "type/query"
9
+ require_relative "type/mutation"
10
+ end
@@ -0,0 +1,7 @@
1
+ module Twenty::GraphQL
2
+ require "graphql"
3
+ require_relative "graphql/input"
4
+ require_relative "graphql/type"
5
+ require_relative "graphql/mutation"
6
+ require_relative "graphql/schema"
7
+ end
@@ -0,0 +1,16 @@
1
+ # frozen_string_literal: true
2
+
3
+ class CreateProjects < ActiveRecord::Migration[7.1]
4
+ def up
5
+ create_table(:projects) do |t|
6
+ t.string :name, null: false
7
+ t.string :path, null: false
8
+ t.timestamps
9
+ end
10
+ add_index :projects, [:name, :path], unique: true
11
+ end
12
+
13
+ def down
14
+ drop_table(:projects)
15
+ end
16
+ end
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ class CreateTasks < ActiveRecord::Migration[7.1]
4
+ def up
5
+ create_table(:tasks) do |t|
6
+ t.string :title, null: false
7
+ t.text :content, null: false
8
+ t.integer :status, null: false, default: 0
9
+ t.belongs_to :project, null: false
10
+ t.timestamps
11
+ end
12
+ end
13
+
14
+ def down
15
+ drop_table(:tasks)
16
+ end
17
+ end
@@ -0,0 +1,10 @@
1
+ class AddColorToProjects < ActiveRecord::Migration[7.1]
2
+ def up
3
+ default = Twenty::ColorableMixin.random_color
4
+ add_column :projects, :color, :string, null: false, default:
5
+ end
6
+
7
+ def down
8
+ drop_column :projects, :color
9
+ end
10
+ end
@@ -0,0 +1,34 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Twenty::Migration
4
+ ##
5
+ # @return [String]
6
+ # Returns the path to twenty's migrations.
7
+ def self.migrations_path
8
+ [File.join(__dir__, "migration")]
9
+ end
10
+
11
+ ##
12
+ # Runs migrations (if neccessary).
13
+ # @return [void]
14
+ def self.run!
15
+ context.migrate
16
+ end
17
+ ActiveRecord.timestamped_migrations = false
18
+
19
+ ##
20
+ # @return [Boolean]
21
+ # Returns true when there are pending migrations.
22
+ def self.pending_migrations?
23
+ context.open.pending_migrations.any?
24
+ end
25
+
26
+ ##
27
+ # @return [ActiveRecord::MigrationContext]
28
+ # Returns an instance of
29
+ # {ActiveRecord::MigrationContext ActiveRecord::MigrationContext}.
30
+ def self.context
31
+ @context ||= ActiveRecord::MigrationContext.new(migrations_path)
32
+ end
33
+ private_class_method :context
34
+ end
@@ -0,0 +1,28 @@
1
+ module Twenty::ColorableMixin
2
+ extend self
3
+
4
+ COLORS = [
5
+ '#222222', '#333333', '#444444', '#555555', '#666666',
6
+ '#777777', '#888888', '#999999', '#AA2222', '#22AA22',
7
+ '#2222AA', '#AA22AA', '#CC9900', '#0099CC', '#9900CC',
8
+ '#FF9900', '#00CC99', '#99CC00', '#CC0099', '#990000',
9
+ '#112233', '#445566', '#778899', '#AA4455', '#5544AA',
10
+ '#88AA44', '#AA88AA', '#CCBB00', '#1155CC', '#9900BB',
11
+ '#DD6600', '#00BBCC', '#CC0099', '#BB3300', '#006688',
12
+ '#993366', '#2200AA', '#557788', '#998877', '#BB4400'
13
+ ]
14
+
15
+ def self.included(klass)
16
+ klass.before_validation :set_random_color, on: :create
17
+ end
18
+
19
+ def random_color
20
+ COLORS.sample
21
+ end
22
+
23
+ private
24
+
25
+ def set_random_color
26
+ self.color = random_color
27
+ end
28
+ end
@@ -0,0 +1,22 @@
1
+ # frozen_string_literal: true
2
+
3
+ class Twenty::Project < Twenty::Model
4
+ include Twenty::ColorableMixin
5
+ self.table_name = "projects"
6
+
7
+ ##
8
+ # Validations
9
+ validates :name, presence: true
10
+ validates :path, presence: true
11
+
12
+ ##
13
+ # Associations
14
+ has_many :tasks, class_name: "Twenty::Task"
15
+
16
+ ##
17
+ # @return [String]
18
+ # The path to a project.
19
+ def path
20
+ super&.sub(Dir.home, "~")
21
+ end
22
+ end
@@ -0,0 +1,18 @@
1
+ # frozen_string_literal: true
2
+
3
+ class Twenty::Task < Twenty::Model
4
+ self.table_name = "tasks"
5
+
6
+ STATUS = {backlog: 0, ready: 1, in_progress: 2, complete: 3}
7
+ enum :status, STATUS, default: :backlog
8
+
9
+ ##
10
+ # Validations
11
+ validates :title, presence: true
12
+ validates :content, presence: true
13
+ validates :project, presence: true
14
+
15
+ ##
16
+ # Associations
17
+ belongs_to :project, class_name: "Twenty::Project"
18
+ end
@@ -0,0 +1,7 @@
1
+ # frozen_string_literal: true
2
+
3
+ class Twenty::Model < ActiveRecord::Base
4
+ require_relative "model/mixin/colorable_mixin"
5
+ require_relative "model/project"
6
+ require_relative "model/task"
7
+ end
@@ -0,0 +1,15 @@
1
+ class Twenty::Servlet::GraphQL < Twenty::Servlet
2
+ ##
3
+ # POST /servlet/graphql/
4
+ def do_POST(req, res)
5
+ params = JSON.parse(req.body)
6
+ result = Twenty::GraphQL::Schema.execute(
7
+ params['query'],
8
+ variables: params['variables'],
9
+ context: {}
10
+ )
11
+ res['content_type'] = 'application/json'
12
+ res.status = 200
13
+ res.body = result.to_json
14
+ end
15
+ end
@@ -0,0 +1,27 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Twenty::Servlet::ServerMixin
4
+ ##
5
+ # @param [Hash] options
6
+ # Server options that take precedence over
7
+ # {ServerMixin#server_options ServerMixin#server_options}.
8
+ #
9
+ # @return [WEBrick::HTTPServer]
10
+ # Returns an instance of WEBrick::HTTPServer.
11
+ def server(options = {})
12
+ server = WEBrick::HTTPServer.new server_options.merge(options)
13
+ server.mount "/graphql", Twenty::Servlet::GraphQL
14
+ server
15
+ end
16
+
17
+ ##
18
+ # @return [Hash<Symbol, String>]
19
+ # The default server options given to WEBrick::HTTPServer.new.
20
+ def server_options
21
+ {
22
+ DocumentRoot: Twenty.build,
23
+ BindAddress: "127.0.0.1",
24
+ Port: 2020
25
+ }
26
+ end
27
+ end
@@ -0,0 +1,12 @@
1
+ # frozen_string_literal: true
2
+
3
+ class Twenty::Servlet < WEBrick::HTTPServlet::AbstractServlet
4
+ ##
5
+ # servlets
6
+ require_relative "servlet/graphql"
7
+
8
+ ##
9
+ # mixins
10
+ require_relative "servlet/mixin/server_mixin"
11
+ extend ServerMixin
12
+ end
@@ -0,0 +1,55 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Twenty
4
+ require "fileutils"
5
+ require "webrick"
6
+ require "active_record"
7
+ require_relative "twenty-backend/graphql"
8
+ require_relative "twenty-backend/servlet"
9
+ require_relative "twenty-backend/migration"
10
+ require_relative "twenty-backend/model"
11
+ extend FileUtils
12
+
13
+ ##
14
+ # @return [String]
15
+ # Returns the directory where twenty stores data.
16
+ def self.data_dir
17
+ File.join(Dir.home, ".local", "share", "20")
18
+ end
19
+
20
+ ##
21
+ # @return [String]
22
+ # Returns the location of the default SQLite database.
23
+ def self.default_database
24
+ @default_database ||= File.join(data_dir, "database.sqlite")
25
+ end
26
+
27
+ ##
28
+ # Establishes a database connection.
29
+ #
30
+ # @param [String] path
31
+ # The path to a SQLite3 database file.
32
+ #
33
+ # @return [void]
34
+ def self.establish_connection(path:)
35
+ ActiveRecord::Base.establish_connection(
36
+ adapter: "sqlite3",
37
+ database: path,
38
+ pool: 16
39
+ )
40
+ end
41
+
42
+ ##
43
+ # Prepares the parent directory of the database.
44
+ # @return [void]
45
+ # @api private
46
+ def self.prepare_dir
47
+ return if File.exist?(default_database)
48
+ mkdir_p(data_dir)
49
+ touch(default_database)
50
+ rescue => ex
51
+ warn "prepare_dir error: #{ex.message} (#{ex.class})"
52
+ end
53
+ private_class_method :prepare_dir
54
+ prepare_dir
55
+ end
@@ -0,0 +1,91 @@
1
+ """
2
+ Autogenerated return type of CompleteTask.
3
+ """
4
+ type CompleteTaskPayload {
5
+ errors: [String!]
6
+ ok: Boolean
7
+ }
8
+
9
+ """
10
+ Autogenerated return type of CreateTask.
11
+ """
12
+ type CreateTaskPayload {
13
+ errors: [String!]!
14
+ }
15
+
16
+ """
17
+ Autogenerated return type of DestroyTask.
18
+ """
19
+ type DestroyTaskPayload {
20
+ errors: [String!]
21
+ ok: Boolean
22
+ }
23
+
24
+ """
25
+ An ISO 8601-encoded datetime
26
+ """
27
+ scalar ISO8601DateTime @specifiedBy(url: "https://tools.ietf.org/html/rfc3339")
28
+
29
+ type Mutation {
30
+ completeTask(taskId: Int!): CompleteTaskPayload
31
+ createTask(input: TaskInput!): CreateTaskPayload
32
+ destroyTask(taskId: Int!): DestroyTaskPayload
33
+ setRandomProjectColor(projectId: Int!): SetRandomProjectColorPayload
34
+ updateTask(input: TaskInput!, taskId: Int!): UpdateTaskPayload
35
+ }
36
+
37
+ type Project {
38
+ color: String!
39
+ id: Int!
40
+ name: String!
41
+ path: String!
42
+ tasks: [Task!]!
43
+ }
44
+
45
+ type Query {
46
+ findTask(taskId: Int!): Task
47
+ projects: [Project!]!
48
+ tasks(projectId: Int, status: TaskStatus!): [Task!]!
49
+ }
50
+
51
+ """
52
+ Autogenerated return type of SetRandomProjectColor.
53
+ """
54
+ type SetRandomProjectColorPayload {
55
+ errors: [String!]!
56
+ project: Project
57
+ }
58
+
59
+ type Task {
60
+ content: String!
61
+ id: Int!
62
+ inProgress: Boolean!
63
+ isBacklogged: Boolean!
64
+ isComplete: Boolean!
65
+ isReady: Boolean!
66
+ project: Project!
67
+ status: TaskStatus!
68
+ title: String!
69
+ updatedAt: ISO8601DateTime!
70
+ }
71
+
72
+ input TaskInput {
73
+ content: String
74
+ projectId: Int
75
+ status: TaskStatus
76
+ title: String
77
+ }
78
+
79
+ enum TaskStatus {
80
+ backlog
81
+ complete
82
+ in_progress
83
+ ready
84
+ }
85
+
86
+ """
87
+ Autogenerated return type of UpdateTask.
88
+ """
89
+ type UpdateTaskPayload {
90
+ errors: [String!]!
91
+ }
@@ -0,0 +1,21 @@
1
+ # frozen_string_literal: true
2
+
3
+ Gem::Specification.new do |gem|
4
+ gem.name = "twenty-backend"
5
+ gem.authors = ["0x1eef"]
6
+ gem.email = ["0x1eef@protonmail.com"]
7
+ gem.homepage = "https://github.com/0x1eef/twenty#readme"
8
+ gem.version = "0.1.0"
9
+ gem.licenses = ["0BSD"]
10
+ gem.files = `git ls-files`.split($/)
11
+ gem.require_paths = ["lib"]
12
+ gem.summary = "twenty: backend"
13
+ gem.description = gem.summary
14
+ gem.add_runtime_dependency "activerecord", "~> 7.1"
15
+ gem.add_runtime_dependency "sqlite3", "~> 1.6"
16
+ gem.add_runtime_dependency "webrick", "~> 1.8"
17
+ gem.add_runtime_dependency "graphql", "~> 2.2"
18
+ gem.add_development_dependency "test-unit", "~> 3.5.7"
19
+ gem.add_development_dependency "standard", "~> 1.13"
20
+ gem.add_development_dependency "rake", "~> 13.1"
21
+ end
metadata ADDED
@@ -0,0 +1,175 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: twenty-backend
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - '0x1eef'
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2024-02-07 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: activerecord
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '7.1'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '7.1'
27
+ - !ruby/object:Gem::Dependency
28
+ name: sqlite3
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '1.6'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '1.6'
41
+ - !ruby/object:Gem::Dependency
42
+ name: webrick
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '1.8'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '1.8'
55
+ - !ruby/object:Gem::Dependency
56
+ name: graphql
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '2.2'
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '2.2'
69
+ - !ruby/object:Gem::Dependency
70
+ name: test-unit
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: 3.5.7
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: 3.5.7
83
+ - !ruby/object:Gem::Dependency
84
+ name: standard
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: '1.13'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - "~>"
95
+ - !ruby/object:Gem::Version
96
+ version: '1.13'
97
+ - !ruby/object:Gem::Dependency
98
+ name: rake
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - "~>"
102
+ - !ruby/object:Gem::Version
103
+ version: '13.1'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - "~>"
109
+ - !ruby/object:Gem::Version
110
+ version: '13.1'
111
+ description: 'twenty: backend'
112
+ email:
113
+ - 0x1eef@protonmail.com
114
+ executables: []
115
+ extensions: []
116
+ extra_rdoc_files: []
117
+ files:
118
+ - ".bundle/config"
119
+ - ".rubocop.yml"
120
+ - Gemfile
121
+ - Rakefile.rb
122
+ - lib/twenty-backend.rb
123
+ - lib/twenty-backend/graphql.rb
124
+ - lib/twenty-backend/graphql/input.rb
125
+ - lib/twenty-backend/graphql/input/task_input.rb
126
+ - lib/twenty-backend/graphql/mutation.rb
127
+ - lib/twenty-backend/graphql/mutation/complete_task.rb
128
+ - lib/twenty-backend/graphql/mutation/create_task.rb
129
+ - lib/twenty-backend/graphql/mutation/destroy_task.rb
130
+ - lib/twenty-backend/graphql/mutation/set_random_project_color.rb
131
+ - lib/twenty-backend/graphql/mutation/update_task.rb
132
+ - lib/twenty-backend/graphql/schema.rb
133
+ - lib/twenty-backend/graphql/type.rb
134
+ - lib/twenty-backend/graphql/type/mutation.rb
135
+ - lib/twenty-backend/graphql/type/project.rb
136
+ - lib/twenty-backend/graphql/type/query.rb
137
+ - lib/twenty-backend/graphql/type/task.rb
138
+ - lib/twenty-backend/graphql/type/task_status.rb
139
+ - lib/twenty-backend/migration.rb
140
+ - lib/twenty-backend/migration/1_create_projects.rb
141
+ - lib/twenty-backend/migration/2_create_tasks.rb
142
+ - lib/twenty-backend/migration/3_add_color_to_projects.rb
143
+ - lib/twenty-backend/model.rb
144
+ - lib/twenty-backend/model/mixin/colorable_mixin.rb
145
+ - lib/twenty-backend/model/project.rb
146
+ - lib/twenty-backend/model/task.rb
147
+ - lib/twenty-backend/servlet.rb
148
+ - lib/twenty-backend/servlet/graphql.rb
149
+ - lib/twenty-backend/servlet/mixin/server_mixin.rb
150
+ - share/twenty-backend/schema.graphql
151
+ - twenty-backend.gemspec
152
+ homepage: https://github.com/0x1eef/twenty#readme
153
+ licenses:
154
+ - 0BSD
155
+ metadata: {}
156
+ post_install_message:
157
+ rdoc_options: []
158
+ require_paths:
159
+ - lib
160
+ required_ruby_version: !ruby/object:Gem::Requirement
161
+ requirements:
162
+ - - ">="
163
+ - !ruby/object:Gem::Version
164
+ version: '0'
165
+ required_rubygems_version: !ruby/object:Gem::Requirement
166
+ requirements:
167
+ - - ">="
168
+ - !ruby/object:Gem::Version
169
+ version: '0'
170
+ requirements: []
171
+ rubygems_version: 3.4.19
172
+ signing_key:
173
+ specification_version: 4
174
+ summary: 'twenty: backend'
175
+ test_files: []